JAVA ile programlama Beta Version 4.0 BY Ahmet Tolga Tat Sayfa 1 Aciklama Bu dökümanlarin hazirlanis amaci Java ögrenmek isteyenlere yardimci olmak icindir.Bu dökümanlar tek basina kaynak olarak kullanilamaz.Kitap icersinde bir cok yazim hatasi vardir ve kitap hic bir ticari amac icin kullanilamaz. Zamanim oldukca JDBC,Corba,RMI,XML JSP ve EJB konularina daha cok döküman hazirlayacagim.Kitap icersindeki hatalar icin bana mail atabilirsiniz. E-Mail:webmaster@turksoft.8m.com Icindekiler Java’yi taniyalim............................................................................................................................5 Java nedir? .....................................................................................................................................................................................5 Özellikler .......................................................................................................................................................................................5 Geliºtirme & Uygulama ..............................................................................................................................................................9 Java Virtual Machine (JVM)....................................................................................................................................................11 JDK Kurulumu ...........................................................................................................................................................................12 Java’ya giris .................................................................................................................................15 Ýlk Java uygulamamiz................................................................................................................................................................15 Java’da girdi ve Cikti islemleri(I/O).......................................................................................................................................20 Java’nin temel yapisi.................................................................................................................................................................22 Degiskenler ve Türler..................................................................................................................24 Tamsayilar...................................................................................................................................................................................24 Karakterler(Characters).............................................................................................................................................................25 Virgüllü sayilar(floating points)..............................................................................................................................................25 Mantiksal degerler(booleans)...................................................................................................................................................26 Strings islemleri..........................................................................................................................................................................26 String Manipulasyonu...............................................................................................................................................................29 StringBuffer Nesnesi.................................................................................................................................................................30 Deðiþkenlerin Ýlk Deðerleri......................................................................................................................................................31 Diziler(Arrays)............................................................................................................................................................................32 Java’da operatörler .....................................................................................................................34 Artýrma ve Eksiltme ...................................................................................................................................................................34 Karþýlaþtýrmalar ..........................................................................................................................................................................34 Deðer Atamalar..........................................................................................................................................................................35 Operatör öncelik tablosu...........................................................................................................................................................35 Özel Karakterler .........................................................................................................................................................................35 Java’da kontrol ............................................................................................................................37 If,else kaliplari............................................................................................................................................................................37 Koºul kalibi.................................................................................................................................................................................38 Switch kalibi...............................................................................................................................................................................38 Break ve Continue komutlarý ..................................................................................................................................................42 Döngü kaliplari...........................................................................................................................................................................45 for döngüleri................................................................................................................................................................................45 while döngüleri ...........................................................................................................................................................................47 do-while döngüleri .....................................................................................................................................................................48 Nesneye yönelik ............................................................................................................................51 BY Ahmet Tolga Tat Sayfa 2 Class(sinif) nedir? ......................................................................................................................................................................51 Sýnýf Olusturma ..........................................................................................................................................................................52 Sýnýf Tanýmlanmasý....................................................................................................................................................................53 Üye degiskenlerinin tanimlanmasi..........................................................................................................................................56 Method Tanimlanmalari............................................................................................................................................................58 Kalitim Nedir? ............................................................................................................................................................................64 Methodlarý Yenilendirmek.......................................................................................................................................................66 Nesne(Object) Nedir ve Ne ise yarar? ....................................................................................................................................67 Mesajlar .......................................................................................................................................................................................68 Java’da çöp toplama(Garbaje Collection)..............................................................................................................................69 Java’da alt sinif ve miras(Inheritance)....................................................................................................................................69 Java’da öne geçme ve aþiri yükleme ......................................................................................................................................71 This & Super...............................................................................................................................................................................71 Tanimsiz siniflar(Abstract Classes)........................................................................................................................................72 Java’da ulaþim kontrolü ............................................................................................................................................................74 Static degiskenler ve Metodlar.................................................................................................................................................75 Java’da paketler(Packages) ......................................................................................................................................................75 Arayüzler(Interfaces).................................................................................................................................................................77 Exceptions...................................................................................................................................................................................77 Java’da hata idaresi....................................................................................................................................................................77 Multithreading .............................................................................................................................80 Giris ..............................................................................................................................................................................................80 Thread Nedir? .............................................................................................................................................................................81 Coklu Thread uygulamasi.........................................................................................................................................................82 Thread Öncelikleri ve Thread Zamanlamasi.........................................................................................................................84 Thread eszamanlama .................................................................................................................................................................86 Runnable Interface (Calistirilabilir Arayüz) ..........................................................................................................................92 Java Utilities.................................................................................................................................95 Vector Class'i ve Enumeration Özelligi .................................................................................................................................95 Stack Class'i ................................................................................................................................................................................99 Hashtable Class'i ..................................................................................................................................................................... 102 Properties Class’i..................................................................................................................................................................... 105 Random Class'i ........................................................................................................................................................................ 105 Bit Islemleri ve Bitwise Islemcileri...................................................................................................................................... 106 BitSet Class'i ............................................................................................................................................................................ 110 Exception Handling ...................................................................................................................113 Java’da hata yakalamanin temelleri..................................................................................................................................... 113 Exception cesitleri................................................................................................................................................................... 114 Exception handling’deki blok tanimlari ............................................................................................................................. 115 Yeni Exception siniflari yapma ............................................................................................................................................ 118 Java Metodlari ...........................................................................................................................121 Java 'da Program Modulleri................................................................................................................................................... 121 Metodlar.................................................................................................................................................................................... 122 Rastgele Sayi Türetme ........................................................................................................................................................... 124 Recursion ve Iterasyon........................................................................................................................................................... 127 Method Overloading............................................................................................................................................................... 127 Applet Siniflarinin Metodlari ................................................................................................................................................ 128 Java Lang ...................................................................................................................................129 java.lang.Math ......................................................................................................................................................................... 129 java.lang.Character ................................................................................................................................................................. 130 java.lang.Integer...................................................................................................................................................................... 131 java.lang.Float.......................................................................................................................................................................... 132 java.lang.String........................................................................................................................................................................ 133 java.lang.StringBuffer ............................................................................................................................................................ 135 Java AWT ...................................................................................................................................137 Frame ......................................................................................................................................................................................... 137 Panel.......................................................................................................................................................................................... 138 Düzenleme Menejeri(layout manager) ................................................................................................................................ 139 BY Ahmet Tolga Tat Sayfa 3 FlowLayout Manager............................................................................................................................................................. 139 Border Layouts(Kenar Çizgi Layoutlarý)............................................................................................................................ 140 Grid ve Grid Bag Layout ....................................................................................................................................................... 142 Insets(kümeler)........................................................................................................................................................................ 143 Button........................................................................................................................................................................................ 143 Checkbox.................................................................................................................................................................................. 145 Radio Buttons.......................................................................................................................................................................... 146 Menu’ler ................................................................................................................................................................................... 147 Choice menus........................................................................................................................................................................... 147 Text Fields................................................................................................................................................................................ 150 Java Applet.................................................................................................................................162 Java Applet Temelleri ............................................................................................................................................................ 162 Multimedia ............................................................................................................................................................................... 164 Audio Kullanýmý Metotlarý.................................................................................................................................................... 165 Çift Grafik Tamponlama........................................................................................................................................................ 169 Ses Parçalarý Yükleme ve Çalma ......................................................................................................................................... 176 Imge Haritalarý......................................................................................................................................................................... 177 Java Swing ..................................................................................................................................179 JFrame ....................................................................................................................................................................................... 179 Look and Feel .......................................................................................................................................................................... 182 JLabel........................................................................................................................................................................................ 182 JButton...................................................................................................................................................................................... 183 JPanel ........................................................................................................................................................................................ 185 Internal Frames ........................................................................................................................................................................ 187 JToolBar ................................................................................................................................................................................... 187 JLists.......................................................................................................................................................................................... 188 JTree .......................................................................................................................................................................................... 191 Alert Dialogs (JOptionPane)................................................................................................................................................. 193 JPassword ................................................................................................................................................................................. 199 JComboBox.............................................................................................................................................................................. 200 JTable ........................................................................................................................................................................................ 201 JScroll........................................................................................................................................................................................ 204 Networking .................................................................................................................................206 Socket programlama ............................................................................................................................................................... 206 JDBC...........................................................................................................................................221 JDBC nedir? ............................................................................................................................................................................. 221 Corba ..........................................................................................................................................226 Corba nedir? ............................................................................................................................................................................. 226 Kaynakca ....................................................................................................................................230 BY Ahmet Tolga Tat Sayfa 4 Java’yi taniyalim Java nedir? Java programlama dilini ve onun çevresel gelisimini açiklayan bir dizi makale ile baslar.Birinci amaç olarak ,dilin tarihi hakkinda yayimlardan, mikrodalgalar ve çamasir makinelerinden... uzak duracagim.( Eger aranizda bunlardan herhangi biri ile ilgilenen varsa bunlari çoklu kütüphanelerden hatta literatürden bulabilir.) Ayni Zamanda kocaman burunlu, üçgen vücutlu ve ellerini marimba'nin ritmine göre sallayan ,bana eski Amerikan bilim kurgu filmlerini hatirlatan Duke ' tan da (Java'nin maskotu) uzak duracagim. Java fenomeni de zamaninda geçici popülerlik tanidi.Her seviyedeki bilgisayar magazini bunun hakk?nda yazd? , Java apletlerini geliitirmek üzere ürün satan birçok yazilim firmasi var ve çok az web sitesi Java apleti içermiyor. Bu seriler aras?nda mümkün oldu?u kadar , aslinda temel isler için basit fakat ustalikli kullanim için hayli karisik ve zor olan bu programlama dilini derinlemesine incelemeye ve ögrenmeye çalisacagim. Bu ilk birkaç makale ile amac?m?z genel olarak dile bir tanimlama saglamak böylece daha sonra apletler,a?- ili?kili planlar, JDBC,vb. gibi konular?n derinine inebiliriz. Sunu belirtmeliyim ki Java genel amaçli bir dildir,bunu yapmada oldukça popüler olmasina ragmen sadece web sayfalarina aplet yazmak için kullanilmak üzere yapilmistir.. Java'nin sadece görünüsüne takilamayz çünkü java apletlerinden çok daha ilginç bir çok alternatifi vardir. Özellikler Java Sun Microsystem 1991'de James Gosling, Patrick Naughton, Chis Warth, Ed Frank ve Mike Sherindan tarafindan olusturuldu. 1992 ve 1995 arasinda Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm ilk prototipin olgunlasmasi üzerine isbirligi yaptilar. Tarihler gösteriyorki Java WWW (We Want Womens J)'den önce ya da en azindan onunla eszamanli olusturulmustur . Java'nin yapisi C'ye oldukça benzemektedir ve obje agirlikli karakteristikleri de ayni zamanda C++ 'a benzemektedir. Java uygun ve mantik çerçevesinde birbirini tutan bir programlama dilidir. C ve C++ arasindaki benzerlikler, Java'nin C++ '?n internet için bir versiyonu oldu?u izlenimini verebilir, fakat önemli teorik ve pratik farkliliklar vardir. Java özellikle C++ ile karsilastirilan obje kökenli parametreleri düzeltir ve aritir. Internet Java'yi ortaya atti ve herkesin bildigi bir dil haline getirdi ve eszamanli olarak Java, siberuzayda ücretsiz edinilebilen objeler dizisini geni?letti?inden beri ?nternette derin etki yapdi. • Basit Java dili text tabanlý bir proglama dilinin taþýdýðý fonksiyonelliði, gücü aynen taþýr fakat bunun yanýnda karmaþýk bir yapýya sahip deðildir. Temel olarak son derece basit bir yapýsý vardýr. BY Ahmet Tolga Tat Sayfa 5 Günümüzdeki C ve C++ dilleri temel alýnarak dizayn edilen Java dili kolay ve hýzlý öðrenilebilen ve kullanabilen bir programlama dilidir. Java dili objesel bir dildir, fakat C++ gibi diðer objesel diller deki bazý hata veya gereksizliklerden arýnmýþtýr. Dilin spesifikasyonu son derece küçük tutulmuþ ve programcýya kolaylýklar saðlanmýþtýr. Ve örneðin Garabage Collection gibi çok yararlý yeni özelliklerde eklemiþtir. Mesela C veya C++ daki karmaþýk pointer kavramý, gereksiz bir deðiþken olan struct, typedef, # dejine ve hafýzayý temizleme mantýðý uygulanmamýþtýr. Bunlarda zaten neredeyse programcýlýkta olan bug’larýn yüzde ellisinden kurtulmak demektir. • Nesneye Yönelik Java dili C++ daki temel nesne yapýsýný korumaktadýr hatta buna bazý yenilikler getirmiþtir. Hatta basitlik kavramý için bazý özelliklerde kaldýrýlmýþtýr. Java dilinde veriler ve deðiþkenler dahil her þeye nesne olarak yaklaþýlýr. • Daðýtýk Internet ve að çaðýnýn bir þartý olarak Java dilinin kendi TCP/IP yetenekleri ve hazýr fonksiyonlarý vardýr. Günümüzün popüler protokolleri HTTP ve FTP rutinleri bile Java’nýn kütüphanelerinde hazýrdýr. Bunlarda bize að üstünden bilgiye ulaþýrken sanki lokal bir dosyaya eriþircesine rahat kodlama yapmamýzý saðlar.Java’nin dagitik programlanmasi sayesinde Client/Server programlari gelistirilebilir. • Düzgün Java dili gerek derleme gerekse de çalýþtýrma sýrasýnda bir çok hatayý kontrol eder. Deðiþken tiplerini kontrol etme, hafýzanýn temizlenmesi (Garbage Collection), Null Pointer ve Array (Dizi) uzunluðu kontrolü ve de Exceptions gibi. • Platform Baðýmsýz Yine Java dilini að yapýlarýnýn vazgeçilmez bir parçasý yapmak için; Java derleyici programýnýzý derlediði zaman kaynak kodumuzu, yapýdan baðýmsýz nesnesel bir dosya formatýna çevirir. Buna Java bytecodes diyoruz. Java Runtime sistemini bulunduran makineler bu bytecode’larý çalýþtýrabilir. Þu an günümüzde bir çok sistem için Java Runtime Environment (JRE) bulunmaktadýr. Mimari-baðýmsýz: Java programlarý derlendikleri zaman byte-kod oluþturduklarý için, Java'yý destekleyen tüm platformlarda çalýþabilmektedirler. Bir Java programýnýn yeni bir makinaya taþýndýðýnda tekrardan derlenmesine gerek yoktur. Java dili tüm bilgisayar sistemlerinde aynýdýr. Örneðin basit veri tipleri adýný verdiðimiz integer bir sayý her zaman 32 bit, long ise 64 bit olarak gösterilmektedir. Diðer dillerde ise bu durum böyle deðildir, derleyiciden derleyiciye bu veri tiplerinin gösterimi deðiþiktir. Özetle Java kaynak kod derlenince bytecode’lar oluºur. Bytecode’lar sanal bir makine olan Java Virtual Machine’de (JVM) çalýþtýðý varsayýlýr ve iþlemde makineye baðýmlý bir çalýþma aný hata ayýklayýcýsý yani bir tercümanla olur. Bu JVM mantýðýyla hareket eden programa Java Interpreter diyoruz. JVM, yazýlým ile gerçek bir makinede emüle edilen sanal bir makinedir. Bu sanal makine için kullanýlan kodlar iþte .class dosyalarýnda duran bytecode’lardýr. Her yazýlan Java kaynak kodu derlenirken iþte bu ortak sanal makine için derlenir. Bu makinenin belirli komut setleri (týpký BY Ahmet Tolga Tat Sayfa 6 gerçek bir CPU’nun olduðu gibi) hafýza alanlarý, stack’i vardýr. Ýþte bu mantýk Java’nýn platform baðýmsýzlýðý yaratýr. Ve iþte hangi gerçek makinede bir yazýlým ile sanal bir JVM yaratýlýrsa o makinede Java ile yazýlmýþ program çalýþabilir. • Güvenli Java dili Pointerlarýn kullanýcýdan kullanýmýný almak, hafýza adreslemeyi sadece çalýþtýrma sýrasýnda yapmak gibi kavramlarla güvenliði geliþtirmiþtir. Bunun yaný sýra Java Interpreter da JVM kodlarýnýn yüklenmesi ve yoklanmasý sýrasýnda çok çeþitli güvenlik unsurlarý barýndýrmaktadýr. Java Interpreter’ýn (tercüman) üç ana görevi vardýr. § Kodu yüklemek § Kodu kontrol etmek § Kodu çalýþtýrmak Kodu yükleme aþamasýný Class Loader yani sýnýf yükleyici halleder. Bu aþamada programýn çalýþmasý için gerekli tüm class’lar (sýnýflar) çaðrýlmaya baþlanýr, fakat mutlaka yerel olarak mý yoksa uzak uçtan yani að kaynaklarýndan mý aldýðýný tutar. Buda çok önemli bir problem olan Truva Atý uygulamalarýn önünü keser çünkü her zaman önce lokal yüklü ve hazýr class’lar çek edilir.Hafýzada yer seçimi Interpreter tarafýndan yapýldýðý için iþletim sistemine kayma gibi sorunlar ortadan kalkar. Ayrýca kodun kontrolü sýrasýnda Interpreter bir çok hatayý kontrol eder. Genel olarak bytecode’larýn JVM için uygun olup olmadýðýný kontrol eder. • Taþýnabilir Temel taþýnabilirlik olan platform baðýmsýzlýðý, tema olarak makinelerin iþleyiþ tarzý ve donanýmýnýn farklý olduðu ortamlarda da ayný kodu çalýþtýrabilmektir. Fakat ek unsurlarda söz konusudur, her ayný ortam için tüm kavramlar aynýdýr. Hepsinde Int (integer) kavramý ve boyutu aynýdýr. Hepsinde grafiksel kullanýcý arabirimi için Java’nýn kendi grafiksel arabirim kiti kullanýlmaktadýr. Bunun adý Abstract Windowing Toolkit (AWT)’dir. • Performans Ýþte belki de Java dilinin zorlandýðý tek nokta. Performans denince tabii ki süre kavramý ön plana çýkýyor yani Java derleyicisinin ve Java Interpreter’in hýzý. Derleyicinin özellikle C++’a göre biraz daha yavaþ olduðu kesin fakat daha fazla görevi olduðunu ve ek avantajlar getirdiði için kabul edilebilir. Java Interpreter ise yani esasýnda bunu Java programlarýnýn çalýþma hýzý þeklinde de yorumlayabiliriz; C++’a göre ilk zamanlar da bayaðý yavaþtý. Zaten bu beklenen bir olaydý çünkü C ile yazýlmýþ program direkt CPU ‘da çalýþmaya baþlarken, önce Java Interpreter yani tercüman kendi açýlýyor daha sonrada aldýðý her kodu tercüme edip CPU’da gerekli iºlemi yapýyor. Fakat Java Interpreter’inin son sürümü ilk versiyonundan yüzde elli daha hýzlýdýr, bu da demektir ki Java’yý hýzlandýrma çalýþmalarý devam ediyor. Hýz için bir çözüm de Java Runtime Compiler, yani Java kaynak kodumuzu derlediðinizde onu bytecode’a deðil de direkt makine koduna çeviriyor. Ama tabii böyle bir seçimde platform baðýmsýzlýðýndan vazgeçmiþ bulunuyorsunuz. BY Ahmet Tolga Tat Sayfa 7 • Küçük Bir programlama dili olarak Java diðerlerine kýyasla oldukça küçüktür. 4 MB’lýk RAM'e sahip tüm sistemlerde çalýþmaktadýr. Java yorumlayýcýsý 500-600 KBlýk yer kaplamaktadýr. • Saðlam PClerde çalýþan herkes, durup dururken sistemin nedensiz bir þekilde göçtüðüne þahit olmuþlar ve bu yüzden emek verilen bir sürü çalýþmanýn boþa gittiðini görmü ºlerdir. Java sistemi, belleðe her eriþim esnasýnda belleðin bu bölgesini kontrol eder ve geçerli bellek alaný olup olmadýðýný kontrol eder. Java programlarýnda 'bug' lar oluþsa bile 'exception handler' larla problemin nerede olduðunu bildirir düzeltmeye çalýþýr. Java bellekðin yalnýz kendisine izin verilen alanýnda çalýþabilir. • Hizli! Java programlama dili C'den daha yavaº bir dildir.Fakat Just- in-Time(JIT) Compiler sayesinde java C/C++ gibi dillerle es degerdedir. Bu derleyici ile Java artýk yorumlanan bir dilin yavaþlýðýný býrakýp alýþýlagelmiþ derlenen dillerin hýzýna kavuþmasý beklenmektedir. Java C++ C Assembler Makine Dili(0ve1) Hizlilik bakimindan bakildiginda Java en üstte yani en yavas olan dillerden bir tanesidir. • Multi Threaded(Paralel kullanim) Büyük Ana programýn alt parçacýklarý olan ve ondan baðýmsýz hareket eden çocuk programcýklara thread diyoruz. Bunun destekleyen dile de Multi Threaded diyoruz. Java bu özelliði desteklemesinin yaný sýra C ve C++’a göre threadler çok daha düzgün, sade ve temiz bir yapýya sahiptirler. Sonuçta threadlerin kullanýldýðý bir program, ayný anda birden fazla aktiviteye izin verir. Meselâ neredeyse tüm chat (sohbet) programlarý multi threaded’dýr. Çünkü arkadaþýnýzdan mesaj gelirken sizi yazý yazabilirsiniz. Fakat unutmamak lazým bu özellik iºletim sisteminize de baðlýdýr. BY Ahmet Tolga Tat Sayfa 8 • Tek-kalýtlý Java, tek-kalýtlý (single inheritence) sýnýf yapýlarýný destekler. Bazý diller çoklu-kalýt sýnýflarýný desteklemektedir, ancak bu yazýlan programlarýn çok karmaþýk ve çözülmesi zor olmalarýna neden olmaktadýr. Ayný zamanda arayüzleri (interface) desteklemektedir. Bunlara abstract sýnýf adý verilmektedir. Bu tip sýnýflar, programcýlara, metotlarýn nasýl uygulanacaðýnýn sonradan belirleneceði sýnýflar yaratýlmasýna izin verir. Bir sýnýf, birden fazla arayüz oluºturabilmektedir. Böylelikle gerçek çoklu-kalýt ortamlarý kolaylýkla saðlanmýþ olmaktadýr. • Byte-Coded Byte-kodlar diðer makinalarýn komut setlerine benzerler, yalnýz tek bir makinaya tabi deðildirler ve içlerinde kendi veri tiplerini onaylayan ek tip bilgilerini içerirler. Java uyumlu web tarayýcýlarý diðer ortamlarda yaratýlan form/grafik/resim gibi objelere nasýl görürlerse, Java appletlerinide ayný þekilde görürler. Java byte-kodlarýndan oluþan byte-kodlar tarayýcýnýn kaynak kodu içine gömülürler. Bu aþamadan sonra ilk önce onaylanýrlar, sonra da çalýþtýrýlýrlar. • Dinamik Java dili nesne teknolojisinden elden geldiðince yararlanýr bu yüzden derleme sýrasýnda programýmýzda kullandýðýmýz modüller onunla birleþmeyecektir. Sadece çalýþma sýrasýnda dýþarýdan çaðrýlacaktýr. Bu sayede yeni veya geliþtirilen temel kütüphanelere programýmýz hemen adapte olacaktýr. Bu temel kütüphanelere yani class’lara API (Application Programming Interface) paketleri diyoruz. Bu dinamikliðin bir yönü de çalýþma sýrasýnda dýþarýdan ihtiyaç duyduðumuz bir parçayý hiç zorlamadan að üstünden alabilmedir. • Java ve Web Bilindiði gibi Web sayfalarý ne kadar canlý gözükürlerse gözüksünler, ses veya animasyonlarda olsa sonuç olarak aktif yani çalýþan bir yapýya sahip deðildirler. Ýþte Java’nýn özellikle Web için tasarlanan Applet yapýsý buna bir alternatiftir. Bir web sayfasý üstünde bulunan ve tarayýcý tarafýndan çalýþtýrýlýp interaktif olan Java programlarýna Applet diyoruz. Geliºtirme & Uygulama Sun tarafýndan geliþtirilen ve Java’nýn derlenmesini ve geliþtirmesini saðlayan programlar grubuna veya ortamýna JDK (Java Development Kit) denir. Bugün Sun dýþýndaki firmalar tarafýndan üretilen diðer grafiksel derleyiciler bile en alt planda bu temel derleyiciyi kullanýr. JDK text tabanlý komutlar grubudur. Genelde JDK’nýn versiyonu Java’nýn yani dilin kendisinin geliþmiþliðini gösterir. Ýlk zamanlarda JDK 1.0.x ler vardý. Fakat 1.0 dönemi çok sürmedi hemen sonra JDK 1.1.x ler çýktý. Bugün Javanýn yani JDK’nýn en son resmi sürümü JDK 1.1.6’dýr. Ama BY Ahmet Tolga Tat Sayfa 9 þu anda JDK 1.2 beta 4 bile Sun’ýn sitesinde bulunmaktadýr. Bütün bu süreç Java’ya verilen önemi göstermektedir. Sonuç itibarýyla Java ile yazýlmýþ programlarý iki grupta toplayabiliriz. Bir yalnýz baþýna çalýþabilen uygulamalar.(Applicatýons). Fakat bunlar için biliyorsunuz ki mutlaka bir Java ortamý bulunmak zorunda. Ýþte bu ortama JRE (JavaRuntime Environment) diyoruz. Esasýnda JDK bulunan her makinede Java programlarý çalýþabilir. Ama JRE, JDK’ya göre daha küçük ve ha fiftir ve kullanýcý amaçlý makinelere sadece onu yüklemek yeterli olacaktýr. Her yeni JDK versiyonu çýktýðýnda onun birde ayný JRE versiyonu çýkmaktadýr. Ýkinci tip Java uygulamalarý ise web sayfasý üzerinde çalýþan Applet’lerdir. Appletlerin çalýþabilmesi için çaðrýldýklarý tarayýcýnýn mutlaka Java desteði olmak zorundadýr. Hem kendi Java’da yazýlan hem de Applet kavramýný anlatabilmek için zorunlu olarak Sun tarafýndan üretilen Java destekleyen tarayýcý HotJava’dýr. Bugün son kullanýcý için pek popüler olmayan HotJava geliþtiriciler için önemlidir. Çünkü ayný firma tarafýndan yazýldýðý için Java’nýn son versiyonlarýna ilk uyum saðlayan tarayýcýdýr. Java ortaminin gelistirilmesi Daha önce belirtildigi gibi gelisme araçlari /bin dizininde yeralir : javac :Java kaynaklarini baytkodlarina çeviren java derleyicisi. java :Java yorumlayicisi . Java baytkodlarini çalistirir. jre : Java'ya benzer baska bir yorumlayici ,fakat kullanicilar için oldugu düsünülmesine ragmen tüm seçeneklerin kullanilir olmasi istenmemektedir. appletviewer: apletleri test eder veçalistirir. jdb: hata düzeltici javap: Java da derlenen baytkod dosyalarinin ayiricisi. javadoc : dökümantasyon jeneratörü , genel ve korunmus siniflari, arayüzleri , yapilari, methodlari ve alanlari tanimlayan HTML sayfalarini yarat?r.Ayni zamanda sinif hiyearasisini ve üyelerin içinde bulundugu indeksi yapar. javah : Java programlarinin bilinen metodlarina eklenen araç ( C de ) jar: Java siniflarini ve kaynaklarini bir Jar arsiv dosyasinda saklar . javakey : Dijital imzalari koruyan araç. updateAWT : bir basvurudaki AWT1.02 metodu ile degistirilen isimleri güncellestirir. Belli bir dizin yap?s? ile glitch' ler olmadan çalisirken /usr/local/JDK1.1.3/bin 'i PATH de?i?kenine ataman?z? tavsiye ederim .Eger kullan?labilen sistem geli?me çevresini daha geni? yapmak istiyorsan?z /etc/profile dosyas? içindeki Path degi?kenini kar??t?r?n. Karakteristikler Devam etmeden önce , kendimize Java nedir sorusunu sormamiz gerekir. Cevaplamak için JDK'nin elkitabinda yazdigi gibi Java'n?n bir programlama dili ve ayni zamanda bir platform oldugunu gözönünde bulundururuz. Bir programlama dili olarak Java asagidaki karakteristiklerle beraber yüksek seviyeli bir dildir. (ayni noktada onlari detayli olarak inceleyebiliriz ): Dikkatimizi çeken ilk sey Java'nin yorumlanmsi olmasidir.Java kaynaklarinin bir objeyi baytkodlar olarak yapmasi için bir önceki daha düsük seviyede ki derleyiciye ihtiyaci olmasina ragmen , degisik platformlarda yorumlanabilir . BY Ahmet Tolga Tat Sayfa 10 " Birkez yazip herzaman çalistirabildigimiz " Java baytkodlarina tesekkür ederiz. Java programlarini bir platformda derleyebilir ve JVM (Java Virtual Machine ) aracini içeren tamamen farkl? ba?ka bir yap?da çal??t?rabiliriz. Örne?in bir Java program? Windows NT platformunda derlenebilir ve bir Sun Ultra Solaris 'de veya bir Linux platformunda sorun olmadan çalisabilir . Genel olarak bir platform uygulamanin çalistigi bir donanim/yazilim ortamidir . Bununla beraber Java için bir platform çalistigi bir yazilim ortamidir . Her Java platformu bir donanim ortaminda çalismak zorundadir. Bir Java platformunun iki bölümü vardir : Java Virtual Machine (JVM) JVM , Java öncelikli derlenen programlarin çalistirildigi açik bir bilgisayardir.Küçük ve basit olarak dizayn edilmistir çünkü dü?ünülen onu her yere indirmektir . Bu basitlik onu tüm varolan platformlara ta??may? mümkün kiliyor , böylece hepsine ortak bir yazil?m sa?l?yor ve her kar???k a? sisteminde ( Internet gibi ) büyük ölçüde tasinabilirlik sorununu ortadan kaldirir.Hayal edilebildi?i gibi bu, durdurulamayan teknoloji için yaklasik bir nedendir. Bununla beraber sanal makine bir yaz?l?m tabakas? olarak görülmemelidir, fakat isminin belirtti?i gibi, bu dolu bir bilgisayar sistemi olmaya çalisiyor,yavas yavas gerçek Java makinelerini , kredi kartlari ,TV dekoderlerini ve benzerlerini destekleyen Java Çiplerini marketlerde görüyoruz . Uygulamali Program Arayüzü (API) API (Application Programmer's Interface), kýsaca Uygulama Programcýsýnýn (siz) kullanacaðý bütün function'larý (iþlevleri) içerir. Java'nin API 'si grafiker kullanici arayüzü (GUI ) gibi özellikleri destekleyen genis bir yazilim bile?enleri koleksiyonudur . Bunlar kütüphanelerde gruplandirilmistir. ( Java terminolojisini kullanan Java paketleri ).Bu paketler sayesinde çok bilinen web Apletlerinin yanisira, Java'yi daha birçok uygulamada kullanmak mümkündür.Web serverlarini dizayn etmek mümkündür, örnegin, vekiller, ileti serverlari, IRC serverlari, ve internet ile ilgili hayal edilebilecek herhangi birseyler...(JSP’ler gibi) API:paketlerini degisken gruplar içerisinde siniflandirabiliriz : Temel: objeler, matrisler, sayilar, girdi ve çikti , bilgi yapilari, sistemin özellikleri, tarih, zaman,vb. Appletler :Fonksiyon seti ve Java apleti yapmak için kullan?lan özellikler. Ag çalismasi:URL'ler, TCP, UDP, soketler, IP adresleme. Uluslararasilastirma : yerel tanimlamalara kolayca adapte olabilen kodlar yazmaya yardim eder ve yerel dilde görüntüle nir. Güvenlik:düsük ve yüksek seviye,dijital imzayi içerir, genel ve özel anahtarlar,kontrol ve sertifikaya giris. Yazilim Bölümleri: JavaBeans olarak bilinir. Veritabanlari: Çok sayida iliskili veritabanina girisi saglar . Ve daha neler neler.......J BY Ahmet Tolga Tat Sayfa 11 Bu ,Java programlama dilini ve onun çevresel gelisimini açiklayan bir dizi makale ile baslar.Birinci amaç olarak ,dilin tarihi hakkinda yayimlardan, mikrodalgalar ve çamasir makinelerinden... uzak duracagim.( Eger aranizda bunlardan herhangi biri ile ilgilenen varsa bunlar? çoklu kütüphanelerden hatta literatürden bulabilir.) Ayni Zamanda kocaman burunlu, üçgen vücutlu ve ellerini marimba'nin ritmine göre sallayan ,bana eski Amerikan bilim kurgu filmlerini hatirlatan Duke ' tan da (Java'nin maskotu) uzak duracagim. Java fenomeni de zaman?nda geçici popülerlik tasidi.Her seviyedeki bilgisayar magazini bunun hakk?nda yazd? ,Java apletlerini geli?tirmek üzere ürün satan birçok yaz?l?m firmas? var ve çok az web sitesi Java apleti içermiyor. Bu seriler arassnda mümkün oldugu kadar , aslinda temel isler için basit fakat ustal?kl? kullan?m için hayli karisik ve zor olan bu programlama dilini derinlemesine incelemeye ve ögrenmeye çalisacagim. Bu ilk birkaç makale ile amacimiz genel olarak dile bir tanimlama saglamak böylece daha sonra apletler,a?- iliskili planlar, JDBC, vb. gibi konularin derinine inebiliriz. sunu belirtmeliyim ki Java genel amaçli bir dildir,bunu yapmada oldukça popüler olmasina ragmen sadece web sayfalarina aplet yazmak için kullan? lmak üzere yapilmistir. Java'nin sadece görünüsüne takilamayiz çünkü java apletlerinden çok daha ilginç bir çok alternatifi vardir. Cünkü Java Applet’ler Javanin %5‘ni olusturur. JDK Kurulumu JDK nedir? Java ile geliºtirme (development) yapmak için Java Development Kit'e (JDK) ihtiyacýnýz var. Bu paket Java ile gelistirme yapmak için bütün araçlarý içeriyor.. Bu tool'lara editor (düzenleyici) dahil deðil. Piyasada bir çok GUI Java Editor'ý var. Bunlar genelde ücretli. Ayrýca oldukça güçlü bir makinede bile oldukça aðýr çalýþýrlar. Programýn nasýl çalýþtýðýna zaman harcayýp kafa patlatmanýz gerekir; üstelik, en önemlisi, kodun içine kendiliðinden bir sürü kod eklerler, bu da yazdýðýnýz kodu anlamamanýza yol açar. Bence bu gibi araçlar Java'ya yeni baþlamýþ olanlar için uygun deðil .Bana 'hangi Java editor'u tavsiye edersin' diye sorarsanýz,size aslýnda geliþmiþ bir text editor (metin düzenleyici) olan, fakat Java dahil bir çok dilde programlama yapmanýzda kolaylýk saðlayan EditPlus'u tavsiye ederim. JRE nedir? JRE (Java Runtime Enviroment) Java Virtual Machine, Java Platform çekirdek class'larýný ve destekleyici dosyalar gibi paketleri içerir. Yani development yapmak için gerekli olan derleyici (compiler), debugger gibi paketleri içermez. JRE zaten JDK'nýn içinde vardýr.Dolayýsýyla, JRE'yi indirmeniz GEREKMEZ. Böyle bir paketin oluþturulmasýnýn nedeni ise basit: Yazdýðýnýz ve derlediðiniz (compile) Java class'larýný herhangi baþka bir makinede çalýþtýrmak için bu pakete ihtiyacýnýz olabilir. 1- Dosyalarý Birleþtir. BY Ahmet Tolga Tat Sayfa 12 Eðer dosyalarý 1.44 MB'lýk 15 dosya olarak indirdiyesniz, öncelikle dosyalarý birleþtirmeniz gerekiyor. Eðer tek bir dosya halinde indirdiyseniz 2. bölüme geçiniz. Download ettiðiniz dosyalarýn isimleri: • jdk1_2_2-win-a.exe • jdk1_2_2-win-b.exe • jdk1_2_2-win-c.exe • jdk1_2_2-win-d.exe • jdk1_2_2-win-e.exe • jdk1_2_2-win- f.exe • jdk1_2_2-win- g.exe • jdk1_2_2-win- h.exe • jdk1_2_2-win- i.exe • jdk1_2_2-win-j.exe • jdk1_2_2-win-k.exe • jdk1_2_2-win- l.exe • jdk1_2_2-win- m.exe • jdk1_2_2-win- n.exe • jdk1_2_2-win-o.exe olmalý. Daha sonra jdk.bat'ý dowload edip yukarýdaki dosyalar ile ayný klasöre kopyalayýp üstüne çift týklayýn.Böylece tek, bütün bir dosya oluþmuþ oldu. Bunda sonra 2. bölüme geçebilirsiniz. 2 -Kuruluma baºla Kuruluma, aynen diðer Windows uygulamalarýnda olduðu gibi, jdk1_2_2-win.exe adlý dosyaya çift týklayarak baþlýyoruz. Ýlk gelen ekranda Next'e, daha sonraki ekranda ise Yes'e týklýyoruz. Daha sonra gelen ekranda kurulum yapacaðýmýz klasörü girmemizi istiyor. Bu deðeri deðiþtirebilirsiniz fakat daha ileride anlatacaðým bazý iþlemleri yapmada zorluklar yaºayabilirsiniz, normali olan c:\jdk1.2.2 kalmasý daha uygundur. Daha sonra gelen ekranda tüm seçenekleri seçtikten sonra Next'e týklayý Böylece kurulum baþlamýþ oldu. Birçok dosyayý kopyaladýktan sonra JRE kurulumu için tekrar bir ekran gelecek burada da Yes'e týklayýn. Daha sonra gelen ekranda dizini yine normalinde býrakýp Next'e týklayýn.Finish'e týklayýn. 3 - PATH ve CLASSPATH deðiþkenlerini ayarla Bunlar CLASSPATH ve PATH adýný verdiðimiz ortam deðiþkenleridir. PATH bildiðimiz çalýþan dosyalarý arama listesidir. Yazdýðýmýz Java komutlarýnýn herhangi bir yerde çalýþmasý için bulunduklarý yerleri PATH olarak gösterilmesi lazýmdýr. CLASSPATH ise derleme sýrasýnda gerekecek temel kütüphanelerin, classlarýn yani API’lerin bulunduðu yeri gösterir. Autoexec.bat dosyasýndaki þu iki satýr herþeyi halledicektir. Böylece dosya kopyalama iþlemi tamamlanmýþ oldu. Þimdi bize bazý kolaylýklar saðlamasý için makinenizin çevre deðiþkenlerinde bazý deðiþiklikler yapacaðýz. Bu kýsýmda oldukça dikkatli olmak gerekiyor. Önce sistem editörünü (system editor) çalýþtýrýyoruz. Start ondan sonra Run'a týklayýp, gelen alana sysedit yazýn, Enter'a basýn. Ýçinde bir çok pencere olan System editor çalýþmýþ oldu. BY Ahmet Tolga Tat Sayfa 13 Bu pencerelerden AUTOEXEC.BAT yazýlý olaný seçin. PATH ile baþlayan satýrý bulun. Bu satýrýn en sonuna ;C:\JDK1.2.2\BIN deðerini ekleyin. Örnek: PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\JDK1.2.2\BIN Not: Eðer Windows 98 kullanýyorsanýz, PATH ile baþlayan satýr olmayabilir. Bu durumda en alta aþaðýdaki satýrý ekleyin. PATH C:\JDK1.2.2\BIN Daha sonra ise en alta aþaðýdaki satýrý ekleyin SET CLASSPATH = .;c:\java Daha sonra File'dan Save'e týklayýp System editor'ý kapatýn. (NOT: Sistem editöründe baþka herhangi bir deðerle oynamak sistemin bir daha açýlmamasýna neden olabilir. PATH deðiþkenini aktif hale getirmek için Start | Run'a týklayýp gelen alana c:\autoexec.bat yazýp Enter'a basýn. Bir DOS Pencresi açýlacak gerekli iþlemleri yapacak. Yaptýðýndan emin olmak için bir DOS penceresi açýp(Start | Run a týklayýp gelen alana command yazýp entera basýn) path yazýp Enter'a basýn. Size path deðiþkeninin deðerlerini verecek. Bunlarýn arasýnda C:\JDK1.2.1\BIN'in olup olmadýðýný ve doðru yazýlýp yazýlmadýðýný kontrol edin. Bu iºlem bize C:\JDK1.2.1\BIN dizini altýndaki programlarý(java, javac vb.) hangi dizinde olursak olalým çalýþtýrabilme olanaðýný erecek. Ayrýca CLASSPATH deðiþkeni ise yazacaðýmýz programlarý çalýþtýrmamýzda yardýmcý olacak.Böylece kurulum tamamlanmýþ oldu. BY Ahmet Tolga Tat Sayfa 14 Java’ya giris (Girelim bakalim...) Ýlk Java uygulamamiz Daha önceden de bahsettiðimiz gibi Java ile diðer dillerde olduðu gibi sýradan uygulamalarda yazabiliyoruz. Aþaðýdaki kýsacýk programýn amacý, ekrana „Merhaba Dunya!“ karakter dizisini yazdýrmaktýr. Örnek: //Java’ya hosgeldiniz // ilk örnek java uygulamasý //Merheba Dunya class MerhebaDunya{ public static void main (String args [ ] ){ System.out.println („Merhaba Dunya“); } } Açýklama: Ýlk uç satýr yorum (comment) tabir ettiðimiz satýrlardýr.“//“ iþareti ile baþlayan satýrlar dikkate alýnmaz. Programcýnýn kendine veya grubuna hatýrlatmalarýdýr.Dördüncü satýr programýn adýnýn verildiði satýrdýr. Programýn kendisine de bir nesne gözüyle bakýldýðý için oda bir class olarak tanýmlanmýþtýr. Programýn kaynak kodunu kayýt ederken, bu ada .java uzantýsýný ekleyip kayýt etmelisiniz ve ayrýca derlendikten sonra bu isim .class isimli Java uygulamasý oluþacaktýr. En sondaki küme paranteziyle programýn baþladýðý görüyoruz. BY Ahmet Tolga Tat Sayfa 15 Beºinci satýrda Java Interpreter’ýnýn çalýþtýracaðý ilk ve ana metodu görüyoruz. Diðer dillerde olduðu gibi burda da main fonksiyonuna bir dizi karakterler atanacaktýr. Bu örnekte komut satýrýndan argüman beklemiyoruz ama eðer; Java MerhabaDunya arg1 arg2 gibi komut yazýp ana fonksiyona arg1 arg2 gibi karakterler gönderseydik bunlar string (karakterler) dizisi olarak tanýmlanmýþ olan arg deðiþkenine atanacaklardý. Public, main fonksiyonunun dýþ kullanýcýlara açýk olduðu ve buna Java InterPreter’ý da dahil herkes tarafýndan eriþebileceðimiz belirtilir. Static, main metodunun sadece bu uygulamaya ait olduðu ve bu uygulama nesneye yönelik tarzda baþka bir uygulamaya çaðrýldýðýnda deðiþtirilemeyeceðini gösterir. Hafýzada ne kadar kullanýlýrsa kullanýlsýn hep tek kopya tutar. Void, main metodun ekrana basma iþlemi dýþýnda hiçbir sonuç geri döndürmediðini gösterir. Sondaki küme paranteziyle main metodunu baþlatmýþ bulunuyoruz. System.out.println satiri ani zamanda System.out class’indeki yani sýnýfýndaki bir metodun yani println’in nasýl kullanýldýðýný gösterir. „Merheba Dunya“ yazýsýný standart çýkýþa yani ekrana yazdýrýr. Sondan bir önceki parantez main metodunu ve en sondakide class Merhaba Dunya yani programý kapatýr. Uygulamamýzý sýradan bir text editörle yapabiliriz. Önemli olan yazdýktan sonra onu MerhabaDunya.java olarak kaydetmemizdir. ªimdi javac komutuyla kaynak kodumuzu derleyebiliriz. javac MerhebaDunya.java Eðer bu iþlem hiçbir sonuç vermezse demek ki her þey sorunsuz ve de artýk ayný dizinde MerhabaDunya.class isimli bytecode dosyanýz bulunmaktadýr. Çok genel iki sorun çýkabilir. Javac komutunu yani dosyasýný bulamayabilir ki bu PATH sorunudur. Veya en basit API’leri yani classlarý bulamadýðýný bildirir, bu da CLASSPATH sorunudur. Uygulamamýzý çalýþtýrmak için komut satýrýna java komutuyla emir vermemiz yeterlidir. java MerhebaDunya BY Ahmet Tolga Tat Sayfa 16 Bu komutta ekrana; Merhaba Dunya karakter dizisini yazdýracaktýr. Ýlk Java Appleti Þimdiyse bir Web sayfasý üzerinde çalýþabilecek bir Java programý yani bir Applet yaza lým. Aþaðýda örnek appletimizi görüyorsunuz. /***********Merheba Dunya Java Applet’i***************************/ import java.awt.Graphics; import java.applet.Applet; public class MerhebaDunya extends Applet { public void paint (Graphics g) { g.drawString ("Merheba Dunya!",30,50); } } Birinci satirda program icin aciklama yaziyoruz. BY Ahmet Tolga Tat Sayfa 17 Sonraki iki satýrdaki import komutu sizin class’ýnýzda dýþarýdan kullanýlan class’larý mesela hazýr olan bazý API’leri almak veya çaðýrmak için kullanýlýr. Örneðin import edilen java.awt.Graphics class’ý çizim amaçlý kullanýlan bir sýnýftýr. Ve applet’imizle tarayýcý ekranýna yazý yazdýrmak için onu import edip daha sonra onun bir metodunu kullanýyoruz. Yine ayný þekilde yeni bir applet yaratýrken onun bir çok özelliðini daha doðrusu applet tarzýný zaten hazýr olan applet class’ýndan alýyoruz. Önce ondan türememiz için onu import ediyoruz. (import java.applet.Applet) Daha sonra da kendi class’ýmýz olan MerhabaDunya’ý extends komutuyla applet olarak türetiyoruz. Burada küme paranteziyle applet’in kendisi baþlýyor. Dokuzuncu satýrda applet’in hazýr bir fonksiyonu olan paint metoduna rastlýyoruz. Bu metod ekran çýktýsýyla ilgili olan ve az önce import ettiðimiz Graphics sýnýfýnda kullanýlan ve de üye diye tabir ettiðimiz yani extends ettiðimiz (türediðimiz) applet classýna ait olan temel bir metottur. Metot açýlýrken yazým olayýný azaltmak için Graphics g olarak tanýmlanýyor.Graphics sýnýfýna ait drawString adlý metotla ekrana „MerhebaDunya!“ yazdýrýyoruz. Önce paint metodunu daha da sonra applet’in kendisini parantezlerle kapatýyoruz. Uygulamamýzý bir text editörle yazdýktan sonra týpký uygulamalarda olduðu gibi onu java uzantýlý ve class’ta tanýmlanan isimle kaydediyoruz. Burada örneðimizi MerhebaDunya.java olarak kayýt edelim. Kayýt iþleminden sonra yine ayný þekilde kaynak kodumuzu derliyoruz. javac MerhebaDunya.java Fakat þimdi onu java komutu ile çalýþtýramayýz çünkü o bir uygulama deðil. Bu applet’imizi test için örnek bir web sayfasý yani HTML kodu üretmemiz lazým. HTML dilinde, ya zdigimiz Java Appletini sayfaya çaðýrmak için <applet> komutunu kullanýrýz. Aþaðýda örnek web sayfamýzý görebiliriz. <html> <head> <title> Merheba Dünya Applet‘i</title> </head> <body> <p> ilk java appletim <applet code=MerhebaDunya.class </applet> width=200 height=100> </body> </html> Yine standart bir text editörle(NotePad gibi) yazdýðýmýz bu dosyayý test.html olarak kayýt edelim. Java destekleyen herhangi bir tarayýcý ile lokal olarak bu sayfayý açtýðýmýzda applet’imizin sayfada çalýþtýðýný göreceksiniz. <applet> komutunda burada kullandýðýmýz „code“ parametresi BY Ahmet Tolga Tat Sayfa 18 çaðrýlacak Java Applet class’ýnýn adýný, width sayfadaki geniþliðini, height ise sayfadaki yüksekliðini verir. Yine JDK’nýn bir aracý olan Appletviewer da applet imizi incelemek için kullanýlabilir. Komut satýrýndan appletviewer test.html Komutu verildiðinde Appletviewer yukarida gördüðünüz gibi çalýþýp web sayfanýzýn içindeki sadece ama sadece applet’i gösterecektir. Örnek: //Asagidaki java Appleti oval seklinde "canim Türkiyem" yazar import java.awt.*; import java.applet.*; public class ovalyazi extends Applet { static final String message="Canim Türkiyem!"; private Font font; public void init() { font=new Font("Impact",Font.BOLD,48); } public void paint(Graphics g) { g.setColor(Color.white); g.fillOval(10,10,300,100); g.setColor(Color.blue); g.drawOval(10,10,330,100); g.drawOval(9,9,332,102); g.drawOval(8,8,334,104); g.drawOval(7,7,336,106); //Text kismi g.setColor(Color.blue); g.setFont(font); g.drawString(message,40,75); } } BY Ahmet Tolga Tat Sayfa 19 Java’da girdi ve Cikti islemleri(I/O) Cikti islemleri(Input) System.out akisina print ve println islevlerini kullanarak cikti gönderebiliriz. Örnegin; System.out.println(“Canim Türkiyem“); Yazarsak bilgisayarin ekranindan veya konsoldan Canim Türkiyemciktisini aliriz. görürüz.Eger ciktimizi ekrana yazdirdiktan sonra bir sonraki cikti icin alt satira gecmesini istemezsek print islevini kullaniriz. Örnegin; System.out.print“canim „); System.out.print(„Türkiyem“); Yazisini ekrana ayni satirda Canim türkiyem olarak yazar. Cikit islemlerinin paremetleri yalnizca tek bir dizigi oldugu gibi ,bir deyimde olabilir.eger deyimin sonuncunun türü string degile,ikti islevi cagrilmadan sonuc stringe cevrilir. Örnegin; system.out.print.ln(3); Komutu bir tamsayi olan 3 sayisini ilk önce bir dizgiye cevirir ve ekrana bu dizgi yazar.Ekranda 3 sayisini görürsünüz.Bazen bir cikti paremetresi asagidaki gibi olabilir. System.out.println(„Bu sayi dörttür:“+4); Bu komut 4 tamsayisini bir dizigiye cevirdikten sonra + birlestirme islemcisikullanarak,bu dizgiyi komuttaki dizgi ile birlestirir ve sunucu ekrana Bu sayi dörttür:4 yazar. Girdi islemleri(Output) Klavyeden bilgi girmek için BufferReader sinifi kullanilir.. BufferReader girdi=new BufferReader( new InputStreamReader(System.in)); Bu sinifin readLine() metodunu kullanarak bilgiyi aliyoruz : try { String giris=girdi.readLine(); } catch (IOException e ) { System.out.println(e); } try-catch blogu olasi bir hatayi yakalamak için kullaniliyor. Eger bir hata olusursa hatayi ekrana yazacak. BY Ahmet Tolga Tat Sayfa 20 Java programlama dilinde girdi islemleri biraz karisik bir konudur.Java’da klavyeden basit bir sekilde girdi alacak islevler yoktur. Asagidaki iki örnekte verilmis topla ve text programlari derlenip topla.class calistirildiginda islemi yapabilirsiniz. Örnek: import java.io.* ; import Text; class topla { public static void main (String args[]) throws IOException { int sayi1,sayi2; int toplam=0; // Text m=new Text(); System.out.println("Bir tamsayi giriniz: "); sayi1=m.readInt(); System.out.println("Bir tamsayi daha giriniz"); sayi2=m.readInt(); toplam=sayi1+sayi2; System.out.println("Toplam "+toplam); } } import java.io.*; class Text { static boolean iseof = false; static char c; static int i; static double d; static String s; static BufferedReader input = new BufferedReader ( new InputStreamReader(System.in)); public int readInt () { if (iseof) return 0; System.out.flush(); try { s = input.readLine(); } catch (IOException e) { System.exit(-1); } if (s==null) { iseof=true; return 0; } BY Ahmet Tolga Tat Sayfa 21 i = new Integer(s.trim()).intValue(); return i; } } Java’nin temel yapisi Java’nýn genel yapýsýnýn ilk etapta C veya C++’a çok benzediði fark edeceksiniz, ama zaten herhangi bir dilde programlama tecrübesi olanlara tüm yapýlar tanýdýk gelecektir. Genel olarak dikkat edilmesi gereken hususlardan en önemlisi Java büyük küçük harfe duyarlý bir dil olduðudur. • Yorumlar Üç deðiþik þekilde yorumlar koyabiliriz. // tek satýrda yorum /* tek veya daha fazla satýrda yorum*/ /** dokümantasyon yorumu */ Dokümantasyon yorumlarý bir deðiþken veya fonksiyon tanýmýndan hemen önce yerleºtirilmelidir; çünkü Javadoc yani otomatik doküman yaratýcý bu cümleleri hemen altta tanýmlanan unsurun tanýmý olarak alacaktýr. • Komutlar Bunlar Java programýndaki en küçük çalýþtýrýlan komut parçalarýdýr, he rþey olabilirler ve noktalý virgülle ( ; ) biterler. Int x; X= 5*100; • Ýfadeler Ýfadelerden kasýt tüm deðiþkenlere, sýnýflara, fonksiyonlara ve nesnelere verilen isimlerdir. Java dilinde bir ifade bir harfle, alt tireyle ( _ ) veya dolarla ( $ ) baºlayabilir. Devam eden karakterler rakam olabilir. Deðiþkenler tüm dilde de olduðu gibi büyük küçük harfe duyarlýdýrlar ve maksimum bir uzunluklarý yoktur. Geçerli ifadeler • araba12 • yas-toplamý • Yas-Toplamý • _toplam • $maaº BY Ahmet Tolga Tat Sayfa 22 Ve tabii ki Java diline ayrýlmýþ kelimeler ifade görevi alamazlar mesela bir deðiþken adý olamazlar. Bunlarýn listesi aþaðýdadýr. {PRIVATE}abstr act Boolean Break byte case catch char class const continue default if package this do double else extends false final finally float for implements import instanceof int interface long native new null private protected public return short static super switch synchronized throw throws transient True Try Void While BY Ahmet Tolga Tat Sayfa 23 Degiskenler ve Türler Javada temel beþ tip deðiþken vardýr. Ayrýca deðiþkenler bir class veya dizide olabilirler. § § § § Tamsayilar:byte,short,int ve long tam degerli sayilrdir. Virgüllü sayilar: float ve double virgüllü sayilardir. Karekterler:char sembolleri harfleri karakterlerle gösterir. Boolean degerler: boolean mantiksal degerleri gösteren özel türler. Tamsayilar Tam sayý deðiþkenlerdir ve kendi içinde dört gruba ayrýlýr. byte 8 bitlik yer kaplar.-128 den 127 araliginda deger alabilir. short 16 bitlik yer kaplar.-32768 ve 32767 araliginda deger alabilir. int 32 bitlik yer kaplar. –2.147.483.648 ve 2,147,483,647 araliginda deger alabilir. long 64 bitlik yer kaplar.cok büyük bir aragliga sahiptir. {PRIVATE}Tip boolean char byte short int Bit Büyüklüðü 1 16 8 16 32 long 64 float 32 BY Ahmet Tolga Tat Deðerler true veya false ‘\u0000’ dan ‘\uFFFF’ -128 dan +127 -32,768 dan +32,767 -2,147,483,648 dan +2,147,483,647 9,223,372,036,854,775,8 08 dan +9,223,372,036,854,775 ,807 -3,40292347E+38 dan +3,40292347E+38 Sayfa 24 Örnek: class ornek7 { public static void main(String args[]) { byte a=10*2; short b=50*20; int c=50000; long d=100*100; System.out.println("byte'in degeri="+ a); System.out.println("short'un(don’un) degeri="+ b); System.out.println("int'in degeri="+ c); System.out.println("long'un degeri="+ d); } } Karakterler(Characters) „char“ kelimesini bir karakter tanýmlamak için kullanýrýz. Karakter tek týrnak içine alýnmalýdýr. Bir char‘in araligi 0 ile 65536 arasindadir.Char türü isaretsiz 16 bitten olusur.Iki karekteri birlikte toplayabilirsiniz veya degiskenin degerini artirabilirsiniz. char a; char a1=‘a‘; char a2=‘\n‘; class ornek4 { public static void main(String args[]) { char c='a'; System.out.println("char c="+ c); } } Virgüllü sayilar(floating points) float 32 bitlik yer kaplar.Tam sonuc istendiginde kullanilir. Double 64 bitlik yer kaplar.Tüm Trigonometrik degerlerin hesaplanmasinda double degeri kullanilir. BY Ahmet Tolga Tat Sayfa 25 class ornek8 { public static void main(String args[]) { float f=3.1444444f; double b=3.488888888888888; System.out.println("float'in degeri="+ f); System.out.println("double'in degeri="+b); } } Mantiksal degerler(booleans) Boolean kosullu isletmenler (if,else,while ve do)tarafindan gereksinim duyulurlar.Mantýksal ifadeler iki tip deðer alabilir. true veya false Örnek: boolean a=true; Örnek: class ornek5 { public static void main(String args[]) { boolean a=true; System.out.println("boolean a="+ a); } } Strings islemleri Karakter dizilerini String kelimesi ile tanýmlarýz. „Ben bir stringim“ Stringdir.“Re Re Re Ra Ra Ra Galatasaray Galatasaray Cim Bom Bom „ bir Stringdir.“Fenerbahze Köyhizmetleri Fitbol idman culübü“ bir Stringdir.String agzindan cikan kelimelerdir. Java Stringleri String sinifindan turetilmis objeler olarak implemente eder.Stringlerin nesne olarak yapisinda tutulup islenmesi Java‘ya ustun özellikler saglar.Örnegin iki String’in BY Ahmet Tolga Tat Sayfa 26 karsilastirilmasi,String icersinden bir supstring’in cikarilmasi,büyük kücük harf cevrimi,iki sitringin birlestirilmesi gibi islemler kolayca gerceklestirilir. „Ben bir stringim“ Stringdir.“Re Re Re Ra Ra Ra Galatasaray Galatasaray Cim Bom Bom „ bir Stringdir.“Fenerbahze Köyhizmetleri Fitbol idman culübü“ bir Stringdir.String agzindan cikan kelimelerdir. String Fonksiyonlari: String s=new String() Bu ifade icinde karakter olmayan bir „s“ String#i olusturur. String(char chars[])Bir Array’i karaketer elemanlarini baslangic deger olarak alan bir String olusturabiliriz. Stiring Uzunlugu: Int Length() Örnek: class deneme { public static void main(String args[]) { char uzun[]={'a','b','c'}; String s=new String(uzun); System.out.println(s.length( )); } } String Literalleri Asagidaki s1 ve s2 esit Stringlerdir. class deneme1 { public static void main(String args[]) { char uzun[]={'a','b','c'}; String s1=new String(uzun); String s2="klm"; System.out.println("klm".length()); } } Stringleri Birlestirme: class gleich { public static void main(String args[]) { String slte="20"; String a="Ich bin " + 20 + " Jahre alt"; System.out.println(a); } BY Ahmet Tolga Tat Sayfa 27 } class solang { public static void main(String args[]) { String solang="Heyy baby "+"when I see you"+"my heart is jumping"+"uuuOOo Yeeeehhhh" +"this is a story " + "about me "+"hheheheh"; System.out.println(solang); } } Stringlerin diger tipler ile birlestirilmesi String s = "dort:" + 2 +2; System.out.println(s); // " dort: 22 " String s = "dort:" +( 2 +2 ); System.out.println(s); // " dort: 4 " Karakter Cikaran Fonksiyonlar CharAt( ) Char charAt( int where ) String icinde konumu belirtilen karakteri cikarir Char ch ; Ch = "abc".charAt( 1 ); // "b" degerini ch degiskenine atar. Getchars( ) Void getchars( int source start, int source end, char target[ ] , int target start ) Stringten verilen iki konum degeri arasinda bulunan substringi cikartir. Örnek: Class getcharornek { public static void main( ) { String s = "Bu gettchar fonksiyonuna ait bir ornektir."; int start=14; int end=27; Char buf[ ] = new char[end - start ]; s.getchars(start, end, buf, 0 ); System.out.println(buf); }} BY Ahmet Tolga Tat Sayfa 28 Stringlerin arastirilmasi Indexof( ) karakter veya substring'in string icinde gecen ilk konumunu verir. Lastindexof( ) karakter veya substring'in string icinde gecen son konumunu verir. Arastirilmaya nereden hangi konumdan baslanacagi bilgisi su form ile verilebilir. Int indexof( string s, int baslangic_indeksi ) Int lastindexof( string s, int baslangic_indeksi ) Örnek: class indexbak{ public static void main( ) { String s = "Korkma! Sonmez bu safaklarda yuzen al sancak " + "Sonmeden yurdumun ustunde tuten en son ocak."; System.out.println(s); System.out.println( "indexof(S) = " + s.indexof('S') ); System.out.println( "lastindexof(S) = " + s.lastindexof('S') ); System.out.println( "indexof(ak) = " + s.indexof("ak") ); System.out.println( "lastindexof(ak) = " + s.lastindexof("ak") ); System.out.println( "indexof(s,10) = " + s.indexof('s',10) ); System.out.println( "lastindexof(s,60) = " + s.lastindexof('s',60) ); System.out.println( "indexof(ak,10) = " + s.indexof("ak",10) ); System.out.println( "lastindexof(ak,60) = " + s.lastindexof("ak",60) ); } } String Manipulasyonu Concat( ) String concat( string s ) Iki stringi birlestirir. String s1 = "bir"; String s2 = s1.concat( "iki" ); // "biriki" stringini s2 degiskenine atar. Replase( ) string replase( char original, char replacement ) Stringteki bir karakteri baska bir karakter ile yerdegistirir. BY Ahmet Tolga Tat Sayfa 29 String s = "bakla".replace( 'b' , ' t ' ); // "takla"stringini s' e atar. valueof( ) fonksiyonu ile veri tipinin degistirilmesi valueof( ) metodu veriyi kendi formundan okunabilir bir forma donusturur. Static string valueof( double num ) Static string valueof( long num ) Static string valueof( object ob ) Static string valueof( char char[ ] ) String icindeki karakterlerin büyük / kücük harf cevrimi String toLowerCase( ) string icindeki buyuk hafleri kucuk harfe cevirir. String toLowerCase( ) string icindeki kucuk hafleri buyuk harfe cevirir. Örnek: class degis { public static void main(){ String s="Test edelim!"; System.out.println("bak:"+s); String upper=s.toUpperCase(); String upper=s.LowerCase(); System.out.println("UpperCase:"+upper); System.out.println("LowerCase:"+lower); } } StringBuffer Nesnesi StringBuffer stringlere daha fonksiyonel islevler kazandiran string sinifidir. StringBuffer genisleyebilir ve yazilabilir karakter dizileri olusturabilmeyi saglar. StringBuffer Yapici Fonksiyonlari StringBuffer( ) StringBuffer(int size ) StringBuffer(string s ) Örnek: class sitbuf{ public static void main( ) { Stringbuffer sb =new stringbuffer( "Hello"); BY Ahmet Tolga Tat Sayfa 30 System.out.println(" Buffer = " + sb ); System.out.println(" Length = " + sb.length( ) ); System.out.println(" capacity " + sb.capacity( ) ); }} EnsureCapacity ( ) StringBuffer constructer ile olusturulduktan sonra sting icin yer allocate etmek icin kullanilir. Void ensureCapacity(int capacity) //capacity buffer'in genisligini ifade eder. Setlength( ) StringBuffer icindeki stringin uzunlugunu belirler. Void setlength(int len) //len buffer'in uzunlugunu ifade eder. GetChars( ) StringBuffer icinden bir substring cekerek array'e aktarir. Void GetChar(int sourceStart,int sourceEnd, char target[ ], int targetStart) Append( ) StringBuffer Append(string s) StringBuffer Append(int num) StringBuffer Append(Object obj) Append( ) metodu diger tipteki datalar ile StringBuffer' daki stringin birlestirilmesini saglar. Insert( ) StringBuffer insert(int index, string s) StringBuffer insert(int index, char ch) StringBuffer insert(int index, object obj) Bir stringin digeri icine insert edilmesini saglar. Reverse( ) Reverse metodu kullanilarak StringBuffer icindeki stringin sahip oldugu karakterlerin sirasi ters cevrilebilir. StringBuffer reverse( ) Deðiþ kenlerin Ýlk Deðerleri Java da hiçbir deðiþken veya nesne referansý deðersiz baþlamaz. Hepsi tanýmladýklarý anda aþaðýdaki deðerleri alýrlar. byte 0 short 0 int 0 BY Ahmet Tolga Tat Sayfa 31 long float double char boolean Tüm Referanslar 0l 0.0f 0.0d ‘\u0000’ false null Tanýmlama ve Deðer atama int x,y; // tam sayý tanýmlama float z=5.12; // float tanýmlama ve deðer atama boolean tamam =true; // boolean tanýmlama ve deðer atama char c; // karakter tanýmlama String str1; // string tanýmlama String str2= „Lay Lay“; // string tanýmlama ve deðer atama c=’b’; // char deðiþkenine deðer atma str1=“Uzaylýyýz“; // String deðer atama x=6; // int deðiþkenine deðer atama y=2000; // int deðiþkenine deðer atama Diziler(Arrays) Benzer tür degiskenlerin olusturdugu bir grublara dizi denir:Dizilerin Java da önemli bir yeri vardir Her tipin dizisi tanýmlanabilir. char s[ ]; int x[ ]; int tablo [ ] [ ]; Dizi Yapma Java’da tüm diziler esasýnda birer nesnedir. Bu yüzden tanýmlandýktan sonra uzunluklarý verilerek yaratýlmalýdýr. (New yani nesne yapma komutu kullanýlarak) int tablo [ ] [ ]= new int [4] [5]; veya int tablo [ ] [ ]; tablo=new int[4] [5]; Aþaðýdakiler dizi yapma hatalarýdýr. Derleme sýrasýnda derleyici hata verecektir. Hata 1 int liste [40]; // taným sýrasýnda statik bir // dizi yaratmayýnýz. Hata 2 int liste [ ] ; // büyüklüðü belirtmeden liste [2]= 23; // bir diziye deðer atamayýz. BY Ahmet Tolga Tat Sayfa 32 Not:Dizilerin uzunluklarýný length metoduyla alabilirsiniz. int a [ ] [ ] = new int [8] [2]; a.length // deðeri 8 dur a [0].length // deðeri 2 tür. Bazen taným sýrasýnda deðer vererek de dizi uzunluðu tespit edebiliriz. String meyveler [ ]= {„çilek“,“kivi“,“kiraz“}; Esasýnda aþaðýdakinin aynýsýdýr. String meyveler [ ]; Meyveler = new string [3]; Meyveler [0]=“çilek“; Meyveler [1]=“kivi“; Meyveler [2]=“kiraz“; BY Ahmet Tolga Tat Sayfa 33 Java’da operatörler Java da 5 Temel operatörler (islemciler) vardýr. Java Operasyonu Toplama Çýkarma Çarpma Bölme Mod Alma Aritmetik Operatörü + * / % Matematiksel Ýfadesi f+7 p-c bm x/y r mod s Java Ýfadesi f+7 p–c b*m x/y r%s Artýrma ve Eksiltme Operatör ++ ++ --- Tanýmý Önce Arttýr Sonra Arttýr Önce Azalt Sonra Azalt Örnek Ýfade ++a a++ --b b-- Tanýmý a yý 1 arttýrýp iþlemde öyle kullan a yý iþlemde kullan sonra 1 arttýr b yý 1 azaltýp iþlemde öyle kullan b yý iþlemde kullan sonra 1 azalt Karþýlaþ týrmalar Standart Matematiksel Eþitlik ve Kýyaslama Operatörleri Eºitlik Operatörleri = Kýyaslama Operatörleri > < BY Ahmet Tolga Tat Java Eºitlik Kýyaslama Operatörleri ve Örnek Java Durumu Java Durumunun Açýklamasý == != x == y x != y x eºittir y x eþit deðildir y > < >= <= x>y x<y x >= y x <= y x büyüktür y x küçüktür y x büyük eºittir y x küçük eºittir y Sayfa 34 Deðer Atamalar Atama Örnek Operatörleri Ýfade int c = 3, d = 5, e = 4, f = 6, g = 12; += c += 7 -= d -= 4 *= e *= 5 /= f /= 3 %= g %= 9 Mantýksal And (Ve) Or (Veya) && || Tanýmý Sonuç c=c+7 d=d–4 e=e*5 f=f/3 g=g%9 10 to c 1 to d 20 to e 2 to f 3 to g Not (Deðil) ! Operatör öncelik tablosu {PRIVATE}Operatörler () ++ -- + - ( type ) */% +< <= > >= == != ?: = += -= /= %= Öncelik left to right right to left left to right left to right left to right left to right right to left right to left Tip parantez Bir iºlem Çarpan Toplam Karþýlaþtýrma Eºitlik Durumsal Atama Stringler + ile birleºir. System.out.println („Doktor “+isim) Ekranca „Doktor „ ve hemen yanýna ismin içeriðini basar. Özel Karakterler {PRIVATE}Öz Tanýmlarý el Karakterler \n Yeni Satýr Bir sonraki satýrýn baþýna geç \t Bir sonraki yatay Tab a geç BY Ahmet Tolga Tat Sayfa 35 \r \\ \‘ \„ Bulunduðun satýrýn baþýna geç Backslash basmak için kullanýlýr Tek týrnak basmak için kullanýlýr Çift týrnak basmak için kullanýlýr Bit Ýþlemleri {PRIVA AND TE}NO T ~ & OR XOR Sola Kaydýr Saða Kaydýr Sýfýrla Saða Kaydýr | ^ << >> >>> BY Ahmet Tolga Tat Sayfa 36 Java’da kontrol yapilari Hayatta karþýlaþtýðýmýz tüm problemlerin çözümünde de olduðu gibi, bilgisayar programýný yazacaðýmýz bir problemini de önce en iyi þekilde idrak edip, sonra iyi tasarlanmýþ bir çözüm oluþturulmalýyýz. Tüm bilgisayar programla ma dillerinde olduðu gibi, iyi tasarlanmýþ bir çözüme ulaþmak için, önce o bilgisayar programýndaki kontrol yapýlarý en iyi þekilde çalýþýlýp, anlaþýlmalýdýr. Bu bölümde kontrol yapýsý mantýðý ve Java programlama dilinde bulunan kontrol yapýlarýna çalýþacaðýz. If,else kaliplari if (boolean) { Komutlar; } else { Komutlar; } Örnek int sayý ; sayý = sayýAl () ; // programdaki bir metot if (sayý < 0) { System.out.println („Hata: sayý deðeri negatif!“): } else { System.out.println („blabla „ +sayý+„ bla„) ; } BY Ahmet Tolga Tat Sayfa 37 Örnek: class eger { public static void main(String args[]) { int x; x=20; if(x<15) { System.out.println("islem dogru"); } else { System.out.println("Hata:Girdiginiz sayi " +x); } } } Koºul kalibi Bazen çok kýsa koþullar için if else yerine kullanýlýr. koþul ? doðruysa : yanlýþsa; örnek: int cevap; cevap=x < y ? x : y; Ayný iþlemin if else þekli: int cevap; if x < y (eger x y‘den kücükse ) cevap=x; (cevap x olur ) else (yok hayir öyle degilse ) cevap=y; (cevap dogal olarak y olur ) Switch kalibi Bir önceki bölümde if ve if/else tekli ve ikili seçim kontrol yapýlarýna çalýþmýþtýk. Bu yapýlar her programda çok kullanýldýðý gibi çoðu zamanda tek bir deðiþkenin alabileceði bir çok deðer için bir programýn yapmasý gereken farklý iþlemler olacaktýr. Eð er elimizde sadece if/else yapýsý bulunsaydý, bu birden çok fazla deðerin her birini kontrol etmek için bir if/else kontrolü yazmak zorunda kalacaktýk. Bu çok sayýda if/else, hem programýn okunurluðunu azaltacak hemde BY Ahmet Tolga Tat Sayfa 38 programý izlemeyi zorlaþtýracaktýr. Ý þte bu olumsuzluklarý engelleyip daha verimli bir yapý oluþturabilmek için java proglama dilinde SWÝTCH çoklu seçim kontrol yapýsý bulunmaktadýr. Bu switch deyimi bir deðiþkenin alabileceði bir çok deðerin her biri için yapýlmasý gerekli kod blokla rýný içerir. Switch yapýsý ilk olarak SWÝTCH deyimi ile baþlar, sonra deðerlerine göre iþlem yapýlacak deðiþkenin belirlenmesiyle devam eder. Deðiþkenin her deðeri için yazýlacak kod parçalarý CASE deyiminlerinden sonra yazýlýr ve Her CASE deyimin bittiði yeri gösteren BREAK deyimi ile case sonlandýrýlýp, SWITCH komut bloðundan çýkýlýr. Switch yapýsýnýn son elemaný ise seçimlik olarak DEFAULT deyimi olup eðer hiç bir CASE koþulu saðlanmazsa yapýlacak iºlemleri iç erir. switch (expr1) { case expr2: Komutlar; break; case expr3: Komutlar; break; default: Komutlar; break; } Örnek: import java.awt.*; import java.applet.*; public class caseornek01 extends Applet { Label prompt1; TextField input1; int sayi=0; public void init() { prompt1 = new Label( "1 ÝLE 10 ARASI BÝR SAYI GÝRÝNÝZ " ); input1 = new TextField( 5 ); add( prompt1 ); add( input1 ); } public void paint( Graphics g ) { g.drawString("Sonuc",50,125); switch (sayi) { case 1: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; BY Ahmet Tolga Tat Sayfa 39 case 2: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 3: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 4: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 5: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 6: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 7: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 8: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 9: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 10: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; default: g.drawString("Farklý Bir Sayý Girdiniz",50,150); break; } } public boolean action( Event event, Object o ) { if ( event.target == input1 ) { sayi = Integer.parseInt ( input1.getText() ); repaint(); } return true; } } Bu örnekte dýþarýdan girilen sayýnýn 1 ile 10 arasýnda olanýni applet'e yazdýrýyoruz. Eðer farklý bir sayý girilirse sayý için Farklý Bir Sayý Girdiniz mesajý dýþarý verilir. Bu algoritma gerçekleþtirilirken sayi isimli deðiþken kullaný lmýþ olup, bu sayi is imli deðiþkenin 10 deðeri CASE kullanýlarak kontrol edilmiþtir. Eðer bu 10 CASE durumundan hiç biri olmazsa DEFAULT deyiminin kullanýldýðý komut bloðu iþlenilmiþtir. Þimdi bu örneði birde aþaðýdaki gibi yazalým. import java.awt.*; import java.applet.*; public class caseornek02 extends Applet { BY Ahmet Tolga Tat Sayfa 40 Label prompt1; TextField input1; int sayi=0; public void init() { prompt1 = new Label( "1 ÝLE 10 ARASI BÝR SAYI GÝRÝNÝZ " ); input1 = new TextField( 5 ); add( prompt1 ); add( input1 ); } public void paint( Graphics g ) { g.drawString("SONUCUMUZ",50,125); switch (sayi) { case 1: case 2: case 3: case 4: // CASE DEYÝMLERÝ BREAK case 5: case 6: case 7: case 8: // KULLANILMADAN OLUªTURULMUªTUR. case 9: g.drawString( "GÝRDÝÐÝNÝZ SAYI = "+sayi, 50, 150 ); break; case 10: g.drawString( "GÝRDÝÐÝNÝZ SAYI = "+sayi, 50, 150 ); break; default: g.drawString("10'dan Büyük Bir Sayý Girdiniz",50,150); break; } } public boolean action( Event event, Object o ) { if ( event.target == input1 ) { sayi = Integer.parseInt ( input1.getText() ); repaint(); } return true; } } Örnek // farz edin sayým pozitif // deðeri olan bir rakam switch (sayým % 3) { case 0: BY Ahmet Tolga Tat Sayfa 41 System.out.println („Renk kýrmýzý.“); renkAta (0); break; case 1: System.out.println („Renk sarý“); renkAta(1); break; case 2: System.out.println („Renk mavi“) ; renkAta (2) ; break; } // programýn renkAta( ) adlý bir fonksiyona sahip olduðunu kabul ediyoruz Break ve Continue komutlarý BREAK ve CONTINUE komutlarý ile bir döngünün akýþý deðiþtirilir. BREAK komutu while, for, do/while, veya switch döngü yapýlarýndan koþulsuz çýkýþý saðlar.BREAK komutunun asýl kullaným amacý bir döngüden döngünün sonunun gelmesini beklemeden çýkýþ için ve ya SWICTH çoklu seçim komut bloðunda BREAK komutunun altýnda kalan komutlarý atlamak için kullanýlýr. Aþaðýdaki basit bir örnekle bunu gözlemleyelim. //Örnek: import java.awt.*; import java.applet.*; public class breakornek0 extends Applet { public void paint (Graphics g) { int y=25; for (int i=1;i<=20;i++) { g.drawString("Döngü degiskenini ndegeri = "+i,15,y); y=y+25; if (i==8) { g.drawString("Bu Döngüden Çýkýyorum",15,y); BY Ahmet Tolga Tat Sayfa 42 break; } } } } Görüldüðü üzere eðer FOR döngüsü normal þekilde sonlanacak olsaydý, aplet üzerine i döngü kontrol deðiþkeninin almasý gereken tüm deðerler yazýlacaktý. Fakak i deðiþkeni 8 deðerine ulaþýnca BREAK komutu çalýþtýrýlýyor ve FOR döngüsünden koþu lsuz çýkýlýyor ve i nin sadece ilk 8 deðeri aplete yazdýrýlýyor. break komutu iç içe oluþturulmuþ döngülerde, hangi döngüde kullanýlmýþsa o döngüden çýkmayý saðlar ve diðer dýþ döngüler iþlemlerine devam eder. Aþagýdaki kod bloðu iþletilince, apletten ilk olarak iç WHÝ LE döngüsünün çýkýldýðý anlaþýlýyor. Fakat dýþ WHÝLE döngüsününe devam edildiði, dýþ WHÝLE döngüsünden ise bir sonraki BREAK komutu ile çýkýldýðý görülüyor. /******************************** *Örnek * *********************************/ import java.awt.*; import java.applet.* public class breakornek extends Applet { public void paint (Graphics g) { int y=25; int i=0; int j=0; while (++i<=3) { g.drawString(" Dis while döngü degiskeni degeri I = "+i,15,y); y=y+25; while(++j<=10) { g.drawString(" ic while döngü degiskeni degeri J= "+i,15,y); y=y+25; if (j==3){g.drawString("ic while döngüsünden cikiliyor",15,y); break; } } } } } Continue komutu ise, döngü içerisinde sadece döngünün o seferki dönüºünde, bu komutun altýnda kalan komutlarý atlamaya yarar. Döngü sonraki deðerleri için BY Ahmet Tolga Tat Sayfa 43 dönmeye devam eder. Ama CONTÝNUE komutunda dikkat etmemiz gereken husus bu komutun DO/WHÝLE v e FOR döngü yapýlarýnda kullanýlýnca farklýlýklar içermesidir. DO/WHÝLE döngülerinde kontrol deðiþkenine uygulanmasý gereken arttýrma veya azaltma iþlemi gerçekleþtirilmeden,döngü kontorolü yapýlýr ve iþlemlere devam edilir.Fakat FOR döngülerinde ise, CONTINUE komutu iºlenince döngü kontrol deðiþkeni için yapýlmasý gereken artýrma ve ya azaltma iþlemi yapýlýr, sonra döngü kontrolü yapýlýr. BU dikkat edilmesi gereken önemli bir durumdur. //Örnek //Yukaridaki programlam bu program arasindaki farka dikkta edin!! import java.awt.*; import java.applet.*; public class breakornek2 extends Applet { public void paint (Graphics g) { int y=25; int i=0; int j=0; while (++i<=3) { g.drawString(" DIÞ WHÝLE DÖNGÜ DEÐÝÞKENÝ DEÐERÝ Ý = "+i,15,y); y=y+25; while(++j<=10) { g.drawString(" ÝÇ WHÝLE DÖNGÜ DEÐÝÞKENÝ DEÐERÝ J = "+i,15,y); y=y+25; if (j==3){g.drawString("ÝÇ WHÝLE DÖNGÜSÜNDEN ÇIKILIYOR",15,y); y=y+25; break; } } if (i==1){g.drawString("DIÞ WHÝLE DÖNGÜSÜNDEN ÇIKILIYOR",15,y); y=y+25; break; } } } BY Ahmet Tolga Tat Sayfa 44 Döngü kaliplari for döngüleri for (ilk_deðeri1; test_deðeri2; arttýrma_deðeri3) { Komutlar; } Örnek class don{ public static void main(String args[]) { int x; System.out.println("Cuneyt 10 defa sorar:"); for(x=0;x<=10;x++){ System.out.println("(: Bitmedimi bu askimiz hala Nalan "); } System.out.println("Nalan cevap verir:"); System.out.println("THE SON :)"); } } Þimdi bir örnekle bu anlatýlanlarý daha iyi açýklýyalým. Örnek import java.awt.Graphics; import java.applet.Applet; public class forornek extends Applet { public void paint(Graphics g) { int y=25; for (int sayac=1;sayac<=20;sayac++){ g.drawString("SAYAÇ DEÐERÝ : "+sayac,25,y); y=y+25; } } } Programý çalýþtýrdýðýmýzda, çýktý olarak elde ettiðimiz applet'i incelersek, sayac kontrol deðiþkenin ilk olarak 1 deðerini alýðýný görürüz. Daha sonra döngü içerisinde birer birer artýðýný ve 20 deðerine ulaþýnca döngünün son bulduðunu gözlemleriz . Böylece : BY Ahmet Tolga Tat Sayfa 45 1.ifade diye tanýmladýðýmýz sayac=1; komutu ile kontrol deðiþkenine ilk deðeri atadýðýmýz, 2.ifade diye tanýmladýðýmýz sayac<=20; komutu ile döngü uzunluðunu belirlediðimiz, 3.ifade diye tanýmladýðýmýz sayac++; komutu ile kontrol deðiþkeninin her dönüþ için deðiþim miktarýný belirlediðimiz görülür. Java programlama dilinde for döngü yapýlarý için gerekli dediðimiz 3 ifadenin hepsi isteðe baðlý ifadelerdir. Yani istenirse yazýlmayabilirler. Bu durumda dahi for döngüsü çalýþýr. Ama eðer 1.ifade verilmezse bu, kontrol deðiþkeninin daha önceki komutlard a tanýmlanmýþ ve deðer atanmýþ olmasýný gerektirir. 2.ifade verilmezse bu ise for döngüsünün sonsuz bir döngü olacaðý anlamýna gelir. 3.ifade verilmezse bu ise, döngü deðiþkeninin döngü içerisinde arttýrýlýp, azaltýlacaðý anlaþýlýr. Son olarak döngü deðeri azalarak oluþturulmuþ bir for döngüsü örneði inceleyelim. Programýmýz 20 den 1' e kadar i kontrol deðiþkeninin döngü içerisinde aldýðý deðerlerini applet'e yazýp, döngü deðiþkenin aldýðý deðerlerin toplamýný çýkýþ olarak veriyor. //Örnek*************************** import java.awt.Graphics; import java.applet.Applet; public class forornek02 extends Applet { public void paint(Graphics g) { int toplam=0; int y=25; for (int i=20;i>=1;i--){ g.drawString("Ý'nin DEÐERÝ : "+i,25,y); y=y+25; toplam=toplam+i; } g.drawString("toplam : "+toplam,50,y+25); } } Bu örnek ile azalarak giden döngü kontrolü deðiþkenini görmüþ olduk. i deðiþkeni ilk deðeri olan 20 deðerinden sonra, döngü her dönüþünde bu ilk deðerinden birer BY Ahmet Tolga Tat Sayfa 46 birer azalarak 1 deðerine ulaþýr. 1 deðerine ulaþýnca döngü son bulur ve deðerlerin to plamý applet'e yazýlýp, program sonlandýrýlýr. //Örnek: class kare { public static void main (String args[]) { int l ,a; if (args.length == 2) { l = Integer.valueOf(args[0]).intValue(); a = Integer.valueOf(args[1]).intValue(); } else { l= 20; a= 15; } for (int i=l; i>0; i--){ System.out.print("J"); } System.out.print("\n"); for (int i= a-2; i>0; i--){ System.out.print("A"); for(int j=l-2; j>0; j--) { System.out.print(" "); } System.out.print("V\n"); } for (int i=l; i>0; i--){ System.out.print("A"); } System.out.print("\n"); } } while döngüleri While cok kullanilan tekrarlama yapilarindan biridir.( ) icindeki boolean terim true(dogru)oldugu sürece yeniden islemi döndürür.Eger programda boolean islemi sonuclandiracak bir ifade yoksa bu döngü sonsuza kadar devam edebilir. while (boolean degisken) { Komutlar; } BY Ahmet Tolga Tat Sayfa 47 while(true) { System.out.println(„Bu döngü sonsuze gider“); } Yukaridaki program sonsuza kadar gider. //while örnegi import java.lang.*; class whileornek { public static void main(String args[]) { int num=1; while(num <=10){ num +=1;//veya ++ System.out.println("nummmer="+num); } } } Yukaridaki programdan söyle bir cikti alirsiniz: C:\Java\jdk1.3\bin>java whileornek nummmer=2 nummmer=3 nummmer=4 nummmer=5 nummmer=6 nummmer=7 nummmer=8 nummmer=9 nummmer=10 nummmer=11 do-while döngüleri Komutlar; DO/WHÝLE döngü yapýsý ile WHÝLE döngü yapýsý birbirine çok benzer. Tek ve önemli fark, DO/WHÝLE yapýsýnda döngü en az bir kere tekrarlanýr. Bunun nedeni döngü kontrolünün döngünün sonunda yapýlmasýdýr. Ama WHÝ LE döngü yapýsýnda kontrol en baþta olduðu içi n, döngü hiç dönmeyebilir. Bu yüzden DO/WHÝLE yapýsý kullanýlýrken döngünün en az bir kere döneceði unutulmamalýdýr. Bu anlattýðýmýzý ufak bir örnekte inceleyelim. DO/WÝLE ile yazýlan program import java.awt.*; import java.applet.*; public class dowhileornek02 extends Applet { BY Ahmet Tolga Tat Sayfa 48 public void paint( Graphics g ) { int i=1; while(i!=1){ g.drawString("BEN WHÝLE ' IM",25,25); } } } Ayný program WHÝLE ile yazýlýmý import java.awt.*; import java.applet.*; public class dowhileornek01 extends Applet { public void paint( Graphics g ) { int i=1; do{ g.drawString("BEN DO/WHÝLE ' IM",25,25); }while(i!=1); } } Aþaðýdaki örnekte ise 5 tane öðrencinin notu dýþarýdan okunup bir dizine atýlýyor (dizinler ileriki bölümlerde açýklanacaktýr). Bu 5 öðrenc i notu aplet'e bir WHÝLE dömgüsü ile yazdýrýlýyor ve not ortalamasý bulunarak oda aplet'e yazdýrýlýyor. Örnek: import java.awt.*; import java.applet.*; public class whileornek extends Applet { int n[]; int c=0; int num; int y=25; int toplam=0; Label prompt1; TextField input1; public void init(){ BY Ahmet Tolga Tat Sayfa 49 prompt1= new Label("NOTLARI GÝRÝNÝZ"); input1= new TextField(5); add(prompt1); add(input1); n= new int[10]; } public void paint(Graphics g) { if (c==5) {for (int i=1;i<=5;i++){y=y+25; g.drawString(" "+i+" Öðrenci notu = " + n[i],25,y); toplam=toplam+n[i]; }g.drawString(" Öðrenci Not Ortalamsý = " + toplam/5,25,y+25); } } public boolean action (Event e, Object o){ if (e.target==input1){ c++; num=(Integer.parseInt(input1.getText())); n[c]=num; repaint(); } return true; } } Ayrýca aþaðýdaki komutlarý da kullanabiliriz. break (etiket); //döngüden tamamen çýkar veya etikete geçer continue (etiket); //döngünün bir sonraki tekrarýna veya etikete geçer return deðer; //deðer geri çevirir (metotlar için) label; komut; // for, while veya do kalýplarý için etiket BY Ahmet Tolga Tat Sayfa 50 Nesneye yönelik Programlama Object Oriented Programlama Object oriented programlamanýn (OOP), 60’lý yýllarda Simula dilinin tasarlanmasý ile baþladýðý kabul edilmektedir. Simula, bir simulasyon dili olarak tasarlanmýþtýr, kullanýcýya sistem içersindeki mevcut nesnelerin ve bunlarýn deðiþik durumlardaki davranýþlarýnýn modellenmesi yönünde bir yaklaþýmla program yapma imkaný saðlanmýþtýr. Günümüzde eðer bir dil programcýya sorunu parçalar ayýrma hakký tanýyorsa, ve program parçalara ayrýldýðýnda her bir parçanýn ayrý ve özgün davranýþlarý tanýmlanabiliyor ve hatta kendi durumlarý söz konusu olabiliyorsa o zaman programlama dilinin obje tanýmlý bir dil olduðunu söyleyebiliriz. Object oriented bir program birbiriyle iliþkili baðýmsýz modüllerden oluþur. Fakat bir programlama dilinin gerçekten object oriented olmasý için aþaðýdaki özellikleri desteklemek zorundadýr Encapsulation (Veri soyutlama ve saklama prensibi): Tek bir obje tanýmý bazý iþlemlerde deðiþik durumlara raðmen doðru tepkileri verebilmeli ve bütün bu detaylar objenin içinde özel ve gizli kalabilmelidir. Inheritance (Kalýtým,Miras): Yeni sýnýflar daha önceden var olan sýnýflardan türeyebilmeli, hem kod tekrar kullanýmý hem de geliþtirilebilirlik saðlar. PolyMorphism (Çok biçimlilik): Bir fonksiyon yada metodun deðiþik sýnýflardaki objelere uygulanmasýyla ayný mantýksal sonucu vermesi. Veya baþka bir deyiþle, ayný isimdeki operasyonlarýn deðiþik objeler için farklý biçimlerde algýlanmasý olarak tanýmlanabilir. Dynamic Loading (Dinamik Yükleme): Objelerin her yerden çaðrýlmasý ki buna að da dahildir ve hatta çaðrýlan objenin tipi dikkate alýnmadan ona mesaj geçilebilmesidir. Class(sinif) nedir? Sýnýf Tanýmý Class bir þablon tarzýdýr. Bir sýnýflama mantýðý söz konusudur. Programýmýzda kullanacaðýmýz belli nesneleri (objectleri) ortak bir tarzdan türetmeye çalýþýrýz. Güncel hayat da böyledir. Çeþitlerce araba vardýr, spor, cabrio, tek kapý ama biz araba adlý genel bir taným verdiðimizde hepsini ele alýrýz, ama her birini tanýmlamak için genel araba tanýmýna detaylar ekler durumlar BY Ahmet Tolga Tat Sayfa 51 veririz. Bunda deðer gruplarýný ikiye ayýrýyoruz. Bir sýnýf için durumlar yani deðiþkenler ve de davranýþlar yeni metotlar vardýr. Bunu çekirdek bir yapýyla gösterebiliriz. Örnek: public class Araba { public String name; public int erstzulassung; public int leistung; } Araba Class class Araba { private int hýz; private float depo, ortalama_hýz; private int yon; String renk; // class metotlarý public Araba (String renk) {/ / constructor this.renk = renk; } public void sur (int yeni_hýz) { depo -= ( float) hýz/ortalama_hýz; if (depo< = 0.0) dur ( ); else hýz=yeni_hýz; } public void dur ( ) { frenYap ( ); hýz = 0.0 } } . Sýnýf Olusturma Burda sýnýflarýn nesnelerden nasýl meydana getirildiklerini açýklýyacaðýz.. Aþaðidaki ifade ile bir sýnýf yapýsý gösterilmiþtir rahatlýkla bu yapýyý kullanarak bir sýnýf oluþturabiliriz. Ýki karakteristiðe sahiptir sýnýf tanýmlanmasý ve sýnýf yapýsý BY Ahmet Tolga Tat Sayfa 52 classDeclaration { classBody } Örnek: import java.awt.*; class selam { static String name; public void setYourName(String n) { name=n; } public void sayHello(Graphics g) { g.drawString("Selam " + name + " Bey !",25,60); } } Sýnýf Tanýmlanmasý Bir sýnýf tanýmlanmasýda sýnýflar isimleriyle birlikte ifade edilebilirler. Ve bunun yanýsýra sýnýf tanýmlanmasýnda diðer özelliklerde belirtilmek gerekir. Mesela sýnýfýn nasýl bir özellik arz etmesi gerektiði bir supersýnýf mý ypksa bir alt sýnýf mý?. veya bunlarýn yanýsýra sýnýfýn ulaþýlabilirliðide burada belirtirlir public, final veya abstract olmasý. Bir sýnýf yapýsý sýnýf tanýmlanmasýndan sonraki gelen kýsýmdýr bu kýsým ayrýca köþeli parentez ile sýnýrlandýrýlmýþtýr.Bir sýnýf yapýsý aralýk deðiþkenlerinin tanýmlarý ve method tanýmlamalarý ve bu methodlarýn içerikleri bu köþeli parantezler içerisinde yazýlmalýdýr. Bir sýnýf durumu onun sýnýf deðiþkenleri tarafýndan tasvir edilir.Biz sýnýf üyeleri deðiþkenlerini tanýmlarýný sýnýf yapýsý içerisinde tanýmlanýr.Tipik olarak, biz deðiþkenleri methodlarýn tanýmlanmasýndan hemen önce yaparýz. Bu gerekli olmasa bile classDeclaration { member variable declarations method declarations } BY Ahmet Tolga Tat Sayfa 53 //Enteresan bir Java Applet import java.awt.*; import java.applet.*; import java.lang.*; public class resimler extends Applet { private int Al =50; Scrollbar sliderAl; String sliderAlText = "Al (1-40000): "; Label sliderAlLabel; Panel controlPanel; Font font; public void init(){ setForeground(Color.white); font = new Font("Helvetica", Font.BOLD, 12); setLayout(new BorderLayout()); controlPanel = new Panel(); controlPanel.setLayout(new GridLayout(15,1)); add("East", controlPanel); sliderAlLabel = new Label(sliderAlText + "50"); controlPanel.add(sliderAlLabel); sliderAl = new Scrollbar(Scrollbar.HORIZONTAL, Al, 1, 1, 40000); controlPanel.add(sliderAl); controlPanel.add(new Button("Random")); } public boolean handleEvent(Event e) { if (e.target instanceof Scrollbar) { int value = ((Scrollbar)e.target).getValue(); if (e.target == sliderAl) { sliderAlLabel.setText(sliderAlText + Integer.toString(value)); Al = value; } repaint(); return true; } return super.handleEvent(e); } public boolean action(Event e, Object arg) { if("Random".equals(arg)){ Al = (int)(Math.random()*40000+1); sliderAlLabel.setText(sliderAlText + Integer.toString(Al)); sliderAl.setValue(Al); repaint(); return true; } return true; } BY Ahmet Tolga Tat Sayfa 54 public void paint(Graphics g) { float x = 0; float y = 0; float prevx = 512; float prevy = 512; int x1,y1; int x0 = 150; int y0 = 150; int redBits, blueBits, greenBits; int i; int max=1000; int in = 5; int dis = 10; int an = 0; g.setFont(font); g.clipRect(0,0,300,300); redBits = (int)(Math.random()*255); blueBits = (int)(Math.random()*255); greenBits = (int)(Math.random()*255); g.setColor(new Color(redBits, greenBits, blueBits)); for (i=0; i<=max; i++) { x = (float)( prevx + dis * Math.sin((double)an)) ; y = (float)( prevy + dis * Math.cos((double)an)); if(x > 1024) break; if(x < 1) break; if(y > 1024) break; if(y < 1) break; x1 = (int)(x/1024.*300.); y1 = (int)(y/1024.*300.); g.drawLine(x0,y0,x1,y1); prevx = x; prevy = y; x0 = x1; y0 = y1; dis = dis + in; an = an + Al; } } } BY Ahmet Tolga Tat Sayfa 55 Üye degiskenlerinin tanimlanmasi Az olarak,bir üye degiskeni tanimi iki unsura sahiptir: veri degiskenin türü ve onun ismi. type variableName; // minimal member variable declaration Küçük degisken tanimi diger degisken tanimlari gibidir, bizim yazdigimiz diger Java programlarinda oldugundaki gibi örnegin yerel degiskenler veye method parametreleri gibi.Asagidaki örnek kodda görülgügü üzere dogal üye degiskeni Integer olarak isimlendirilmistir sinif IntegerClass ile birlikte. class IntegerClass { int anInteger; . . . // Burda methodlari Tanimla . . . } Burdan anlasilacagi gibi üye degiskbe tanimlamalari sinif yapisi içerisinde gösterilir. methodla birlikte gösterilmez.. Bu pozisyon sinif yapisi ile birlikte bulunur degisken üye degiskenidir. Üye degiskenlerinin ismi uygun bir java belirtgeçi veya ve anlasma küçük harf ile baslar (sinif isimleri genellikle büyük harf ile baslar.).Biz birden fazla üye degiskeni tanimlayamayiz ayni isim altinda ayni sinif yapisi içinde.Fakat Üye degiskenleri ve methodlar ayniisimde olababilirler.Örnegin Asagidaki kod hatasiz olarak çalisir. class IntegerClass { int anInteger; int anInteger() { member variable // a method with the same name as a . . . } } Kisaca tanim protosu asagidaki gibidir.: [accessSpecifier] [static] [final] [transient] [volatile] type variableName Üye degiskenleri tanimlari asagidaki gibi tanimlanir : • Ulasim belirteci tanimlar hangi diger siniflar ulasabilir bu degiskene.Biz ulasimi kontrol edebiliriz ayni belirtgeçler, kullanarak.,bu yüzden ulasim kontrolu sinifin üye degiskenlerine kapsar bizim nasil bütün üye degiskenlerine ve methodlarina ulasacagimizi. BY Ahmet Tolga Tat Sayfa 56 • static • final • transient • volatile içerir bu degisken bir siin degiskenidir aralik üye degikenin tam tersi gibi. Biz sinif methodlarini static to anahtar kelimesiylede tanimlayabiliriz. degiskenin sabit oldugunu gösterir. degiskeneleri nesne durum kisminin parçasi degildir. tanimlanir zamana bagli olmayarak. Bir sinif icinde tanimlanan degiskenler ulasilma tekniklerine gore ve ozelliklerine gore bir cok kisma ayrilir. Static : Bu tip degiskene sinif degiskeni de denir. Olusturulan butun nesnelerin icin bir kopya vardir ve degisiklige ugradigi zaman hepsi icin ayni degisiklik soz konusudur. Sabitler : Final anahtar sozcuguyle belirtilirler. Program calisma esnasinda kesinlikle degistirilmelerine izin verilmez. Örnek: import java.awt.* ; import java.applet.* ; public class selamla extends Applet{ Label prompt; TextField input; String adsoy,args; // prompt user to input // input values here // store input value selam greeter1 = new selam(); public void init() { prompt = new Label( "Enter your name and press Enter:" ); input = new TextField( 10 ); add( prompt ); // put prompt on applet add( input ); // put input on applet } public void paint(Graphics d) { greeter1.setYourName(adsoy); greeter1.sayHello(d); } public boolean action( Event e, Object o ) { adsoy = input.getText(); input.setText( "" ); // clear data entry field repaint(); return true; } BY Ahmet Tolga Tat Sayfa 57 } Method Tanimlanmalari Bir method tanimi derleme esnasinda bir çok bilgiler tedarik eder ve çalisma sirasinda ve diger nesne ve siniflar hakkinda da bir çok bilgiyi alabiliriz.Bunun yanisira, methodun ismi ve tanimlanmasibilgi tasi örnegin, methodun ve kaç tane parametre döndürülmesi gerektigi method tarafindan ve ayni zamanda diger siniflarin ve nesnelerin çagrilacagini belirtir. class Stack { . . . boolean isEmpty() { . . . } } Method’tan Deger Döndürmek Javanin dönecek degerinin tipinin belirtilmesine ihtiyaci vardir.Eger bir method herhangi bir deger döndürmüyorsa, o void anahtar söcügü ile tanimlanmalidir.. class Stack { static final int STACK_EMPTY = -1; Object[] stackelements; int topelement = STACK_EMPTY; . . . boolean isEmpty() { if (topelement == STACK_EMPTY) return true; else return false; } } Fakat, pop() methodu referans bir veri tipi döndürüyorsa buna nesne denir.. class Stack { BY Ahmet Tolga Tat Sayfa 58 static final int STACK_EMPTY = -1; Object[] stackelements; int topelement = STACK_EMPTY; . . . Object pop() { if (topelement == STACK_EMPTY) return null; else { return stackelements[topelement--]; } } } Methodlar return anahtar sözcügünü kullanilirlar .ve herhangi bir method return yapisi tasiyorsa void ile tanimlanmamalidir. . Methodun Ismi Bir method ismi herhangi bir Java tanimlayicisi olabilir. There are three special cases to consider in regards to Java method names: class DataRenderer { void draw(String s) { . . . } void draw(int i) { . . . } void draw(float f) { . . . } } Note: The information within the parenthesis in the method declaration are arguments to the method. 1.Herhangi bir method sinif ismi ile ayni ise bu metoda biz baslandirici BY Ahmet Tolga Tat Sayfa 59 diyoruz.Bu metodun özel bir görevi vardir.Baslandiricilar sinif tarafindan üretilen nesnenin baslangiç degerleri verilmesi için kullanilir. Constructors sadece Java new operatorü ile çagrilirlar. Bir sinif methodu yeniden yazabilir supersinif da tanimlanmis bir methodu. Tekrar ile yüklenecek method atni isimden olmak zorundadir. Bunlarin yaninda method tanimlanmasinda iki elemana ihtiyaç duyar.Bir methos tanimlamasi baska elemanlarida içerir.Bütün bu elemanlar method tarafindan kabul edilen argumanlari açiklarlar. Asagidaki yapida methodun tanimlanmsi açiklanmistir. [accessSpecifier] [static] [abstract] [final] [native] [synchronized] returnType methodName ([paramlist]) [throws exceptionsList] Method tanimlamalari normal bilinen yapisal programlamaya cok benzer. Methodlarda eger bir degisken dondurulmek isteniyorsa o degiskenin degerine uygun method tanimlamasi yapilmalidir. Ornegin Eger bir dogrui yanlis gibi flag degerleri dondurulmek isteniyorsa Boolean anahtar sozcugu kullanilir. Eger hic bir sey dondurulmek isteniyorsa void tanimlamasi yapilir Örnek: import java.awt.* ; import java.applet.* ; public class numara extends Applet{ Label prompt; TextField input; int num,ypos; Graphics d; // prompt user to input // input values here // store input value public void init() { prompt = new Label( "Enter your number and press Enter:" ); input = new TextField( 10 ); add( prompt ); // put prompt on applet add( input ); // put input on applet } public void swap1(Stupid a, Stupid b) { Stupid temp; temp=a; a=b; b=temp; d.drawString("======= during swap1 ========",10,130); a.sayHello(d,145); b.sayHello(d,160); } BY Ahmet Tolga Tat Sayfa 60 public void swap2(Stupid a, Stupid b) { int temp=a.getNum(); a.changeNum(b.getNum()); b.changeNum(temp); d.drawString("======= during swap2 ========",10,230); a.sayHello(d,245); b.sayHello(d,260); } public void paint(Graphics g) { Stupid One=new Stupid(num); Stupid Two=new Stupid(2); g.drawString("======= before swap ========",10,80); One.sayHello(g,95); Two.sayHello(g,110); swap1(One,Two); g.drawString("======= after swap1 ========",10,180); One.sayHello(g,195); Two.sayHello(g,210); swap2(One,Two); g.drawString("======= after swap2 ========",10,280); One.sayHello(g,295); Two.sayHello(g,310); } public boolean action( Event e, Object o ) { num = Integer.parseInt (input.getText()); input.setText( "" ); // clear data entry field repaint(); return true; } } import java.awt.*; // import the Java.awt package import java.applet.*; // import Applet class class Stupid { int myNum; Stupid(int n) { myNum = n; } public void sayHello(Graphics g,int yp) { g.drawString("Numaram : "+ myNum,10,yp); } BY Ahmet Tolga Tat Sayfa 61 public void changeNum(int n) { myNum=n; } public int getNum() { return myNum; } } Sinif kurucusu Bütün Java siniflari özel bazi methodlara sahiptirler bunlara kurucu denir ve siniflardan olusturulan yeni nesnelere baslangiç degerleri vermek için kullanilir.Kurucular sinif ile yani ismi tasimak zorundadir.Mesela Rectangle sinifinin kurucusunun ismi da Rectangle olmak zorundadir. Java method isminin yeniden yüklenmesini destekler ve bu yüzden bir sinif birden fazla kurucusu olabilir ayni isimda olan. Diger tekrar yüklenen methodlar gibi kurucular birbirlerinden farkli olmak zorundadir tipinin farkli olmasi veya parametre sayilarin farkli olmasi gibi Örnek olarak Rectangle sinifin java.awt paketinde bulunan çok farkli kurucular tedarik edebilir hepsi Rectangle(),isminde fakat herbir farkli sayida elemanlar veya farkli tipte bulunan elemanlar ile birlikte kurucular olusturulabilinir.: public Rectangle() public Rectangle(int width, int height) public Rectangle(int x, int y, int width, int height) public Rectangle(Dimension size) public Rectangle(Point location) public Rectangle(Point location, Dimension size) Birinci Rectangle kurucusu yeni Rectangle nesnesine baslangiç degerlerini atar, ikinci kurucu ise belirtilen width ve height ile yeni nesnesi olusturulur. üçüncü örnekte ise yeni dimension size ile nesne baslangiç degeri atanir. Genel olarak kurucular kendi elemanlarinin kullanilir yeni nesne durumunu atamak için kullanilir.Bu yüzden yeni bir nesne olusturmak bizim en iyi tepki verecek argümanlari seçmekte ve onla atama islerini yapilmasi için bir kurucu türü seçilebilinir. Bunun yaninda elemanlarin tip sayisi biz kurucu methoduna geçebiliriz. ve derleyici hangi kurucuyu kullanacagina karar verir. Sonuç olarak derleyici bizim yazdigimiz seyi bilir. new Rectangle(0, 0, 100, 200); Eger integer bir argüman gerekiyorsa onunla belirtilen bir kurucu seçilmelidir.asgida yazildigi gibi. new Rectangle(myPointObj, myDimensionObj); BY Ahmet Tolga Tat Sayfa 62 Biz kendi sinifimizi yazdigimiz zaman, onun için bir kurucu olusturmamiza gerek yoktur. Önce belirli olan kurucu herhangi bir argüman almaz o tamamem otomatik olrak çalisma sirasi esnasinda meydana gelir bütün siniflar için. Fakat biz kendi sinifimiz için bir kurucu isteyebiliriz veya gerekli olabilir Bir kurucu thread in alt sinifi olan, thread bir animasyon gerçeklestirebilir. ve yeni degerler kurabilir. mesela çerçeve hizi, görüntü sayisi...yeni degerlerin yüklenmesi. class AnimationThread extends Thread { int framesPerSecond; int numImages; Image[] images; AnimationThread(int fps, int num) { super("AnimationThread"); this.framesPerSecond = fps; this.numImages = num; this.images = new Image[numImages]; for (int i = 0; i <= numImages; i++) { . . . // Load all the images. . . . } } } Yukaridaki örnekte kisaca bir kurucunun nasil sinifin içine gömüldügü gösterilmistir. super("AnimationThread"); Kendi kurucumuz biz normal ulasim belirteçlerini kullanabiliriz . private Hiç bir sinif bizim sinifimizi nesne olarak kullanamaz. Eger bizim sinifimiz halka açik methodlar var iseda bunlara erisim de kisitlidir.. protected Sadece altsiniflar aralik olusturabilir.. BY Ahmet Tolga Tat Sayfa 63 public Herhangi biri sinifin araligini olusturabilir. package-access PAket disindan olan hiç kimse sinifa ulasip onun degerlerini kullanilr.Bu gayet kullanisli bir yöntem olabilir. Java çoklu kurucuyu destekler. Bu yordam sinif ilk degerler atanmasi icin gerekli olan bir yapidir. Bu yordam degiskende alabilir. Birden fazla constructor yapisi olabilir aldiklari degiskenlerin degerlerine gore veye typelarina gore. Kalitim Nedir? Genellikle nesneler sinif olarak tanimlanirlar.Biz nesneler hakkinda siniflar hakkinda oldugundan daha fazla bilgiye sahibiz. Nesne tabanli sistemlerde siniflarin daha farkli sekillerde tanimlanacagi gibi ve küçük bir adim atnak için bir giris yapilacaktir.Örnegin Dag bisikleti, yaris bisikleti veya iki kisilik bisiklet hepsi birbirinden farkli bisiklet tipleridir. Nesne Tabanli teminolijide bütün bu sayilan bisikletler bisiklet sinifinin bir alt sinifidir.Buna benzer olarak bisiklet sinfi dag bisikletinin yaris bisikletinin super sinifidir. Herbir alt sinif supersinifin özelliklerini kalitir.( degisken tanimi içerisinde). Dag bisikleti, yaris bisikleti, ve iki kisilik bisiklet ayni durumlari paylasirlar: ayar, hiz, ve bunun gibi ve herbit altsinif super sinifin methodlarini kalitirlar.Dag bisikleti, yaris bisikleti, ve iki kisilik bisiklet ayni zamanda bazi hareketleride paylasirlar: fren sikma pedal hizini degistirme Alt siniflar kalitilan methodlari yeniden biçimlendirebilir ve daha özel biçimlerde genisletebilir. Alt siniflar kalitilan methodlari yeniden yükleyebilir ve daha özel methodlari tedarik edebilir.Örnegin, eger bizim bir dag bisikletimiz varsa extra viteslere sahip, biz daha farkli vites degistir diye bir method yazabiliriz.Bisiklet süren bu methodu kullanarak viteslerde degisiklik yapabilir. Biz hiç bir sekilde kalitim katmani ile sinirlandirilmayiz. Kalitim agaci veya sinif hiyerarsisi gerektigi kadar derin olabilir. Methodlar ve degiskenler seviyeler arasindadir . Kalitimin Yararlari • Altsiniflar daha özel hareketleri tedarik edilir super sinif tarafindan saglanan temel elemanlardan olus turulan. Kalitim kullanim boyunca, programcilar supersinif içerisinde program kodlarini tekrar kullanabilir. • Programcilar supersiniflari soyut olarak ifade edebilirler.Soyut supersiniflar tanumlar ve kismen hareketleri sunabilir. Diger programcilar detaylari özel alt siniflarla doldurabilirler.. BY Ahmet Tolga Tat Sayfa 64 Kalitim nesnesel programlamada cok onemli bir yer teskil etmektedir. Boylelikle siniflari bir birleri icindeki yordamlari kullanmasini saglayabiliriz. Mesela bir agaç sinifinda bir cok ozellikleri farkli kisma ayirabiliriz. (çam agaci,elma agaci...) Ama bu farkli turdeki aaçlar temel olarak agaç ozellikleri tasirlar ve nesnesel programlama bu extends anahtar sozcugunu kullanarak izin verir .Fakat Java Coklu kalitimi desteklemez. Alt Sýnýf Oluþturma Biz bir sýný fý baþka bir sýnýfýn alt sýnýfý olarak tanýmlayabiliriz class tanýmlama içerisinde olmak üzere....Örnegin Eðer biz bir SubClass isminde alt sýnýf oluþturmak istersek SubClass diðer sýnýfýn alt sýnýfý olarak ifade edebiliriz diðer sýnýf ise super sýnýftýr. class SubClass extends SuperClass { . . . } Yeni bir alt sýnýf oluþtururken extends anahtar kelimesi ile kolaylýkla alt sýnýf oluþturulabilir.. Fakat biz genelikle diðer þartlarý tedarik etmeliyiz bir sýnýf alt sýnýf oluþturulduðu zaman örneðin methodlarý yeniden yüklemek. Üye Deðiþkenleri Nasýl Alt Sýnýfllara Kalýtýlýr? Kural: Bir alt sýnýf bütün üye deðiþknelerini kalýtabilir super sýnýf ile birlikte eðer super sýnýfýn ulaþýlabilir tipleri buna müsade ediyorsa. Eðer alt sýnýfa sýnýrlanmýþsa üye deðiþkenlerine ulaþýlamaz. Bir alt Sýnýf, • bütün üye deðiþkenleri kalýtlýr eðer public veya protected tanýmlanmýþsa.. • private üye deðiþkenleri kalýtýlamaz. Üye Deðiþkenlerinin Saklanmasý Daha önceki bölümlerde bahsedildiði üzere, alt sýnýfta tanýmlanan üye deðiþkenleri ayný isimdeki üye deðiþkenlerini saklayabilirler Bu özellik Java daha güçlü ve daha geleneksel yapar. ayný zamanda hata ayýklamada daha verimli olmasýna yardýmcý olur. Bir üye deðiiþkenini kazayla veya istemeyerek saklamayabiliriz buda bize istenmeyen mantýksal hatalarýn oluþmasýna neden olur. Bu yüzden üye deðiþkenlerini ismlendiriken daha dikkatli olunmasý gerekmektedi yanlýþlýkla saklanmamasý için. class Super { Number aNumber; } class Sub extends Super { Float aNumber; } super.aNumber BY Ahmet Tolga Tat Sayfa 65 Java dilinde bulunan bir anahtar kelimedir anlamý ise super sýnýfý ifade etmesidir. super Alt sýnýf bir özelliði ise super sýnýftaki methodlarý yenilendirmek yani yeni anlamlar yüklemektir. Alt sinif olmak isteyen bir sinif alt sinifi extends anahtar sozcuguyle kalitimi saglar. Degiskenler private yapilarak istenirse alt sinifdan saklanabilir. Ayni zamanda private methodlarda kalitilamaz.Bir ust sinifa super anahtar sozcuguyle ulasabiliriz. Methodlarý Yenilendirmek Bir alt sýnýfý tamamen yenilendirilebilinir kalýtýlmýþ method için veya alt sýnýf yani methodlar ekleyerek methodu geniºletme ºeklinde olabilir methodlar da yenilendirme iþlemi. Methodlarý yenilemek kalýtýmýn en önemli özzelliklerinden biridir Super Sýnýfý Method Yazýmýný Yenilendirmek Bazen bir alt sýnýf super sýnýf bir methodunu tamamen yenilendimek isteyebilir. Gerçekten de bir çok super sýnýflarda ki methodlarýn içleri boþtur. Ýstenilenlere göre bu yapý þekillendirilir.. Tamamen yeni yerleþtirilmiþ bir super sýnýfýn sunumu, kolayca ayný isimdeki bir method tedarik edebilir. class BackgroundThread extends Thread { void run() { . . . } } BackgroundThread sýnýfý run () isimli bir methodu yenilendirir. Super Sýnýfýn Method Sunumuna Eklemeler Eðer sen yeni bir Window alt sýnýfý oluþturmak istiyorsan java.awt package içinde bulunan. Window sýnýfý bir tane yapýlandýrýcýya sahiptir. Bu method Frame argümanýna ihtiyaç duyar public Window(Frame parent) class RoundWindow extends Window { public RoundWindow(Frame parent) { super(parent); . . . // RoundWindow specific initialization here . . . } } Alt Sýnýfýn Methodlarý kesinlikle Yenilendirilmez • Eðer bir sýnýf final anahtar kelimesi ile üretilmiþse kesinlikle bu sýnýftan bir alt sýnýf oluþturulmaz.Eðer alt sýnýf oluþturulmak istenirse aþaðýda görülen hata mesajý verilir. FinalTest.java:7: Final methods can't be BY Ahmet Tolga Tat Sayfa 66 overriden. Method void iamfinal() is final in class ClassWithFinalMethod. void iamfinal() { ^ 1 error • Bunun yanýsýra static anahtar kelimesi ile üretilen alt sýnýflarda da hata mesajý oluþur. Methodlari bir alt sinifta yeniden sekillendirmek mumkundur. Bunu bir sinifta ayni isimli yordami kullanarak farkli isler yaptirmak. Bu ozellik kalitimin en onemli ozelligidir. Her zaman ust sinifin ifade ettigi seyleri yapmak zorunda kalmayiz bu ozellik sayesinde istedigim seyleri daha kolay bir bicimde yapabiliriz. Nesne(Object) Nedir ve Ne ise yarar? Nesne tabanli dilin içerisine aldigi gibi, nesnesel tabanli teknolojiyi anlamak için nesneler birer anahtar hükmündedir. Biz etrafimiza baktigimizda gerçek dünyada bir çok nesneyi görebiliriz. mesela köpek, sira, televizyon,bisiklet. Bu gerçek dünya nesneleri iki karakteristik özelligi paylasirlar. Onlarin hepsinin birer durumu ve hareketleri vardir.Örnegin, köpekler durumlari (ismi, rengi,soyu,aç veya tok olmasi)ve köpekler belirli hareketleri vardir. (havlamasi, isirmasi gibi).Bisikletlerin durumlarina örnek olarak ta (o anki vitesi, pedal ayari,iki tekerlekli olmasi,vites saysi) ve yapabilecegi hareketler(fren sikma,hizlanma,yavaslama,vitesleri degistirme). Yazilim nesne modellemede ayni yukarida ifade edilen nesneler iki karakteristil bulunur.durumu ve hereketleri.Yazilim nesneleri muhafaza eder onun durumu degiskenler olarak ve hareketler ise methodlar olarak gösterilirler. Tanim: Nesne bir degiskenlerin yazilim paketleri be onlarla ilgili olan methodlardir. Biz gerçek dünyadaki nesneleri yazilim kullanarak tasvirleyebiliriz..Biz gerçek dünyadaki bir köpegin bir animasyon programi olarak veya gercek dünyadaki bir bisiklatin elektronik bir alistirma bisikleti olarak tasvirlenmesini isteyebiliriz.. Fekat, biz yazilim nesnesini bir soyut model olarak kullaniriz. Örnegin,bir olay ortak nesnesi GUI içinde kullanimi fare ye tiklamak seklinde olusma seklindedir. veya bir butona basilmasi Yazilim nesnesinin bildigi hersey durumlar ve hareketler degiskenler ve methodlar olarak ifade edilir. Modellenen bir yazilim nesnesinde ornegin bir bisiklette degiskenlere sahiptir ve bunlar bisikletin o anki durumu içerir.Onun hizi 10 mphtir,ve onun pedal ayari 90 rpmtir, ve onun o anki vites 5inci vites. Bütün bu degiskenler ve methodlar normal olarak aralik degiskenleri ve aralik methodlari olarak bilinirler. Yazilim bisikleti ayni zamanda belirli methodlara sahiptir. Mesela, frene basilmasi pedal ayarinin degistirilmesi veya vites attirilmasi. (Bir bisiklet hizin degistirilmesi için gerekli methoda sahip olmayabilir. Biskletin hizi gerçekten kösesel etkileme olarak hangi vites BY Ahmet Tolga Tat Sayfa 67 ise.ve nasil hizla pedal çevriliyor ise veya nerde frene basiliyorsa.) Nesne degiskenleri merkezi tamamlar veya nesnenin çekirdegini..Methodlar çerçeveler ve saklar nesnein çekirdegini digier nesnelerin degiskenlerinden üretici method denir yani gruplama.Tipil olarak gruplama önemsiz detaylari saklamak için kullanilir. Biz istedigimiz zaman kendi bisikletimizin vitesini degistirebiliriz.,nasil bir mekanizam kullandigini bilmemize gerek yoktur.Benzer olarak yazilim programlarinda sinifin nasik ifade edildigini bilmemize gerek yoktur.Biz sadece istenilen metodu çagiririz.. Sonuç olarak bu ifade detaylari herhangi bir zamanda degistirilebilinir Gruplamanin Ehemmiyeti • Modulleme--nesnenin kaynak programinin bir nesne için yazilip gelistirilmesi tamamen kaynak koddon bagimsiz olarak genisletilebilinir.Ve, Nesne kolayca sistemin etrafinda dolastirilabilinir. Biz herhangi bir bisikleti degistirebiliriz bir baskasi için ve o hala çalisir. Bilgi saklama--bir nesne genel bir arabirime sahip olabilir ve diger nesneler o arabirimi kullanirlar.Fekat bu nesne kendi özel ve tüzel degiskenlerini ve methodlarini dgerlerinden saklayabilir.. Bizim bisiklet üzerindeki mekanimayi anlamamiza gerek yoktur. Mesajlar Object’miz yaratýldýktan sonra artýk bir baþka sýnýftan ona mesajlar gönderilebiliriz. Ýznimiz olan metotlarý çalýþtýrabilir, deðiþkenleri deðiþtirebiliriz. honda.sur(100); honda.dur() honda.renk=“mavi“; honda.depo++; //derleyici hatasý çünkü // depo private’dý. class Motor{ public void ayarlaMotorHýzý (int pedalPoz){ //gaz pedalýna göre motor hýzýný ayarla } } class Araba { private Motor arabaMot; private int pedalPoz; BY Ahmet Tolga Tat Sayfa 68 public Araba (String renk) { arabaMot = new Motor( ); } public void sur (int yeni_hýz) { ayarlaVites ( ) ; basPedal ( ); ... } public void basPedal ( ) { pedal Poz++; arabaMot.ayarlaMotorHýzý ( ) ; } ... } Java’da çöp toplama(Garbaje Collection) Object’ler yaratýlýr fakat bazen artýk programla iliþkileri kalmaz, böyle durumlarda eski object oriented diller de, mesela C++ ta kendimiz buna dikkat edip object’ti hafýzadan temizlemeliydik. Ama Java bunu otomatik kendi kontrol ediyor. Car murat; //hafýzada yer kaplama yok murat= new Araba („kýrmýzý“) // hafýzada bir murat object’ti murat =new Araba („mavi“) // hafýzada bir murat object’ti daha da oluþtu. Fakat eski murat’nýn programla ilgisi kalmadý ve Garbage Collector tarafýndan hafýzadan otomatik olarak silindi. Java’da alt sinif ve miras(Inheritance) BY Ahmet Tolga Tat Sayfa 69 Bazen elimizdeki sýnýflarý daha geniþ bir sýnýftan türer hale çevirmek isteriz. Veya elimizdeki sýnýftan (class) object deðil ama belli bazý detaylarý farklý daha doðrusu eklenmiþ olan daha özel sýnýflara türetebiliriz. Bunlara alt sýnýf diyoruz. Alt sýnýf oluþtuktan sonra üst sýnýfýn tüm özelliklerine sahip olur. Buna miras diyoruz. Önce genel bir sýnýf varsayalým. class Tasima { public boolean varTekerlek; public int sayýTekerlek; private int hýz; private float depo; public float okuDepo ( ) { ....... return depo; } public int okuHýz ( ) { .............. return hýz; } } Þimdi bu sýnýftan bir alt sýnýf türetelim. Alt sýnýf ve miras için Java „extend“ komutu kullanýlýr. class Bot extends Tasima{ public Bot ( ) { varTekerlek = false; sayýTekerlek = 0; } // Bota özel metotlar public void atDemir( ) { ... } //ayný zamanda tasima sýnýfýna ait diðer metotlarý da kullanabilir BY Ahmet Tolga Tat Sayfa 70 } Java’da öne geçme ve aþiri yükleme Bir inheritance yada türetme daha yapalým. Class SporAraba extends Araba {...} Method Overriding Bazen inherit ettiðimiz classlar’daki bazý metotlarý kullanma yerine önüne geçebilirsiniz. class SporAraba extends Araba { public void dur ( ) { //extend ettiðimiz araba sýnýfýnda da dur adlý bir metot olduðunu uygulaABS( ) ; //kabul ediyoruz fakat alt sýnýfta onun önüne geçiyoruz. hýz = 0.0; } ... } Method Overloading Bazende kendi içinizde ayný isimde fakat farklý deðiþkenler grubu alan metotlar yaratabilirsiniz. class SporAraba extends Araba { / / Ýki constructor public SporAraba (String renk) { ....... } public SportsAraba (String renk, String model) { ...... } ...} This & Super Bazen nesnenin direkt kendisine veya bazen de extend ettiði class’a ulaþmasý gerekebilir. Kendisine ulaºmak için „this“ kelimesini kullanabilir. public Araba (String renk ) {/ / constructor BY Ahmet Tolga Tat Sayfa 71 this.renk = renk; } Bir üst sýnýfa ulaþmak için „super“ kelimesini kullanýnýz. Class Myclass extends Frame { public Myclass ( ) { super („Frame Baþlýðý“); super.boyut( ) ; } public boyut( ) {... } } Genelde override ettiðimiz metotla geri dönmek için kullanýlýr. Tanimsiz siniflar(Abstract Classes) Bazý sýnýflardaki metotlarýn içine hiçbir þey yazmazsýnýz fakat tüm alt sýnýflarda override edilmesini istersiniz. Abstract metotlarý olan class’ýn kendiside abstracttýr ve asla yaratýlamaz. abstract class Tasima { public boolean varTekerlek; public int sayýTekerlek ; private int hýz; private float depo; public abstract void sur (int hýz); public abstract void dur ( ) ; public float okuDepo ( ){ ...... return depo; } public int okuHýz( ){ ......... BY Ahmet Tolga Tat Sayfa 72 return hýz; } } Sür ve dur sýnýflarýnýn içine hiçbir þey yazmýyoruz çünkü taþýtýn ne olacaðý belli deðil Fakat aþaðýda iki ayrý türeyen class var bu class’tan ikisininde inherit ettiði sür ve dur metotlarýnýn iç detaylarý farklý fakat mantýksal sonuçlarý ayný iþte buna polymorphism diyorduk. class Araba extends Tasima{ ... public void sur (int yeni_hýz) { ayarlaVites( ); basPedal ( ) ; ... } public void dur( ) { pedalPoz = 0; frenYap( ) ; hýz = 0.0; } ... } class Bot extends Tasima{ ... public void sur ( int yeni_hýz) { demirAl ( ) ; / / veya ipiCoz ( ) ; yolVer ( ) ; ... BY Ahmet Tolga Tat Sayfa 73 } public void dur( ) { yolPoz= 0; atDemir ( ) ; ... } } Java’da ulaþim kontrolü Java’da yeni bir class yani sýnýf yarattýðýmýz da, onun metotlarýnýn ve deðiþkenlerinin ve hatta kendisinin ulaþýlabilirlik detayýný ayarlayabiliriz. public – Her yerden her þekilde ulaþýlabilir. public void HerkeseAcýgým ( ) { } protected –Sadece sýnýf üyelerine uygulanabilir. Class üyeleri, altsýnýflar ve ayný pakettekiler ve hatta baºka pakete dahil alt sýnýflar tarafýndan ulaþýlabilir. protected void SadeceTanýdýklara ( ) { } private protected- Sadece sýnýf üyelerine uygulanabilir. Sadece sýnýf üyeleri ve ayný paketteki alt sýnýflara açýktýr.private – Sadece sýnýf üyelerine uygulanabilir. Sadece ayný class içindeki diðer metotlara açýktýr. private string þifre;(hiçbirþey yoksa en baþta) paketin diðer tüm üyelerine açýktýr. void PaketMetoduyum ( ) { } final – Final yani sabit deðer olarak tanýmlanan deðiþkenler taným sýrasýnda deðer almak zorundadýr. Ve hiçbir zaman bir daha deðiþtirilemez ve öne geçilemezler ( overridden) ve de final olarak tanýmlanan sýnýflarýn alt sýnýflarý olamaz. final int i=0; BY Ahmet Tolga Tat Sayfa 74 final void no_overide ( ) { } Static degiskenler ve Metodlar Sýnýfta bir deðiþken static olarak tanýmlandýðýnda ondan türeyen tüm alt sýnýflarda bu deðiþkenin deðeri hep ayný olacaktýr, birinin yaptýðý deðiþiklikten hepsi etkilenecektir. class Takvim extends Baski{ static string Yýl = „2003“; } Tüm türevlerde Yýl’ýn deðeri 1998’dir. Fakat eðer bir i deðiþtirirse hepsinde deðiþir. Metotlarda ise önemli nokta static tanýmlý metotlarda ulaþýlan tüm deðiþkenler de static olmalýdýr. class Dokuman extends Sayfa { static int versiyon = 10; int bolum_sayýsý; static void bolum_ekle ( ) { bolum_sayýsý++; / / bu calýþmaz } static void versiyon_duzelt (int ver) { versiyon=ver; / / bu çalýþýr }} Java’da paketler(Packages) Packages kelimesi, class’larýn ve arabirimlerin gruplandýrýlmasýna yardýmcý olur. Paket isimleri ( . ) ile ayrýlmýþ kelimelerden oluþur ve bu kelimeler ayný zamanda klasör isimleridir. Örneðin; Applet package’ý 4 sýnýftan oluþur. Applet.class Appletstub.class BY Ahmet Tolga Tat Sayfa 75 Applet Conntext.class AudioClip.Class Ve bu dört sýnýfýn kaynak kodlarýný jdk1.1.6\src\java\applet dizini altýnda bulabilirsiniz ve eðer hepsinin içine bakarsanýz ilk satýrlarýnda Package java.applet; Komutunu görebilirsiniz. Bu komutla bu dört ayrý class ta java klasörünün altýndaki applet klasörüne kayýtlý olacak demektir. Eðer sizde kendi paketlerinizi yaratmak isterseniz dosyanýzý – d opsiyonuyla derlemeniz gereklidir. javac -d /Sýnýflarým dosyam.java //burada Sýnýflarým derlenince paket kabul edilen //dosyalarýn kayýt olacaðý dizindir. import komutunun kullanilisi: import paketismi.sinif; import paket ismi.*; Örnek: Import java.util.Hashtable; Import java.awt.*; Paketleri almak için import komutu kullanýlýr. import java.util.Date; veya * kullanarak bütün paketi alabilirsiniz import java.awt.*; Java 1.1’de standart olarak bulunan paketler. § java.lang § java.lang.reflect § java.awt § java.image § java.awt.event § java.awt.peer § java.awt.datatransfer § java.applet § java.io § java.net § java.math § java.beans § java.rmi § java.rmi.dgc § java.rmi.registry § java.rmi.server BY Ahmet Tolga Tat Sayfa 76 § § § § § § § java.security java.security.acl java.security.interfaces java.sql java.text java.ut il java.util.zip Arayüzler(Interfaces) Bazen sýnýfýnýz bir üst sýnýftan türemesine raðmen baþka bir sýnýfýn avantajlarýný yani metotlarýný da kullanmak isteyebilir. Böyle durumda interface dediðimiz ara iletiþim kabuklarýna ihtiyaç duyarsýnýz. Bu ara katmanlarý sýnýfýnýza almak için implements kelimesi kullanýlýr. Örnek: public class Client extends Thread{...} //Thread sýnýfýndan türemiþ bir sýnýf. Fakat, eðer baþka sýnýftan türemek ve de Thread sýnýfýnýn özelliklerini kullanmak isterseniz Thread için yazýlmýþ Runnable Interface’ini kullanýrýz Exceptions Java dili týpký C de olduðu gibi belli hatalý durumlarda bu hatalarýnýzý yakalayýp size bildirebilir ve hatta onlardan kaçabilir.Bilinen bazý hata durumlarý: • ArithmeticException – 0 a bölünme hatasý • NullPointerException – Bir objecte veya metoda yapilmadan önce ulaºmaya çalýþma. • ClassCastException – Farklý sýnýftan bir objeyi baþka bir sýnýfa atamak. • NegativeArraySizeException – Negatif uzunlukta bir dizi yaratma hatasý • OutOfMemoryException – Yeni obje yaparken hafýzaya sýðmama hatasý • ArrayIndexOutofBoundsException – Dizinin uzunluðundan daha fazla olan bir elemana ulaþmaya çalýþma. Java’da hata idaresi Hatalarý idare edebilmek için Java’nýn bize verdiði iki komut vardýr. BY Ahmet Tolga Tat Sayfa 77 try { //tehlikeli kod }catch (exceptionTipi e){ //hata anýnda yapýlacak olan iºlem } örnek: public void paint (Graphics g) { try { g.drawString (Kelimeler [ i ] , 25 , 25) ; } catch (ArrayIndexOutOfBoundsException e) { g.drawString („kelimeler sýnýr dýþý“ ,25,25) ; i=-1; } i++; } Kendi Exception’larýmýz Yapma Class BenimHatam extends Exception{} Exception’ýmýzý Atma throw new BenimHatam(); Örnek: public void baglaBeni (String serverAdi) throws ServerCevapsizException{ int tamam; int portServer = 80; tamam = open (serverAdi, portServer) ; if (tamam = = -1) { throw new ServerCevapsizException ( ) ; } } veya public void findServer ( ) { . . ..... try { BY Ahmet Tolga Tat Sayfa 78 baglaBeni (server) ; } catch (ServerCevapsizException e) { g. drawString („ server cevapsýz baska deniyorum“, 5, 5); try { baglaBeni(baskaServer) ; } catch (ServerCevapsizException e) { g.drawString („serverlarýn hiçbiri cevap vermiyor“ , 5,5); } } ....} BY Ahmet Tolga Tat Sayfa 79 Multithreading Paralel Kullanim Multitasking ile Multithreading Arasinda Ne Fark Vardir? Ilk zamanlarda bilgisayarlar belirli bir anda sadece bir isi yapabilir yetenekteydi. Ornegin, bir labaratuvardaki bilgisayar once fizikci icin dalgalarin gecikme suresiyle ilgili hesabi yapacak, daha sonra kimyaci icin karisim oranlarini hesaplayabilecekti. Tum programlar, belirli bir sira dahilinde ve belirli bir anda bilgisayarin sadece birinin hizmetine verilmesi seklinde calistiriliyordu. Ayni anda birden fazla programin icrasi soz konusu degildi. Bu teknige batch processing denir ve pahali bir bilgisayarin max faydada kullanimi adina oldukca etkili bir yontemdir. Cunku bu yontemde bilgisayarin tum kaynaklari islem yapmak icin kullanilmakta, birden cok is arasinda gelgitler yapilmasindan dolayi gelecek zaman ve performans kaybi engellenmis olacaktir. Fakat batch processing bir sistemin negatif bir yonu de vardir. Ornegin nükleer yapi modellemesi yapan ve 3 gun icinde hayata gecirilmesi planlanan bir projenin bir parcasi olan diferansiyel denklem programi CPU zamaninin buyuk bir kismini kullanir ve bir satirda takilip tum sistemi kullanilmaz hale getirir se, bu durum hic de arzulanmayacak bir durum olacaktir. Zaman paylasimli isletim sistemlerinin gelistirilmesi, birden cok kullanicinin ayni anda pahali bir bilgisayari kullanimini mumkun hale getirmistir. Boyle bir sistemle birden cok kullanici programlarini ayni anda calistirabilir. Isletim sisteminin gorevi, islemci zamanini bu programlar arasinda paylastirmaktir. Az once verilen ornege geri donulurse; diferansiyel denklemlerin hesaplanmasi ile fizik departmanindaki nükleer modelleme programi ayni anda calistirilabilir. Belki bu nukleer modelleme programi 3gunde degil de 2 haftada tamamlanir ancak her iki iste de yavas ama tatminkar sonuclar elde etmek mumkun olur. Buna karsilik sistemi ayni anda kullanma istegi sadece kullanicilardan gelmez. Ayni zamanda bircok programda birden cok isi bir arada yapma gereksinimi duyabilir. Mesela web gezgininde geri planda bir sayfa yazdirilirken bir pencerede de sayfa yuklenirken formatlanabilir. Iste tek basina bir programin birden fazla isi ayni anda yapabilmesi thread kullanimi sayesinde gerceklesir. Giris Java programlama dilininin en onemli ozelliklerinden biri de Multithreaded Mimariyi destekliyor olmasidir. Bu mimari, bir bilgisayar programinin komutlarinin icrasinin kontrolunu ve BY Ahmet Tolga Tat Sayfa 80 iyilestirilmesini sagladigi icin bilgisayar bilimleri acisindan cok guclu ve hatiri sayilir bir gerceklestirim olarak degerlendirilmelidir. Java da bu mimariyi icerisinde barindirma özelligi ile benzerlerinden ayrilan, en cok kullanilan, genel amacli programlama dillerinden biridir. Diger programlama dillerinde olmayan (ancak isletim sisteminin destekledigi) “eszamanli calisma prensipleri” (concurrency primitives) bu dilin yapisi icerisinde PC uygulama gelistiricisine sunulmaktadir. Uygulama gelistiricinin gorevi, uygulamalari icra bloklarina(threads of execution) ayirmaktir. Burada her blok diger bloklarla es zamanli olacak sekilde kendi basina icra edilir. Iste bu mekanizma multithreading mekanizmasi olarak adlandirilir. Java programlama dilini benzerleri olan C and C++ a göre daha guclu kilacak olan mekanizmada budur. Bu diller, belli bir zamanda ancak bir blogun icra edilmesini desteklemektedir. Es zamanli uygulama gereksinimi duyulabilecek alanlara ornek verelim : Ornegin bir program WWW uzerinden, cok buyuk bir video clip ya da ses clip dosyasini indirirken, dosyanin iceriginin gorulebilmesi icin tamaminin yuklenmesini beklemek kullanici acisindan hic de iyi bir durum degildir. Iste bu durumda coklu icra bloklarina basvurulabilir. Bir icra blogu dosyanin indirilmesi(yuklenmesi) ile mesgul olurken, es zamanli calisan bir baska icra blogu dosyayinin iceriginin goruntulenmesi ile mesgul olabilir. Burada yuklenmis olan dosya parcasinin iceriginin duzgun olarak goruntulenmesi icin icra bloklari arasinda bir koordinasyondan bahsetmek gerekir. Bir baska ornek de; Java ile birlikte gelen otamatik “automatic garbage collection” yapisidir. Bir garbage collector thread araciligiyla icra edilen programin dinamik olarak bellekte isgal ettigi sahalar yine dinamik olarak kullanilmadigi zaman bir baska is icin kullanilmak uzere serbest birakilir. Bu thread dusuk-oncelikli olarak calismaktadir. Java, dunyanin en populer tasinabilir programlama dillerinden birisi olmasina ragmen bazi belirli kisimlari platform bagimli olarak calismaktadir. Dolayisiyla, coklu thread uygulamalari farki Java implemantasyonlarinda farkliliklar gosterebilir. 32-bit olarak gelistirilen ve Windows 95 ve Windows NT uzerinde calisan Java uygulamalari zaman paylasimli olarak calismaktadir(timesliced). Round-Robin algoritmasinin kullanilmasi ile, her icra blogunun her seferinde bir zaman araligi boyunca icra gormesi saglanmaktadir. Thread Nedir? Thread birbirinden ayrik ayni anda meydana gelmekte olan diger olaylardan bagimsiz olarak icra edilebilen kod topluluklaridir. Bir thread, A noktasinda calistirilmaya baslanan ve B noktasina kadar calismaya devam eden klasik bir program olarak nitelendirilebilir. Fakat thread in farkli olabilecek olan yani, yapisinda bir olay dongusune yer vermeyecek olusudur. Bir thread,sistemde meydana gelen diger olaylardan bagimsiz olarak calisir. Basit bir thread uygulamasi Thread leri kullandiginiz bir program yazarken herbiri kendi run() metoduna sahip olan farkli farkli programlar yaziyormus gibi dusunebilirsiniz. Kullanacaginiz her thread java.lang.Thread sinifinin bir alt sinifi olacaktir. Asagidaki program threadlerden olusmustur ve -128 ile 127 arasindaki sayilari ekrana yazdirmaktadir. public class BytePrinter extends Thread { BY Ahmet Tolga Tat Sayfa 81 public void run() { for (int b = -128; b < 128; b++) { System.out.println(b); } } } Asagidaki program da tek bir BytePrinter thread inin icrasini saglamak uzere tasarlanmistir : public class ThreadTest { public static void main(String args[]) { BytePrinter bp = new BytePrinter(); bp.start(); } } Coklu Thread uygulamasi Asagidaki program da 3 tane BytePrinter thread calistirabilir ozelliktedir: public class ThreadsTest { public static void main(String args[]) { BytePrinter bp1 = new BytePrinter(); BytePrinter bp2 = new BytePrinter(); BytePrinter bp3 = new BytePrinter(); bp1.start(); bp2.start(); bp3.start(); } } Programin cikti sirasi programdan anlasilabilecegi uzere tasarim bagimlidir ve cogunlukla onceden tayin edilemeyecek bir goruntu sergilemektedir. Bu durumda 3 thread biri digerini takip eder sekilde sirayla calistirilir. Buna karsilik bazi sistemlerde de asagidakine benzer bir cikti goruntusu ile karsi karsiya kalinabilir : Bu durumda ise 3 farkli thread den gelen sonuclar kendi aralarinda karismistir. Bazi sistemler biribiri ile koordinasyon icinde calisan thread ler kullanir, bir thread de digerine gecilmesi calismakta olan thread in kontrolu diger thread e aktarmasi yoluyla gerceklesir. Esit oncelikli bir thread bile kendisinden onceki thread in tamamlanmasini beklemek zorundadir. Diger sitemler ise ayni oncelge sahip olan threadler arasinda zaman paylasimi yontemine basvurmaktadir. Bu paylasima ragmen thread lerin ciktilari arasinda bir karisiklik gorulmez. BY Ahmet Tolga Tat Sayfa 82 Thread Sinifi-Metotlari Multithreading mekanizmasi tek basina bircok thread in es zamanli olarak icrasi anlamina geldigini belirttigimize gore, burada thread kavraminin uzerinde biraz daha durulmalidir. Thread, bir process icinde tek basina isletilen icra blogu olarak adlandirilabilir. Bir process kendi bellek uzayinda icra edilen program parcasi olarak tanimlanacak olursa, burada thread lerin kendilerine ait belirli bir adres uzaylari olmadigi belirtilmelidir. Her thread, kendisinin parent ligini yapan processin bellek alanindan faydalanir. Bu sekilde calisan bircok thread ornegi verilebilir. Mesela; Word un icerisinde geri planda otomatik ve eszamanli olarak calisan bir cok thread den bahsetmek mumkundur. Bu thread lerden biri yazilanin imla kontrolunu yaparken, bir digeri yapilan degisiklikleri otomatik olarak dokumana kaydeder. Burada uzerinde durulmasi istenen nokta, her thread in bir process dahilinde icra ediliyor olmasidir. Thread Sinifi bir cok sekilde yapilandirilabilir. Mesela ; public Thread ( String threadName ) ifadesi ismi threadname olan bir thread sinifini insa etmek icin kullanilir. Bir baska ifade ; public Thread() ismi “Thread” kelimesinin yanina getirilen birer rakam ile Thread1,Thread2 isimli thread lerin insasi icin kullanilir. Bir thread’de asil isi yapan bolum run metodudur. Bu metot, thread in bir alt sinifinda override edilebilecegi gibi bir Runnable object icerisinde de override edilebilir. Runnable Interface, Java ile birlikte gelen onemli ozelliklerden biridir. Herhangi bir thread in icrasi ilgili thread in start metodu ile gerceklestirilir. Daha sonra start metodu run metodunu aktif hale getirir. start metodu thread i calistirir calistirmaz kendisini cagiran metoda geri donecektir. Bundan sonra, start metodunu aktif hale getiren metod eszamanli thread icrasini gerceklestirecektir. Eger bir threadin icrasi basladiktan sonra tekrar baslatilmaya calisilirsa bu durumda “start” metodu IllegalThreadStateException mesaji verir. static sleep metodu icra edilmekte olan thread’in ne kadar sureyle (milisaniye cinsinden) uyku moduna gececegi ile ilgili ayarlarla ilgilenir. Bir thread uyku moduna gectigi zaman islemci diger thread lerin icrasi icin kullanilabilir demektir. Boylelikle dusuk-oncelikli thread ler de icra edilme sansini yakalayabilmektedir. interrupt metodu belir lenen bir thread in icrasini kesintiye ugratmak icin kullanilir. Eger icra basari ile kesilirse statik olan interrupted metodu true deger aksi takdirde false deger dondurecektir. Boyle bir kesintiden diger thread lerin de haberdar olmasi statik olmayan isInterrupted metodunun cagrilmasi yoluyla gerceklestirilir. suspend metodu, icra gormekte olan bir thread in askiya alinmasini gerceklestirir. resume metodu ise icrasi askiya alinmis olan bir thread in tekrar kabulu ile gorevlidir. Eger askiya alinmamis ve hali hazirda icra edilmekte olan bir thread resume edilmeye calisilirsa bu durumdan etkilenmeden icrasina devam edilir. stop metodu belirli bir thread in icrasini durudurarak bir ThreadDeath objesi. Yaratilmasina sebep olur. Cogunlukla kullanicilar stop metodunu parametresiz olarak kullanmayi tercih eder. Eger bir thread in start metodu aktive edildiyse ve stop metodu halen cagrilmadiysa isAlive metodu ilgili thread in icra edilmekte olduguna dair true degeri dondurecektir. yield metodundan daha sonra Thread Oncelikleri kisminda bahsedilecektir. setName metodu belirli bir thread in isminin set edilmesinde, getName metodu ise o metodun isminin geri dondurulmesinde kullanilmaktadir. Statik bir metot olan currentThread ise sozu gecen thread e ait referans degerini geriye dondurur. Parametresi milisaniye cinsinden gonederilen join metodu icra edilmeyi bekleyen thread e icra edilmekte olan thread in ne kadar zaman icerisinde icrasini tamamlayacagi ile ilgili mesaj BY Ahmet Tolga Tat Sayfa 83 gonderir. Eger hicbir parametre gecilmediyse ya da parametre olarak 0 milisecond kullanildiysa bu durumda icra edilmeyi bekleyen thread, icra edilmekte olan thread sonlanan dek hep bekleyecek demektir. Thread’in Girebilecegi Durumlar-Hayat Dongusu Herhangi bir anda bir thread farkli durumlar icerisine girmis olarak nitelendirilebilir (thread states). born - ready - running - waiting - sleeping - suspended - blocked - dead Diyelim ki ; thread imiz born durumunda. start metodu cagirilincaya dek thread in icinde bulundugu surecdir ve thread in ready durumuna gecmesini saglar. Sistem islemcisinden bir thread icrasi istediginde, en yuksek-oncelige sahip olan ready durumundaki thread running durumuna gecmeye hak kazanir ve icra edilir. Bu thread, dead durumuna iki sekilde ulasabilir : Ilki run metodu tamamlandigi zaman, ikincisi stop metodu cagrildigi zaman. dead durumuna giren bir thread zaman icerisinde sistemden uzaklastirilacaktir. running durumunda olan bir thread bir I/O isteginin gelmesi durumunda blocked durumuna gececektir. blocked durumuna sokulmus olan bir thread istedigi I/O islemi gerceklesir gerceklesmez tekrar ready durumuna girecektir. Belirli bir thread in sleep metodu cagrildiginda bu thread sleeping durumuna gececektir. Uyku moduna girmis bir thread belirlenen uyku suresi biter bitmez tekrar ready durumuna girer. Icra edilmekte olan bir thread in suspend metodu cagirilirsa, ilgili metot suspended durumuna girecektir. Askiya alinmis bir thread baska bir thread, resume metodunu cagirinca tekrar ready durumuna girer. Calistirilmakta olan bir thread e ait wait metodu cagrildiginda ise bu thread waiting durumuna girecektir ve wait metodunun cagrildigi objeye ait olarak tutulan bir kuyrukta saklanacaktir. Bu obje ile ilintili bir baska thread bu kuyrukta bekleyen ilk thread e bir notify gondererek bu threadin tekrar ready durumuna gecmesine sebep olur. Thread Öncelikleri ve Thread Zamanlamasi Her Java appleti ya da uygulamasi multithreaded ozelliktedir. Her Java thread i de derecelendirme acisindan bir oncelige sahip olmalidir. Thread. MIN_PRIORITY (1 sabit degeri) and Thread. MAX_PRIORITY (10 sabit degeri). Default olarak, her thread e bir oncelik verilirThread. NORM_PRIORITY (5 sabit degeri). Yeni bir thread yaratildiginda onceligi, kendisini tureten threadden miras alinir. Bazi Java pla tformlari timeslicing mekanzimasini desteklerken bazilari etmez. Timeslicing olmadiginda, esit oncelige sahip olan bir grup thread icerisindeki bir thread icra edilirken digerleri icra edilme sanslarini (o an icin) yitirmis olurlar. Ote yandan timeslicing oldugu zaman, her thread quantum denilen zaman dilimleri sayesinde icra edilebilmeleri icin islemciden faydalanabilirler. Her quantum suresinin tamamlanmasinda, BY Ahmet Tolga Tat Sayfa 84 ilgili thread icrasini tamamlamamis bile olsa, islemci bu icra isleminden alinarak, icra edilmeyi bekleyen bir diger esit-oncelikteki thread in islenmesi icin kullanima atanir. Java scheduler in gorevi ise her zaman en yuksek-oncelikli thread in icra edilmesinin saglanmasidir. Eger timeslicing mekanzimasi mevcutsa scheduler, her thread in round-robin algoritmasi kapsaminda belirlenen quantumlar suresince icra edilmesini duzenler. Dusukoncelikli thread lerin oncelikleri sebebiyle ertelenmesi starvation denilen bir problemi gundeme getirecektir. Belirli bir thread in onceligi, bir tamsayi degeri donduren setPriority metodu ile belirlenir. Eger dondurulen deger ( 1 - 10 ) araliginda degilse, setPriority metodu IllegalArgumentException geri dondurur. getPriority metodu cagrilinca, ilgili thread in onceligi geriye dondurulur. Bir thread yield metodunu cagirmak suretiyle diger thread lere icra icin bir sans vermis olur. Aslinda yuksek-oncelikli bir thread ready olur olmaz, mevcut thread geri plana itilerek yeni gelen threade oncelik taninir. Dolayisi ile bir thread kendisinden daha yuksek bir oncelige sahip olan ready bir thread e yield metodu ile cagirim yapamaz. Benzer sekilde, yield metodu herzaman en yuksek-oncelikli ready durumdaki thread in isletilmesini sagladigi icin, sadece geriye kalan threadlerin hepsinin daha dusuk-oncelikte olduklari durum ic in mevcut thread en yuksek oncelige sahip olmus olacaktir. Bu sebepten dolayi, bir thread in yield metodu sayesinde esit-oncelikli thread lere icra sansi verdigi soylenebilir. Zaman paylasimli (timesliced) bir sistemde herhangi bir threadin yield metodu ile diger esit-oncelikli threadlere icra hakki tanimasi gereksizdir. Cunku Round-Robin algoritmasi sagladigi quantum mekanizmasi sayesinde bu durumu kapsamaktadir. Oyleyse, yield metodu zaman paylasimsiz (non-timesliced) sistemler icin uygun olacaktir. Boyle bir sistemde, esit-oncelikli bir thread in icra edilebilmesi icin bir diger esit-oncelige sahip thread in icrasini tamamlamis olmasi gerekir. Herhangi bir threadin icrasi, oldurulene dek, ya da I/O icin bloke edilene dek, ya da sleep, yield metodlari cagrilincaya dek, ya da daha- yuksek oncelikte bir thread tarafindan geri plana itilene dek, ya da zaman quantumu tamamlanana dek surdurulur. Mevcut thread den daha yuksek bir oncelige sahip olan bir thread suspended durumdan resume edilerek ready durumuna getirilebilir ya da sleeping durumundaki bir thread uyku modundan cikarak ready olabilir, ya da beklenen I/O islemi sonuclandiysa bloke edilmis olan thread tekrar ready konumuna donebilir, ya da waiting durumundaki bir thread notify veya notifyAll metodlarindan biri ile cagrildiysa ready durumuna gecer. Asagidaki Program Chris in onceligini Mary'den daha yuksek, Mary’nin onceligini de Frank'tan daha ustun tutmustur. Buna gore Chris calismaya en son, ve Frank da calismaya ilk baslasa bile, Chris calismasini Mary den once Mary de Frank’dan once tamamlamis olacaktir. Örnek: public class MixedPriorityTest { public static void main(String args[]) { NamedBytePrinter bp1 = new NamedBytePrinter("Frank"); NamedBytePrinter bp2 = new NamedBytePrinter("Mary"); NamedBytePrinter bp3 = new NamedBytePrinter("Chris"); bp1.setPriority(Thread.MIN_PRIORITY); bp2.setPriority(Thread.NORM_PRIORITY); bp3.setPriority(Thread.MAX_PRIORITY); bp1.start(); bp2.start(); bp3.start(); } } BY Ahmet Tolga Tat Sayfa 85 Asagida ise bazi temel threading tekniklerinden olusan bir Java uygulamasi verilmistir. Burada Thread sinifindan bir nesne yapilmasi, bu Thread nesnesinin insasi ve bu Thread sinifinin sleep metodunun kullanilmasi gorulmektedir. Programda her thread rastgele 0 ile 5 arasinda belirlenen zaman dilimlerinden sonra isimlerini gostermektedirler. Bu program PrintThread ve PrintTest adinda iki tane sinif icermektedir : Örnek: public class PrintTest{ public static void main(String args[] ) { PrintThread thread1,thread2,thread3,thread4; thread1=new PrintThread( "1" ); thread2=new PrintThread( "2" ); thread3=new PrintThread( "3" ); thread4=new PrintThread( "4" ); thread1.start(); thread2.start(); thread3.start(); thread4.start(); }} Örnek: class PrintThread extends Thread{ int sleepTime; public PrintThread(String id) { super(id); sleepTime = (int) (Math.random() * 5000); System.out.println( "Isim: " + getName() + "; sleep: " + sleepTime ); } public void run() { try { sleep(sleepTime); } catch(InterruptedException exception) { System.err.println( "Exception: " + exception.toString() ); } System.out.println( "Thread " +getName() ); } } Thread eszamanlama Java thread eszamanlama islemini gerceklestirebilmek icin monitor Synchronized(eszamanlanmis) metotlari olan her nesne bir monitor nesnesidir. BY Ahmet Tolga Tat ler kullanir. Sayfa 86 Monitor her seferinde ilgili nesnenin eszamanli metotlarindan birini calistirmak ile gorevlidir. Bu eszamanli metotlarin calistirilmasi ilgili nesnenin locking edilmesi ile saglanir. Eger bir nesnenin birden fazla eszamanli metodu varsa; belirli bir anda sadece o nesneye ait bir metot calistirilabilir. Diger metotlari kullanmak isteyen eszamanli thread ler beklemek zorundadir. Bir synchronized metodun calistirilmasi sona erince, o nesnenin lock ozelligi ortadan kaldirilir. Bundan sonra da monitor, en yuksek-oncelige sahip olan ready thread in eszamanli metodunun icrasina firsat verecektir. Asynchronized (Eszamansiz) modda calismakta olan bir thread calisamayacagina karar verebilir ve gonullu olarak wait bekleme durumuna gecebilir. Bu karar, bu thread in monitor nesnesinin denetiminden cikmasi anlamina gelir. Bundan sonra, ilgili thread diger threadlerin monitor nesnesinden faydalanmasina firsat vermek uzere bir kuyruga girerek beklemeye baslar. Eszamanli bir metodu icra eden bir baska thread isini bitirince, monitor nesnesi beklemekte olan bir thread in tekrar ready durumuna girmesini saglar. Ayni zamanda nesnenin bir baska threadi calistirmamasi icin lock edilmesi olayi gerceklestirilir. Iste bu esnada notify metodu bekleme durumunda olan thread in bekledigi kosulun saglandigi ve tekrar monitore girebilecegine dair habercilik gorevini gorur. Eger bir thread notify yerine notifyAll metodunu cagirirsa bu durumda nesneyi bekleyen tum threadler monitore girebilmek icin uyanirlar. Monitor, eszamanli metotlari calistirabilmek icin bekleyen tum threadleri bir kuyruga sokar. Eger bir baska nesne, kuyrukta beklemekte olan thread in calistirmak istedigi metodu zaten kullanmata ise bu thread kuyruktan alinir ve sira ona gelmis olur. Bir diger yol da nesnenin icinde aktif olan thread in wait durumuna girmesidir, onun yerine de kuyrukta thread isleme koyulur. Monitor eszamanli bir metodun icrasinin tamamlar tamamlamaz, sira diger metotlara gelir. wait durumunda beklemekte olan threadlerin aktive edilmesi bir baska thread in notify ya da notifyAll metodlarindan birini cagirmasi yoluyla gerceklesir. Eger monitor bir baska thread e servis verme durumuna girmisse bu durumda scheduler en yuksek-oncelikli thread i secer ve icra edilmesini saglar. Eszamanli olmayan Thread ler ile Servis Veren/Servis Alan Iliskisi Servis Veren/Servis Alan iliskisinde servis veren thread servis verdigi thread icin cagirdigi produce metodu karsiliginda servisi alan tarafindan paylasilir bir bellek alani olan buffer daki son mesaji almamis oldugunu gormesi sonucu servis veren taraf wait metodunu cagiracaktir. Servis almak isteyen taraf da buna karsilik mesaji okudugunda servis verecek olan thread e servis almaya hazir oldugunu belirtmek uzere notify mesaji gonderecektir. Paylasima acik olan bellekteki bu mesaj bilgisi, bircok thread tarafindan bellege yapilan erisimlerin zamanlanmamasi sonucunda bozulabilir. Dolayisi ile bu erisimlerin belirli bir duzene oturtulmasi gerekecektir. Eger servis almak isteyen thread, servis verecek thread var olan mesaji okuyup degerlendirmeden once bir yenisini koyarsa bilgi kaybolacaktir ya da bozulacaktir. Asagidaki uygulama bu duruma ornek gosterilebilir : //SharedCell.java source public class SharedCell{ public static void main(String args[]){ HoldInteger h = new HoldInteger(); ProduceInteger p = new ProduceInteger(h); BY Ahmet Tolga Tat Sayfa 87 ConsumeInteger c = new ConsumeInteger(h); p.start(); c.start(); } } class ProduceInteger extends Thread { private HoldInteger pHold; public ProduceInteger(HoldInteger h){ pHold=h; } public void run(){ for (int count=0;count < 10;count++){ pHold.setSharedInt( count ); System.out.println( "Producer set sharedInt to " + count ); //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e){ System.err.println( "Exception " + e.toString() ); } } } } class ConsumeInteger extends Thread { private HoldInteger cHold; public ConsumeInteger(HoldInteger h){ cHold=h; } public void run(){ int val; val=cHold.getSharedInt(); System.out.println( "Consumer retrieved "+val); while (val!=9){ //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e) { System.err.println( "Exception " + e.toString() ); } val=cHold.getSharedInt(); System.out.println( "Consumer retrieved " + val ); } } } class HoldInteger{ private int sharedInt; public void setSharedInt( int val ) {sharedInt=val;} public int getSharedInt() { return sharedInt;} } Bu program 4 adet sinif nesnesi kullanmaktadir-SharedCell, ProduceInt, ConsumeInteger and HoldInteger. Bu ornekte; (Program ciktisindan da gorup degerlendirebileceginiz uzere) paylasima acik olan bilgilere birden cok thread tarafindan eszamanli olarak erisim sonucunda ortaya cikabilecek hatali sonuclar gorulebilmektedir. Bu problemi cozebilmek icin, erisim isteyen servis verici ve servis alici thread ler arasinda bir synchronize(zamanlama) mekanzimasi gerceklestirilmelidir. Bu mekanizmadan kasit; paylasima acik olan bilgilere ulasmak isteyen her metot synchronized anahtar kelimesi ile birlikte gecirilmesidir. BY Ahmet Tolga Tat Sayfa 88 Eszamanli Thread‘ler ileServis Veren/Servis Alan Iliskisi Asagida verilmis olan ornek, yukaridaki ornegin eszamanli hale getirilmis versiyonudur. //SharedCell.java source //with thread synchronization public class SharedCell{ public static void main(String args[]){ HoldInteger h = new HoldInteger(); ProduceInteger p = new ProduceInteger(h); ConsumeInteger c = new ConsumeInteger(h); p.start(); c.start(); } } class ProduceInteger extends Thread { private HoldInteger pHold; public ProduceInteger(HoldInteger h){ pHold=h; } public void run(){ for (int count=0;count < 10;count++){ pHold.setSharedInt( count ); System.out.println( "Producer set sharedInt to " + count ); //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e){ System.err.println( "Exception " + e.toString() ); } } } } class ConsumeInteger extends Thread { private HoldInteger cHold; public ConsumeInteger(HoldInteger h){ cHold=h; } public void run(){ int val; val=cHold.getSharedInt(); System.out.println( "Consumer retrieved "+val); while (val!=9){ //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e){ BY Ahmet Tolga Tat Sayfa 89 System.err.println( "Exception " + e.toString() ); } val=cHold.getSharedInt(); System.out.println( "Consumer retrieved " +val ); } } } class HoldInteger{ private int sharedInt; private boolean writeable =true; public synchronized void setSharedInt( int val ) { while (!writeable){ try{wait();} catch(InterruptedException e){ System.err.println( "Exception : " + e.toString() ); } } sharedInt=val; writeable=false; notify(); } public synchronized int getSharedInt() { while (writeable){ try{wait(); } catch(InterruptedException e){ System.err.println("Exception:"+e.toString() ); } } writeable=true; notify(); return sharedInt; } } Servis veren/Servis Alan Iliskisi-Dairesel Gecici Bellek Eszamanli Thread ler ile Servis veren/Servis Alan Iliskisi bolumunde verilen ornek programda servis alan ve veren her iki tur metot da erisimi dogr u bir sekilde gerceklestirmektedir fakat bu yaklasim performans acisindan iyi bir sonuc sergileyemeyecektir. Bunun sebebi de thread lerin eszamansiz (asynchronously) olarak calisiyor olmasidir. Bu durumda bu thread lerin birbirlerine kiyasla icra hizlari onceden tayin edilemez. Eger servis veren taraf, servisi servis alan tarafin alabilecegi hizdan daha hizli bir sekilde vermek istiyorsa bunu yapamaz. Iste boyle bir durumu mumkun kilabilmek icin dairesel bir gecici bellek (circular buffer) kullanimina gidilir. BY Ahmet Tolga Tat Sayfa 90 Daemon Thread’ler Calisma zamani platformunu desteklemek uzere geri planda calismakta olan threadler daemon thread lerdir Mesela, clock handler thread, idle thread, garbage collector thread, screen updater thread, ve garbage collector thread leri daemon thread lerdir. Sistem tum non-daemon thread ler tamamlanir tamamlanmaz kapanir. public final void setDaemon(boolean isDaemon) public final boolean isDaemon() Default olarak yarattiginiz bir thread, daemon bir thread degildir. Fakat setDaemon(true) metodunu kullanmak suretiyle thread in daemon olmasi saglanabilir. Thread Gruplarý Thread ler, gruplara gore organize edilebilir. Her thread grubu ise birbiri ile iliskili bir dizi thread den meydana gelir. Ornegin, bazi guvenlik sebeplerinden dolayi bir applet sadece kendi thread grubuna mensup olan threadleri kullanma hakkina sahiptir. Dolayisi ile bir applet sistemin garbage collection thread ini devre disi birakamaz. Thread gruplari da kendi aralarinda parent and children hiyerarsik yapisina sahiptirler. Asagidaki program da su metotlari kullanarak tum aktif thread leri yazdirir : java.lang.Thread sinifina ait getThreadGroup() metodu ve java.lang.ThreadGroup sinifina ait getParent() metodu. (Bu metotla en ust seviyedeki thread grubuna ulasiliyor.); daha sonra da enumerate ile main thread grubundaki tum thread ler ve cocuklari (tum gruplari kapsayan). Örnek: public class AllThreads { public static void main(String[] args) { ThreadGroup top = Thread.currentThread().getThreadGroup(); while(true) { if (top.getParent() != null) top = top.getParent(); else break; } Thread[] theThreads = new Thread[top.activeCount()]; top.enumerate(theThreads); for (int i = 0; i < theThreads.length; i++) { System.out.println(theThreads[i]); } } } Thread lerin gercek listesi, sistemden sisteme degisiklikler gosterecektir fakat asagidakine benzer bir cikti muhtemeldir : BY Ahmet Tolga Tat Sayfa 91 Thread[clock handler,11,system] Thread[idle thread,0,system] Thread[Async Garbage Collector,1,system] Thread[Finalizer thread,1,system] Thread[main,1,main] Thread[Thread-0,5,main] Runnable Interface (Calistirilabilir Arayüz) Java, coklu kalýtimi (multiple inheritance) desteklemeyen bir yapiya sahiptir. Buna karsilik, coklu kalitim yoluyla gelen anahtar avantajlardan birini, daha basit olarak arayuzler interfaces sayesinde saglamis olur. public class Thread extends Object implements Runnable Calistirilabilen bir arayuz (runnable interface) insa etmek suretiyle olusturacagimiz yeni sinifa calsitirilabilir nesne (runnable object) ozelligi kazandirilmis olunur. Olusturdugumuz yeni sinif threadini asagidaki sekilde ifade ederiz : public Thread ( Runnable runnableObject) bu siniftan turetilen bir nesneye yapilan referans ile calistirilabilir arayuzun olusturulmasi. Asagidaki ifade; public Thread (Runnable runnableObject, String threadName) threadName isminde bir thread yaratir ve bu threade ait run metodunu thread icrasi icin runnableObject parametresi ile birlikte gecirir. Ornek olarak bir applet sinifi verilmistir, Animasyonlar Animasyonlar, Runnable interface kullanmanin ana nedenlerini gosteren en iyi ornektir. Java da bir nesneyi animate edebilmek icin, successive frameleri hesaplayan bir thread yaratilmalidir. Daha sonra da ekranin bicimsel gorunusu ile ilgilenen repaint() cagirilmalidir. Paint metodu icerisine sonsuz bir dongu de yerlestirilmesi mumkundur, fakat bu yontem oldukca sakincalidir. Asagida bir kutu icerisinde ziplayan bir toptan olusan basit bir animasyon ornegi verilmistir. Kirmizi top sadece buyuk bir daire olacak. Koordinatlari ball olarak tanimlanan java.awt.Rectangle alani icerisinde belirlenecek. paint() metodu ise sadece bu alana uygu olarak cikti goruntusunu belirleyecek. Buradaki run() metodu ise hareketin olusturulacagi yerdir. Topun koordinatlari burada yukseltilmeli, ardindan topun belirlenen alan disina cikip cikmadiginin kontrolu yapilmalidir. Eger top sinirlar disna cikma egilimi gosterirse bu durumda yonu ters cevrilmelidir : Örnek: import java.awt.*; import java.applet.*; BY Ahmet Tolga Tat Sayfa 92 public class Bounce extends Applet implements Runnable { Rectangle r; int x_increment = 1; int y_increment = 1; public void init () { r = new Rectangle( 30, 40, 20, 20); Thread t = new Thread(this); t.start(); } public void paint (Graphics g) { g.setColor(Color.red); g.fillOval(r.x, r.y, r.width, r.height); } public void run() { while (true) { // infinite loop r.x += x_increment; r.y += y_increment; if (r.x >= size().width || r.x < 0) x_increment *= -1; if (r.y >= size().height || r.y < 0) y_increment *= -1; repaint(); } } } BY Ahmet Tolga Tat Sayfa 93 BY Ahmet Tolga Tat Sayfa 94 Java Utilities Paketi ve Bit iºlemleri Bu bölümde java.util paketindeki bazi utilility class'lari incelenecektir. Ilk önce Vector class'i incelenecektir. Vector class'i array benzeri bir yapidir ve dinamik olarak büyüyüp küçülebilmektedir. Programda veri saklamak için kullanilir. Ayrica vector'lerin Enumeration özelliklerini kullanacagiz. Enumeration vector'ün içerigini gezmemizi saglar. Ikinci olarak Stack class'ini inceleyecegiz. Stack class'i vectore benzer fakat çalisma sekli farklidir. Stack class'i push ve pop gibi methodlar sunmaktadir. Daha sonra Dictionary class'ini inceleyecegiz. Dictionary anahtarli veriler saklarken bize anahtar - veri erisimini saglamak için bize bir yapi olusturmaktadir. Dictionary'den sonra Hashing teorisini inceleyecegiz ve hemen arkasindan da bu teoriyi uygulamamizi saglayan Hashtable class'ini inceleyecegiz. Hashtable sayesinde verileri bir anahtar yardimiylar veri ortamina atip daha sonra hizli bir sekilde bu verilere ulasabilmekteyiz. Bundan sonra da Properties class'ini inceleyecegiz. Bu cla ss Hashtable'dan farkli olarak dissal bir dosyaya yazma ve okuma olanagi saglamaktadadir. Daha sonraki bölümlerde Random class'ina göz atacagiz. Bu class Math.random ile bize saglanan rastgele sayi üretiminden daha zengin bir sayi üretimi saglar. Son olarak da bit islemlerini ayrinitili bir sekilde inceleyecek ve bize bit array benzeri yapi saglayan BitSet class'ini inceleyecegiz. Vector Class'i ve Enumeration Özelligi Java dahil birçok programlama dilindeki arraylar statik bir yapiya sahiptir ve programin veri sahasi ihtiyacinin artip azalmasina göre degismezler. Dolayisiyla bazi sorunlar çikar. Buna karsilik Vector class'i çalisma esnasinda kapasitesi degisebilen bir yapi sunar ve bu problemleri ortadan kaldirir. Vector, herhangi bir anda ya kapasitesi kadar yada daha kapasitesinin daha altinda veri bulundurur. Kapasite Vector için bellekte ayrilmis olan yerdir. Vector'deki veri sayisi kapasitesinden azken yeni bir eleman eklemek hizli bir operasyondur. Veri sayisi kapasiteye esitken veri eklemek kapasiteyi artiracagindan yavas bir operasyondur. Eger herhangi bir kapasite artisi verilmediyse Vector kapasitesi default olarak iki katina çikarilacaktir. BY Ahmet Tolga Tat Sayfa 95 Vector'ler objelere referans tutmalari için tasarlanmistir. Dolayisiyla herhangi bir tip objeye ait bir referans Vector'de tutulabilir. Eger birincil veri tipleri( Integer, Load, . . . ) tutulmak isteniyorsa Vector'lerde, içerisinde birincil veri tipi bulunan nesneler olusturmak durumundayiz. Asagida Vector class'ini kullanan örnek applet'i inceleyebilirsiniz. Bu applet'de her is için bir buton konmustur. TextField'i kullanarak applet'in çalismasini deneyebilirsiniz. Örnek: Vector Kullanan Applet import java.util.*; import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class VectorTest extends Applet implements ActionListener { private Vector v; //Görsel elemanlar private TextField input; private Button ekleBtn, silBtn, ilkBtn, sonBtn, bosBtn, mevcutBtn, konumBtn, trimBtn, statsBtn, displayBtn; public void init() { v = new Vector(1); add( new Label("Bir string giriniz: ")); input = new TextField(10); add(input); //Eklenecek, silinecek veya konumu bulunacak deger ekleBtn= new Button("Ekle"); ekleBtn.addActionListener(this); add(ekleBtn); //Girilen string ekleniyor silBtn= new Button("Sil"); silBtn.addActionListener(this); add(silBtn); //Girilen string bulunup siliniyor ilkBtn= new Button("Ilk"); ilkBtn.addActionListener(this); add(ilkBtn); //Ilk string görüntüleniyor sonBtn= new Button("Son"); sonBtn.addActionListener(this); add(sonBtn); //Son string görüntüleniyor bosBtn= new Button("Bos"); bosBtn.addActionListener(this); add(bosBtn); //Vector'ün bos olup olmadigi sorgulaniyor BY Ahmet Tolga Tat Sayfa 96 mevcutBtn= new Button("Mevcut"); mevcutBtn.addActionListener(this); add(mevcutBtn); //Girilen stringin var olup olmadigi sorgulaniyor konumBtn= new Button("Konum"); konumBtn.addActionListener(this); add(konumBtn); //Girilen stringin konumu ögreniliyor trimBtn= new Button("Trim"); trimBtn.addActionListener(this); add(trimBtn); //Vector kapasitesi size'ina çekiliyor statsBtn= new Button("Istatistikler"); statsBtn.addActionListener(this); add(statsBtn); //Istetistikler gösteriliyor displayBtn= new Button("Görüntüle"); displayBtn.addActionListener(this); add(displayBtn); //Vector'ün içerigi görüntüleniyor } public void actionPerformed( ActionEvent e) { if (e.getSource()== ekleBtn) { v.addElement( input.getText() ); showStatus( "Sona eklendi: " +input.getText() ); } else if (e.getSource()==silBtn) { if (v.removeElement(input.getText())) showStatus(" Silindi: "+input.getText()); else showStatus( input.getText()+" vector'de degil"); } else if (e.getSource()== ilkBtn) { try { showStatus("Ilk eleman: " + v.firstElement()); } catch (NoSuchElementException exception ) { showStatus ( exception.toString()); } } else if (e.getSource()== sonBtn) { try { showStatus("Son eleman: " + v.lastElement()); } catch (NoSuchElementException exception ) { showStatus ( exception.toString()); } BY Ahmet Tolga Tat Sayfa 97 } else if (e.getSource() == bosBtn) { showStatus(v.isEmpty() ? "Vector Bos" : "Vector bos degil"); } else if (e.getSource()==mevcutBtn) { String searchKey = input.getText(); if (v.contains( searchKey) ) showStatus(searchKey + " vectorde mevcut" ); else showStatus(searchKey + " vectorde mevcut degil"); } else if (e.getSource()==konumBtn) { showStatus("Eleman "+ v.indexOf(input.getText())+" konumunda"); } else if (e.getSource()== trimBtn) { v.trimToSize(); showStatus(" Vectorün kapasitesi eleman sayisina çekildi"); } else if (e.getSource()==statsBtn) { showStatus("Eleman sayisi= " + v.size() +"- kapasite = " +v.capacity()); } else if (e.getSource()== displayBtn) { Enumeration enum= v.elements(); StringBuffer buf = new StringBuffer(); while ( enum.hasMoreElements()) buf.append(enum.nextElement()).append(" "); showStatus( buf.toString()); } input.setText(""); } } Örnegin kodunu incelediyseniz kodu incelemeye geçebiliriz. Appletin init metodu asagidaki ifade ile yeni bir vector yaratmaktadir. Vector v = new Vector( 1 ); Bu ifade ile vector 1 kapasitesinde olusturulmustur. Vector'un her kapasite artisi ihtiyacinda vector kapasitesi iki katina çikarilacaktir. Eger parametre kullanilmasaydi 10 ilk kapasitesi ile olusturulacakti. Ayrica ikinci parametre de kullanilabilirdi. Bu ikinci parametre de kapasite artisidir. v.addElement( input.getText() ); Yukaridaki ifade addElement metodunu kullanmaktadir ve Vector'e yeni eleman eklemektedir. Ayrica insertElementAt metodu da vardir. Bu method Vector istenilen yerden eklemeyi saglar. setElementAt metodu ise herhangi bir yerdeki elemani degistirmeye yarar. v. removeElement(); Yukaridaki ifade ise Vector'deki ilk elemani silmektedir. Eger eleman silinebilirse metod true degerini döndürür. Eger eleman bulunamazsa false degerini döndürür. Bu silme islemi BY Ahmet Tolga Tat Sayfa 98 sonrasinda Vector deki diger elemanlar birer index öne alinir. Ayrica Vector removeAllElements ve removeElementAt metodlarini da saglamaktadir. Bunlar ise Vector tamamen temizlemek ve belli bir indexteki elemani silmek için kullanilir. v. firstElement(); Bu ifade Vector'deki ilk elemana referans döndürmektedir. Eger Vector'de eleman yoksa NoSuchElementException'u olusturmaktadir. v. lastElement(); Bu ifade de ayni firsElement gibi çalismaktadir. Tek farki ilk eleman yerine son elemana bir referans döndürmesidir. v. isEmpty(); Bu ifade eger Vector bossa true degerini aksi takdirde false degerini döndürür. v. contains(searchKey); Bu metod ise searchKey eger Vector de var ise true yok ise false degerini döndürmektedir. Bu metod objenin equals metodunu kullanmaktadir. Bunun amaci bir esitligin var olup olmadigini kontrol etmekdir. v. indexOf( input.getText() ); Bu ifade ise Vector'ün indexOf metodunu kullanmaktadir. Girilen elemanin indexini döndürür. Eger girilen eleman bulunamazsa -1 degerini döndürür. Bu metodla aramanin nerden baslayacagida belirtilebilir. v. TrimToSize(); Bu ifade kapasitenin Vector'deki eleman sayisina çekilmesini saglar. v. size(); v. Capacity(); Bu ifadeler ise Vector'deki eleman sayisini ve kapasiteyi döndürür. Enumeration enum = v. elements() Bu ifade Vector'ün elemanlarindan olusan bir Enumeration olusturur. Enumeration Vectorun elemanlarinin gezilmesini saglar. enum.hasMoreElements(); enum.nextElement(); Bu ifadeler Enumeration da eleman kalip kalmadigini sorgulamak ve bir sonraki elemana ilerlemek için kullanilir. Vector'ler hakkinda daha çok bilgi için Java API dökümantasyonunu inceleyebilirsiniz Stack Class'i 17. Bölümde veri yapilarinin nasil olusturulacagini gördük. Tekrar kullanim bizim için önemli bir konu oldugu için bu bölümde yeniden yazmak yerine java.util içerisindeki bize saglanan Stack class'ini kullanacagiz. Stack class'i Vector class'ini genisletmektedir. Tek farki elemanlari alis veris sirasindaki farkliliktir. Stack de lifo mantigi çalismaktadir. Yani son giren ilk çikmaktadir. Vector de ise ilk giren ilk çikmaktadir. Asagida da Stack içeren örnek applet'i inceleyebilirsiniz. Örnek: Stack Kullanan Applet import java.util.*; import java.awt.*; import java.awt.event.*; import java.applet.Applet; BY Ahmet Tolga Tat Sayfa 99 public class StackTest extends Applet implements ActionListener { private Stack s; //Görsel elemanlar private TextField input; private Button pushBtn, popBtn, peekBtn, bosBtn, aramaBtn, goruntuleBtn; public void init() { s = new Stack(); add( new Label("Bir string giriniz: ")); input = new TextField(10); input.addActionListener(this); add(input); //Push edilecek veya aranacak string pushBtn= new Button("Push"); pushBtn.addActionListener(this); add(pushBtn); //Girilen tepeye string ekleniyor popBtn= new Button("Pop"); popBtn.addActionListener(this); add(popBtn); //tepedeki string aliniyor peekBtn= new Button("Peek"); peekBtn.addActionListener(this); add(peekBtn); //Tepedeki string'in degeri ögreniliyor bosBtn= new Button("Bos"); bosBtn.addActionListener(this); add(bosBtn); //Stack'in bos olup olmadigi sorgulaniyor aramaBtn= new Button("Arama"); aramaBtn.addActionListener(this); add(aramaBtn); //Girilen stringin var olup olmadigi ögreniliyor goruntuleBtn= new Button("Görüntüle"); goruntuleBtn.addActionListener(this); add(goruntuleBtn); //Stack'in içerigini görüntülüyor } public void actionPerformed( ActionEvent e) { if (e.getSource()== pushBtn) showStatus("Push edildi: "+s.push(input.getText())); BY Ahmet Tolga Tat Sayfa 100 else if (e.getSource()==popBtn) { try { showStatus("Pop edildi: "+s.pop()); } catch (Emp tyStackException exception) { showStatus( exception.toString()); } } else if (e.getSource()== peekBtn) { try { showStatus( "Tepedeki: "+ s.peek()); } catch (EmptyStackException exception) { showStatus( exception.toString()); } } else if (e.getSource()== bosBtn) { showStatus( s.empty() ? "Stack bos" : "Stack bos degil"); } else if (e.getSource()==aramaBtn) { String searchKey = input.getText(); int result = s.search(searchKey); if (result==-1) showStatus( searchKey + "Bulunamadi"); else showStatus( searchKey +" "+result+" indexinde bulundu"); } else if (e.getSource()== goruntuleBtn) { Enumeration enum =s.elements(); StringBuffer buf = new StringBuffer(); while (enum.hasMoreElements()) buf.append( enum.next Element()).append(" "); showStatus(buf.toString()); } } } Simdi biraz programin kodunu inceleyelim. s.push(); Bu ifade Stack'in tepesine yeni bir eleman ekler. s.pop(); Bu ifade Stack'in tepesindeki elemani siler ve o elemanin referansini döndürür. Eger elaman yoksa EmptyStackException olusturur. s. peek(); Bu ifade de . Stack'in tepesindeki elemana bir referans döndürür. Bu metodun pop'dan farki referans döndürdügü elemani silmemesidir. BY Ahmet Tolga Tat Sayfa 101 s.empty(); Bu metod Stack'in bos olum olmadigini sorgulamak için kullanilir. int result = s.search( searchKey ); Yukaridaki ifade searchKey ile girilen elemanin Stack'da olup olmadigini sorgular. Eger eleman Stack'da ise result degerine indexi aktarilir. Eger eleman Stack'da yoksa result'a -1 atanir. Stack class'i Vector class'ini inherit etmektedir. Bu nedenle de Enumeration özelligi her ikisinde de kullanilabilmektdir. Dictionary Class'i Bir Dictionary anahtarlari degerler döndürür. Dictionary abstract bir class'dir. Yani kendisinden bir instance üretilmez, sadece diger siniflara kaynak olur. Biraz sonra inceleyecek oldugumuz Hashtable Class'i bu Dictionary Class'ini kullanmaktadir. Bu class size, isEmpty, get, put, ve remove gibi metodlari saglamaktadir. Ayrica iki farkli Enumeration yapilabilmektedir. Bunlardan biri key'ler ile enumerate etmek digeri ise degerler ile enumerate etmektir. Hashtable Class'i Hashing yöntemi siradan programcýlar için kullanimi biraz zor bir yöntemdir. Java Hashtable adli class'i kullanýma sunarak programcýlari ayrintilairini düþünmeden Hashtable kullanma firsatini vermiþtir. table = new Hashtable ( ); Yukaridaki ifade kapasitesi 101 eleman ve dolma faktörü .75 olan bos bir Hashtable yaratir. Dolma faktorü asilacagi, zaman tablo otomatik olarak büyür. Hashtable'a parametre yardýmý ile kapasitesi ve dolma faktörü belirtilebilir. Asagida örnek appleti inceleyebilirsiniz. Örnek: Hashtable Kullanan Applet import java.util.*; import java.awt.*; import java.applet.Applet; public class HashtableTest extends Applet { Hashtable table; Label name1, name2; TextField fName, lName; TextArea display; Button put, get, remove, empty, containsKey, containsObj, clear, listElems, listKeys; public void init() { table = new Hashtable(); name1 = new Label( "First name" ); fName = new TextField( 10 ); name2 = new Label( "Last name (key)" ); BY Ahmet Tolga Tat Sayfa 102 lName = new TextField( 10 ); display = new TextArea( 4, 45 ); put = new Button( "Put" ); get = new Button( "Get" ); remove = new Button( "Remove" ); empty = new Button( "Empty" ); containsKey = new Button( "Contains key" ); containsObj = new Button( "Contains object" ); clear = new Button( "Clear table" ); listElems = new Button( "List objects" ); listKeys = new Button( "List keys" ); add( name1 ); add( fName ); add( name2 ); add( lName ); add( display ); add( put ); add( get ); add( remove ); add( empty ); add( containsKey ); add( containsObj ); add( clear ); add( listElems ); add( listKeys ); } public boolean action( Event e, Object o ) { if ( e.target == put ) { Employee emp = new Employee( fName.getText(), lName.getText() ); Object val = table.put( lName.getText(), emp ); if ( val == null ) showStatus( "Put: " + emp.toString() ); else showStatus( "Put: " + emp.toString() + "; Replaced: " + val.toString() ); } else if ( e.target == get ) { Object val = table.get( lName.getText() ); if ( val != null ) showStatus( "Get: " + val.toString() ); else showStatus( "Get: " + lName.getText() + " not in table" ); } else if ( e.target == remove ) { Object val = table.remove( lName.getText() ); if ( val != null ) showStatus( "Remove: " + val.toString() ); else showStatus( "Remove: " + lName.getText() + " not in table" ); } else if ( e.target == empty ) { showStatus( "Empty: " + table.isEmpty() ); BY Ahmet Tolga Tat Sayfa 103 } else if ( e.target == containsKey ) { showStatus( "Contains key: " + table.containsKey( lName.getText() ) ); } else if ( e.target == containsObj ) { showStatus( "Contains object: " + table.contains( new Employee( fName.getText(), lName.getText() ) ) ); } else if ( e.target == clear ) { table.clear(); showStatus( "Clear: Table is now empty" ); } else if ( e.target == listElems ) { StringBuffer buf = new StringBuffer(); for ( Enumeration enum = table.elements(); enum.hasMoreElements(); ) buf.append( enum.nextElement() ).append( '\n' ); display.setText( buf.toString() ); } else if ( e.target == listKeys ) { StringBuffer buf = new StringBuffer(); for ( Enumeration enum = table.keys(); enum.hasMoreElements(); ) buf.append( enum.nextElement() ).append( '\n' ); display.setText( buf.toString() ); } return true; } } class Employee { private String first; private String last; public Employee( String fName, String lName ) { first = fName; last = lName; } public String toString() { return first + " " + last; } } Object val = table.put ( lName.getText ( ), emp ); Bu ifade Hastable'in put adli metodunu kullanarak anahtari ve degeri Hashtable'a ekler. Object val = table.get ( lName.getText ( ) ); BY Ahmet Tolga Tat Sayfa 104 Bu ifade get metodunu kullanarak parametre olarak gönderilen key'e sahip veriyi döndürür eger o key de veri yoksa null döndürür. Object val = table.remove ( lName.getText ( ) ); Bu ifade ise parametre olarak yollanan key li elemaný siler ve referans ini döndürür. Eger elemani bulamazsa null döndürür. table.isEmpty ( ); Ifadesi Hashtable'in boþ olup olmadigini kontrol eder. table.containsKey ( lName.getText ( ) ); Ifadesi ise parametre olarak girilen key li elemanin Hashtableda olup olmadigini kontrol eder. table.clear ( ); Metodu ile Hashtable temizlenir. table.elements ( ); table.keys ( ); Bu ifadeler yardimi ile de table'in keyleri ve elemanlari için Enumeration olusturulur. Properties Class’i Properties class'i Hashtable class'inin biraz degismis bir halidir. Bu degisiklik bu nesnenin kalici olmasi yani dissal bir dosyaya veya network yoluyla verileri göndermesi ve sonra tekrar alabilmesidir. Bu isler yapilirken ObjectOutputStream ve ObjectInputStream classlari kullanilmaktadir. Bu classlar java.io paketinde bulunmaktaadir. Hashtable class'indan bir diger farki anahtar ve deger olarak string almasidir. Ayni hashing kurallari bu class için de geçerlidir. table = new properties ( ); Properties 'in tanimlanmasi yukaridaki gibi yapilmaktadir. Object val = tabsle.getProperty ( propName.getText ( ) ); Bu ifade ile name'i verilen string property içinde aratilir. Eger eleman bulunursa value stringi döndürülür. Eger eleman bulunamazsa aramaya default property'den devam edilir. Bu islem default property bitene kadar devam eder. table.load ( input ); Bu ifade dissal bir dosyadan veri almak için kullanilir. input bir inputstream dir ve bu stream'in içerigi proterty'ye aktarilir. table.save(output); Bu ifade ise property 'nin içerigini output isimli stream'a gönderir. Bu iki metod properties'in kalici olmasini saglamaktadir. Random Class'i Random Class'i math.random'dan çok daha zengin bir rastgele sayi üretici sunmaktadir. Bunun math.random'dan farki ürettigi sayiyi bir daha üretmemesi yani hep farkli sayilar üretmesidir. Random r = new Random ( ) Yukaridaki ifade ile random class'ini kullanabiliriz. BY Ahmet Tolga Tat Sayfa 105 Random r = new Random ( seedValue ); Yukaridaki ifade kullanildiginda ise random objemiz her denememizde ayni sayi serisini üretir yani pseude random number üretir. Bu durum debug için gereklidir. Çünkü bir program bir sayi grubu için hata verirse bize debug islemi için ayni sayi grubu lazim olacaktir. Burda bu durumu saglayan seedValue parametresinin girilmesidir. r.setSeed ( seed Value ) Yukaridaki ifade ile seedValue degeri sifirlanir.. r.nextInt ( ) r.nextLong ( ) Yukaridaki ifadeler random objesine yeni bir integer veya yeni bir long için istekte bulunur. r.nextGaussian ( ) Yukaridaki ifade Gauss'un olasilik yogunlugu dagilimi ile double bir deger üretir. Bit Islemleri ve Bitwise Islemcileri Java birçok bit islemi olanagi saglamaktadir. Asagida operatorler ve islevleri listelenmistir. Islemc Isim Açiklama i & bitwise AND Her bit için mantiksal AND islemi uygulanir. | bitwise inclusive OR Her bit için mantiksal OR islemi uygulanir. ^ bitwise exclusive OR Her bit için mantiksal XOR islemi uygulanir. << left shift Her bit bir tane sola kaydirilir.Sona 0 beslenir. >> right shift with sign extension Her bit bir tane saga kaydirilir. Saga isaret biti beslenir. >>> right shift with zero extension Her bir bir tane saga kaydirilir. Saga 0 beslenir ~ one's complement Bütün bitler tersine çevrilir. Yukaridaki islemler parametre yardimi ile 1 den fazla defa yaptirilabilir. Asagida bir sayinin bit açilimini gösteren bir örnek applet sunulmustur. Örnek: PrintBits Örneði import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class PrintBits extends Applet implements ActionListener { private TextField inp ut, output; public void init() { add( new Label(" Bir integer sayi giriniz: ")); input= new TextField(10); BY Ahmet Tolga Tat Sayfa 106 input.addActionListener(this); add(input); add( new Label(" Sayinin bit'leri: ")); output= new TextField(35); output.setEditable( false ); add(output); } public void actionPerformed(ActionEvent e) { int val = Integer.parseInt(e.getActionCommand()); output.setText( getBits( val)); } public String getBits( int value) { int displayMask = 1 << 31; StringBuffer buf= new StringBuffer(35); for (int c=1; c <= 32; c++) { buf.append(( value & displayMask) == 0 ? "0" :"1"); value <<=1; if ( c % 8 == 0 ) buf.append(" "); } return buf.toString(); } } Asagidaki applet ise islmecileri kullanmaktadir. Örnek: Bit iþlemcileri appleti import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class bitisleme extends Applet implements ActionListener { private TextField input1, input2, result, bits1, bits2, bits3; private Button and, inclusiveOr, exclusiveOr, complement; private Panel inputPanel, bitsPanel, buttonPanel; public void init() BY Ahmet Tolga Tat Sayfa 107 { setLayout( new BorderLayout() ); inputPanel = new Panel(); inputPanel.setLayout( new GridLayout( 4, 2 ) ); inputPanel.add( new Label( "2 Tane Tam Sayi Giriniz: " ) ); inputPanel.add( new Label( "" ) ); inputPanel.add( new Label( "1.Sayi" ) ); input1 = new TextField( 8 ); inputPanel.add( input1 ); inputPanel.add( new Label( "2.Sayi" ) ); input2 = new TextField( 8 ); inputPanel.add( input2 ); inputPanel.add( new Label( "Sonuc" ) ); result = new TextField( 8 ); result.setEditable( false ); inputPanel.add( result ); bitsPanel = new Panel(); bitsPanel.setLayout( new GridLayout( 4, 1 ) ); bitsPanel.add( new Label( "Bitsel Gösterim" ) ); bits1 = new TextField( 33 ); bits1.setEditable( false ); bitsPanel.add( bits1 ); bits2 = new TextField( 33 ); bits2.setEditable( false ); bitsPanel.add( bits2 ); bits3 = new TextField( 33 ); bits3.setEditable( false ); bitsPanel.add( bits3 ); buttonPanel = new Panel(); and = new Button( "bitwise AND" ); and.addActionListener( this ); buttonPanel.add( and ); inclusiveOr = new Button( "bitwise OR" ); inclusiveOr.addActionListener( this ); buttonPanel.add( inclusiveOr ); exclusiveOr = new Button( "bitwise XOR" ); exclusiveOr.addActionListener( this ); buttonPanel.add( exclusiveOr ); BY Ahmet Tolga Tat Sayfa 108 complement = new Button( "Ters al" ); complement.addActionListener( this ); buttonPanel.add( complement ); add( inputPanel, BorderLayout.WEST ); add( bitsPanel, BorderLayout.EAST ); add( buttonPanel, BorderLayout.SOUTH ); } public void actionPerformed( ActionEvent e ) { if ( e.getSource() == complement ) { input2.setText( "" ); bits2.setText( "" ); int val = Integer.parseInt( input1.getText() ); result.setText( Integer.toString( - val ) ); bits1.setText( getBits( val ) ); bits3.setText( getBits( - val ) ); } else { int val1 = Integer.parseInt( input1.getText() ); int val2 = Integer.parseInt( input2.getText() ); bits1.setText( getBits( val1 ) ); bits2.setText( getBits( val2 ) ); if ( e.getSource() == and ) { result.setText( Integer.toString( val1 & val2 ) ); bits3.setText( getBits( val1 & val2 ) ); } else if ( e.getSource() ==inclusiveOr ) { result.setText( Integer.toString( val1 | val2 ) ); bits3.setText( getBits( val1 | val2 ) ); } else if ( e.getSource() ==exclusiveOr ) { result.setText( Integer.toString( val1 ^ val2 ) ); bits3.setText( getBits( val1 ^ val2 ) ); } } } public String getBits( int value ) { int displayMask = 1 << 31; StringBuffer buf = new StringBuffer( 35 ); for ( int c = 1; c <= 32; c++ ) { buf.append( (value & displayMask ) == 0 ? '0' : '1' ); value <<= 1; if ( c % 8 == 0 ) buf.append( ' ' ); } BY Ahmet Tolga Tat Sayfa 109 return buf.toString(); } } BitSet Class'i BitSet class'i içerisinde bitlerin tutulmasini saglayan dinamik bir yapidir. Yani appletin çalisma esnasinda boyutu degis ebilen array benzeri bir yapidir ve içerisinde bitleri tutar. Böyle bir yapi programlama da çok ihtiyaç duyulmaktadir. Bu yapi sayesinde indis sayisi kadar true(1), false(0) elde ederiz ve bunlar bize flag görevi görür. BitSet b = new BitSet(); Yukaridaki ifade ile yeni bir BitSet tanimlayabiliriz. BitSet b = new BitSet( Size ); Yukaridaki tanimlama biçimi ile boyutunuda belirtebiliriz. b.set( bitNumber ); Yukaridaki ifade ile bir konumdaki bit 1'e esitlenir yani set edilir. b.clear( bitNumber ); Yukaridaki ifade ile bir konumdaki bit 0'a esitlenir yani reset edilir. b.get( bitNumber ); Yukaridaki ifade ile bir konumdaki bitin degeri ögernilir. Bu yapi yardimiyla bir sayinin asal olup olmadigini tutabiliriz. Örnegin 1000 indislik bir bitset açar ve her indisdeki biti o indis degerine denk gelen sayinin asal olup olmadigini gösteren bit olarak kullanabiliriz. Bu örnegi asagidaki applettde görebiliriz. Örnek: BitSet Kullanan Applet import java.applet.Applet; import java.awt.*; import java.util.*; public class BitSetTest extends Applet { BitSet sieve; Panel inputPanel; Label inputLabel; TextField input; TextArea primes; public void init() { sieve = new BitSet( 1024 ); setLayout( new BorderLayo ut() ); inputLabel = new Label( "Enter a value from 1 to 1023" ); input = new TextField( 10 ); inputPanel = new Panel(); BY Ahmet Tolga Tat Sayfa 110 inputPanel.add( inputLabel ); inputPanel.add( input ); add( "North", inp utPanel ); primes = new TextArea(); add( "Center", primes ); // set all bits from 1 to 1023 int size = sieve.size(); for ( int i = 1; i < size; i++ ) sieve.set( i ); // perform Sieve of Eratosthenes int finalBit = (int) Math.sqrt( sieve.size() ); for ( int i = 2; i < finalBit; i++ ) if ( sieve.get( i ) ) for ( int j = 2 * i; j < size; j += i ) sieve.clear( j ); int counter = 0; for ( int i = 1; i < size; i++ ) if ( sieve.get( i ) ) { primes.appendText( String.valueOf( i ) ); primes.appendText( ++counter % 7 == 0 ? "\n" : "\t" ); } } public boolean action( Event e, Object o ) { int val = Integer.parseInt( input.getText() ); if ( sieve.get( val ) ) showStatus( val + " is a prime number" ); else showStatus( val + " is not a prime number" ); return true; } } BY Ahmet Tolga Tat Sayfa 111 BY Ahmet Tolga Tat Sayfa 112 Exception Handling Exception calisma durumunda meydana gelen hata durumudur. Pascal ,C gibi exception handling'i desteklemeyen dillerde olusabilecek hatalarin denetimi elle yapilmaktadir. Bu zahmetli durum JAVA programlama dilinde nesne yönelimli çalisma zamani hatalari yönetimi kullanilarak onlenir. En cok karsilasilan hata turleri dizinlerde index degerinin siniri asmasi, aritmetik islemlerde degisken degerlerinin sinirin disina cikmasi, sifira bölme, hatali metod parametreleri ve bellek tükenmesi. Javanin hata ayiklama islemi, bütün tip hatalarinin yakalanmasini saglar. Bu, programlari daha dayanikli ve güçlü yapar. Hatalar, exceptions sinifindan türetilmis siniflarin nesneleridir. Hata ayiklamanin diger bir manasi kontrolün bir metoddan döndürülmesidir. Normalde, bir hata meydana geldigi zaman, bu hata ile ilgilenen bir metod cagrilir. Eger bu metod hata ile ilgilenmezse, yeni bir kod daha cagrilir.. Bu zincir bu ºekilde devam eder. Exception Handling ne zaman kullanilir Hata giderme asagidaki durumlarda kullanilmalidir: 1. Sadece istisnai durumlari incelemek için 2. Program parçalari arasindaki hatalari gidermek için 3. Metodlar, siniflar, kütüphaneler gibi yazilim parçalarinin hatalarini gidermek için 4. Genis projelerde projenin düzgün dagilimini saglamak için. Java’da hata yakalamanin temelleri Java hata ayiklama bir hatanin tespit edilmesi durumunda kullanilir.Böyle bir durum hatayi "throw" etmektir. Buradan bir sonucun üretilmesi garanti edilmez. Eger bir hata varsa bu hata yakalanip islenecektir. Hata üretecek kod bir "try" blogu içine konur. Try blogunun ardindan hemen bir veya daha fazla "catch" blogu gelir. Her bir catch blogu yakalatip isleyebilecegi hatalari belirler. Son catch blogundan sonra, bululup bulunmamasi önemli olmayan fakat bulundugu taktirde mutlaka calistirilacak olan "finally" blogu yer alir. Bir hata yakalandigi zaman, kontrol try blogundan ayrilip, hata için uygun catch blogu aranir. Eger hatanin tipi catch bloklarindan birine uyarsa, catch bloktaki kod calistirilir. Eger hiçbir catch blogu bulunmazsa, program son catch blogundan sonra devam eder. Eger son catch blogundan sonra finally blogu varsa, bu kod calistirilir. Bir hata metod içerisindeki bir try blogunda yakalanabilecegi gibi, metod tarafindan dogrudan veya dolayli yolla çagrilan bir try blogu tarafindan da yakalanabilir. Hatanin yakalandigi noktaya "throw point" denir. Bir hata yakalndigi zaman program throw point' e dönmeyebilir. Çünkü java hata gidermek icin "termination" modelini kullanmaktadir. "Resumption" modelinde kontrol "throw point" e geri döner. BY Ahmet Tolga Tat Sayfa 113 Java Dilindeki Hata Paketi LinkageError ClassCircularityError ClassFormatError IncompatibleClassChangeError AbstractMethodError IllegalAccessError InstantiationError NoSuchFieldError NoSuchMethodError NoClassDefFoundError UnsatisfiedLinkError VerifyError ThreadDeath VirtualMachineError(Abstract Class) InternalError OutOfMemoryError StackOverFlowError UnknownError AWTError (in java.awt) Exception cesitleri Java bircok farkli exception nesnesi icerir.Bunlardan bazilari bu hatayi "throw" eden bir fonksiyon kullanici tarafindan tanimlandiginda kullanicinin ele almasi gereken durumlardir. Bellek tukenmesi,sifira bolme gibi bazi durumlarda ise sistem otomatik olarak bir hata yakalama mekanizmasi olusturur. Java'da kullanilan Exception'lar EXCEPTION ACIKLAMA Aritmetik Exception Sifira Bolme Gibi Matematiksel Hatalarda Olusur Array Index'inin Siniri Asmasi Hatali Index Degerlerinin Kullanilmasi Sonucu Olusur Arraylerde Type Hatasi Arraylerde Hatali Tipte Bir Degiskenin Kullanilmasi Ile Olusur Dosya Bulunamamasi Durumu Var Olmayan Bir Dosyaya Giris Istemi Oldugunda Olusur IO Exception BY Ahmet Tolga Tat Bir Dosyayi Okuyamama Gibi Genel I/O Hatalari Sayfa 114 NullPointer Exception Null Bir Nesneye Referans Verilmesi Sayi Bicimleriyle Ilgili Hatalar String ve Sayi Degiskenlerini Birbirine Cevirirken Olusabilecek Hatalar Bellek Sinirinin Asilmasi Yeni Bir Nesneyi Bellege Yerlestirmek Icin Yer Olmayinca Olusur Guvenlik Hatalari Bir Applet Browser'in Izin Vermedigi Bir Olayi Islemeye Calisinca Olusur Stack'in Dolma Durumu Sistem Stack Alaninin Disini Kullanmaya Calisinca Olusur String Index'inin Sinirlarin Disinda Olmasi Program String'te Var Olmayan Bir Karakter Pozisyonuna Girmeye Calisirsa Olusur Exception handling’deki blok tanimlari try bloklari Bir hata meydana geldigi zaman try blogu icindeki bir catch blogu tarafindan yakalanir. try { .... } catch(){ .... } Eger bir try blogu calistirilip ,hicbir hata ile karsilasilmazsa kontrol son hata yakalayicidan sonraki ilk koddan devam eder.Eger finally blok varsa bu blok calistirilir. BIR EXCEPTION'IN ORTAYA ATILMASI Hata ayiklama islemi bir hata meydana geldigi zaman calistirilir. Buna "throwing an exception" denir. Hata ayiklama kodu ayiklama isleminin nesnesini belirler. Islenen hata throwable sinifindan türetilmis herhangi bir sinif olabilir. Throwable sinifinin iki alt sinifi "Exception" ve "Error" dir.Error genellikle sistem problemleriyle ilgilenir. Exception ise birçok java programcisinin arzu ettigi problemlerle ilgilenir. Bir hata durumu yakalandigi zaman kontrol o anki try blogu içindeki uygun bir catch blogundan devam eder. Eger böyle bir catch yoksa bir sonraki try blogundan devam eder. BY Ahmet Tolga Tat Sayfa 115 Throwing An Exception public boolean action(Event evt, Object arg) { try GetURL(); catch (MalformedURLException e) { badURL = true; repaint(); } return true; } protected void GetURL() throws MalformedURLException { String str = textField.getText(); URL url = new URL(str); AppletContext context = getAppletContext(); context.showDocument(url); } Throws kelimesi Bir throws clause bir metod tarafindan hangi hatalarin yakalabilecegini listeler. int g(float h) throws a,b,c { //method body } Bazi hatalar calisma zamaninda meydana gelir. Bunlara "RunTimeExceptions" denir. Bir Exception’un yakalanmasi Hata giderici kodlar "catch" bloklari icerisinde yer alir. Her catch blogu "catch" kelimesiyle baslar. Catch blogundaki hatanin tanimini yapan sinif ismi ve parametre ismi vardir. Hata ile hiçbir hata giderme kodu uymayabilir.Bu aramanin bir sonraki try blogund an devem etmesini saglar. Bu islem sonunda hata ile uyan hicbir catch blogu bulunmazsa, GUI tabanli olmayan bir program calisir. Apletler ve GUI tabanli programlar olay isleminin sonucunu gönderirler. FINALLY BLOGU Bir exception oldugu zaman metottaki isleyis ani ve dogrusal olmayan bir yola girer.Metodun kodlanmasina bagli olarak bir exception'in zamansiz bir sekilde geri donmesine bile sebep olabilir.Mesela bir metot giriste bir dosyayi aciyor ve cikista kapatiyorsa exception- handling mekanizmasinin bu dosyayi kapatan kodu gecmemesi gerekir.Finally anahtar kelimesi bu ihtimal icin tasarlanmistir. Finally blogu istege baglidir.Eger varsa "try" blogunun catch tumcesinden sonra yer alir.Java, eger bir finally blogu varsa, try blogu ve onun catch bloklari icinde bir exception ele alinmasina bakmadan, finally blogunun isletilecegini garanti eder. Bir try blogundan finally blogunu islemeden cikmak mümkün degildir. BY Ahmet Tolga Tat Sayfa 116 CONSTRUCTER VE FINALIZER'LAR Bir constructor içinde bir hata farkedilirse ne olur? Problem constructor bir deger döndürmez, o zaman programin nesnenin düzgünce olusturulup olusturulmadigini bilmesini nasil saglayacagiz? Bir tasari, kötü olusmus nesneyi metoddan döndürmek ve bunu kullanan nesnelerin bu nesnenin düzgün olup olmadigini anlayacak testler yapiyor olmasini ummak. Diger bir tasari, constructor disinda global bir degisken tanimlamak, ama bu da zayif bir programlama yolu. Contructor'larda ortaya atilan exceptionlar nihai garbage koleksiyonu için isaretlenen nesnelerin parçasi olarak olusturulmasina sebep olurlar. Her bir nesne garbage koleksiyonuna atilmadan, onun finalizer'i cagrilir. Bir defa daha, Java garbage koleksiyonuna atilacak nesnelerin sirasini garanti etmez ve sonuç olarak cagrilacak finalizer'larin sirasini da garanti etmez. BUILT-IN EXCEPTION'LAR Java'nin java.lang paketi içinde standart olarak tanimlanmis bir cok exception sinifi vardir.En cok kullanilanlar RuntimeException tipinin alt siniflaridir.Java.lang java programlarina otomatik olarak getirilir. Ayrica herhangi bir metodun throws listesinde bulunma zorunlulugu da yoktur.Java'da Java.lang'in disinda baska exception paketleri de vardir.Asagida Java dilinde kullanilan built- in exception'larin listesi sunulmaktadir. Java.Lang Paketi'ndeki Exception'lar IllegalAccessException InstantionationException InterruptedException NoSuchMethodException ArithmeticException ArrayStoreException ClassCastExeception IllegalArgumentException IllegalThreadStateException NumberFormatException IllegalMonitorStateException IndexOutOfBoundException ArrayIndexOutOfBoundException StringIndexOutOfBoundException NegativeArraySizeExecption NullPointerException SequrityException Java.Util Paketindeki Exception'lar RunTime Exception EmptyStackException NosuchElementException Java.io Paketindeki Exception'lar Exception BY Ahmet Tolga Tat Sayfa 117 IOException EOFException FileNotFoundException InterruptedIOExzception UTFDataFormatException Java.net Paketindeki Exception'lar Exception IOException MalFormedURLException ProtocolException SocketException UnknownHostException UnknownServiceException Yeni Exception siniflari yapma Java' nin icinde yaygin hatalara yonelik exception siniflari tanimlanmistir.Ancak kullanici bazi ozel durumlarda kendi exception siniflarini tanimlamak isteyebilir.Bu gibi durumlarda yapilmasi gereken sey Throwableicinde bir alt sinif tanimlamaktir. Yaratilan alt siniflari mutlaka kullanma zorunlulugu yoktur.Amac sisteme varliklarini bildirmektir. Exception sinifi kendisinin hiç bir sinifini tanimlamaz.Gerekli olanlari Throwable'dan saglar. Böylece bütün exception'lar kendi yarattiklarimiz dahil, Throwable tarafindan tanimlanan metodlari kullanabilecek hale gelir. Ayrica yarattigimiz exception siniflarinin bir veya bir kaç metodunu hükümsüz kilabilir, kendimiz yeniden yazabiliriz. Yaygin super siniflardan cesitli exception siniflari türetilebilir. Eger bir catch metodu bir super sinif tipinin exception neenelerini yakalamak için yazilmissa, bu ayrica bu super sinifin alt siniflarinin nesnelerini de yakalayabilir. Bu yaklasim, baglantili hatalarin kalitsal isleyisine izin verir. Exception'larla kalitimi kullanmak, exception handler'in ilgili hatalarini kisa bir gösterim ile algilamasina olanak saglar. Bütün alt siniflar icin ayridir. import java.applet.Applet; import java.awt.*; public class ZeroTest extends Applet { Label prompt1, prompt2; TextField input1, input2; int number1, number2; double result; // Initialization BY Ahmet Tolga Tat Sayfa 118 public void init() { prompt1 = new Label( "Enter numerator" ); input1 = new TextField( 10 ); prompt2 = new Label( "Enter denominator and" + "press Enter" ); input2 = new TextField( 10 ); add( prompt1 ); add( input1 ); add( prompt2 ); add( input2 ); } // Process GUI events public boolean action( Event event, Object object ) { if ( event.target == input2 ) { number1 = Integer.parseInt( input1.getText() ); input1.setText( "" ); number2 = Integer.parseInt( input2.getText() ); input2.setText( "" ); try { result = quotient( number1, number2 ); showStatus( number1 + " / " + number2 + " = " + Double.toString( result ) ); } catch ( ZeroException exception ) { showStatus( exception.toString() ); } } return true; } // Definition of method quotient. Used to demonstrate // throwing an exception when a divide-by- zero error // is encountered. public double quotient( int numerator, int denominator ) throws ZeroException { if ( denominator == 0 ) throw new DivideByZeroException(); return ( double ) numerator / denominator; } } BY Ahmet Tolga Tat Sayfa 119 BY Ahmet Tolga Tat Sayfa 120 Java Metodlari Problemleri cozmek icin kullanilan bilgisayar programlari cok buyuk boyutlardadir. Buyuk programlari yonetmenin ve gelistirmenin en uygun yolu ise programlari daha kucuk parcalara bolmektir. Bu parcalara modul denir. Java 'da Program Modulleri Java dilinde 2 modul bulunmaktadir.Bunlar sinif lar ve metod lardir. Java programlari java sinif kutuphanelerinde hazir olarak bulunan metodlar ve siniflar kullanilarak, onlardan yeni siniflar tureterek ve yeni sinif ve metodlar olusturularak bunlarin birlestirilmesiyle yazilir. Java API, Java sinif kut uphanelerinin olusturdugu bir arayuzdur.Bu arayüz ( sinif kutuphaneleri ) , programcinin isini genel matematiksel hesaplamalar, string islemleri, karakter islemleri, giris cikis ve hata kontrolleri gibi bircok islemlerde kullanilmak uzere cok sayida sinif ve metod icererek kolaylastirir. Java diline ait hazir sinif kutuphaneleri JDK( Java Developer's Kit )'in bir parcasidir. Programci programda kullanilmak uzere ozel isler icin tasarlanmis metodlar yazabilir. Bir metodun kullanilabilmesi için çagrilmasi(method call) gerekir. Bu çagirma islemi sirasinda gerekli parametreler(arguments) de belirtilir. Math Sinifi Metodlari Math sinifi metodlari genel matematik islemlerinde kullanilir. Metodlar isimleri va parantez icindeki parametreleri ile birlikte cagrilir. Butun math sinifi metodlari Math sinif ismi, "." ve metod ismi ile birlikte kullanilir. Metotlar genelde asagidaki sekilde çagrilirlar : [Class_name] Method_name ([Arg_1],[Arg_2..]); [Class_name] : bu kisim çagrilacak olan metotun ait oldugu sinifi belirtir. Her zaman gerekmez. Ancak Math sinifinin bir metodu BY Ahmet Tolga Tat Sayfa 121 çagrilacaksa "Math." Ifadesi mutlaka metot isminde önce bulunmalidir. Metod parametreleri sabitler, degiskenler veya ifadeler( expressions ) olabilir. Bazi Math sinifi metodlari sunlardir; {PRIVATE}ab x'in mutlak degerini hesaplar. s( x ) ceil( x ) x'in en kucuk degerini dondurur. Bu deger x' den kucuk degildir. cos( x ) x'in trigonometrik Kosinus degerini verir. ( x 'in birimi radyan ) exp( x ) e uzeri x'i hesaplar. floor( x ) x'in en buyuk degerini dondurur. Bu deger x' den buyuk degildir. log ( x ) x' in e tabaninda dogal logaritmasini verir. max( x , y ) x ve y 'den buyuk olanini dondurur. min( x , y ) x ve y 'den kucuk olanini dondurur. pow( x , y) x'in y. kuvvetini verir. sqrt( x ) x'in karekokunu hesaplar. Metodlar Metodlar programcinin programi moduler hale getirmesini saglar. Metod icinde tanimlanmis butun degiskenler yerel degiskenler ( local variables ) dir. Sadece icinde tanimlandigi metod icerisinde taninirlar. Metodlarin bir cogu parametrelere sahiptir. Bu parametreler metodlar arasindaki iletisimi saglamak icin kullanilir. Genellikle yerel degiskenlerdir Programi metodlar ile modularize etmenin bir kac yolu vardir. Divide-conquer yaklasimi program gelistirirken programa daha cok hakim olunmasini saglar. Diger bir yol ise software reusability' dir ( Var olan metodlar yeni bir program uretmek icin bloklar halinde olusturulur).Iyi bir yontem ile isimlendirme ve tanimlamalar yapilir, ayrica ozel bir program kodu yazmak yerine program standart metodlardan olusturulur. Ucuncu bir nokta ise tekrar eden program kodundan sakinmaktir. Paketlenmis kod(modularize edilmis, kucuk parcalara ayrilmis) programin degisik yerlerinden cagrilir ve boylece tekrar yazilmasindan kurturulur. Metod Tanimlamalari Su ana kadar sinif kutuphanelerinde var olan metodlar ve siniflar kullanildi. Simdi yeni bir metodun nasil tasarlandigini gorecegiz. Bir applet tasarlayalim ve square metodunu kullanarak 1' den 10'a kadar olan sayilarin karesini bulsun ve paint metodunu kullanarak yazdirsin. BY Ahmet Tolga Tat Sayfa 122 // Square metodu programci tarafindan tanimlanmistir. import java.awt.Graphics; import java.applet.Applet; public class karealma extends Applet { public void paint ( Graphics g ) { int xposition = 25; for ( int x = 1; x <= 10; x++ ) { g.drawString( String.valueOf ( square( x ) ), xPosition, 25 ); xPosition +=20; } } // Square metod tanimi public int square( int y ) { return y*y; } } Square metodu paint icerisindeki 12. satirdaki call ( square(x)) deyimi ile cagrilir. Square metodu parametre olarak x'i alir ve y'ye x' in degerini kopyalar. Metod y*y' yi hesaplar ve sonuc geri doner ve ekrana yazdirilir. Bu islem on kez tekrarlanir. 17. satirdaki metod tanimlamasi metodun paramatre olarak integer bir sayi kabul ettigini gosterir. Metod isminden onceki Int kelimesi ile metodun integer bir sonuc dondurecegi anlasilir.Javadaki butun metodlarin tanimlamasi bir sinif taniminin icerisinde yapilmalidir. Metod tanimlamasinin formati asagidaki gibidir. Dondurulecek-degerin-tipi metod-ismi( parametre -listesi ) { Tanimlamalar ve ifadeler } Metod ismi herhangi gecerli bir ifade olabilir. Dondurulecek degerin tipi void ise bu ifade Metodun birsey döndürmeyecegini gösterir.Parametre listesinde birden fazla parametre var ise "," ile birbirinden ayrilirlar. Parametere listesindeki parametreler metod cagrildigi zaman kabul edilir.Parametrelerin tanimlamalari acik bir sekilde yapilmalidir. "{" ve "}" arasinda yazilan hersey metodun govdesini olusturur.Blok olarakta isimlendirilir.Degiskenler blok icerisinde tanimlanmalidir. Bir metod baska bir metod icinde tanimlanamaz. Metodun cagrildigi yere donmesi uc sekilde olur. Eger metod bir deger dondurmuyor ise geri donus metodun sonuna gelinmesiyle "}" veya asagidaki satirin uygulanmasi ile olur ; return eger bir deger geri donduruyorsa return expression ifadesi kullanilir. Ikinci ornegimizde programci tarafindan tanimlanmis, uc tane sayidan en buyugu bulan maximum isimli metod kullanilmistir. Sayilar metin kutularindan giris olarak alinir, enter ile birlikte maximum metodu cagrilir, en buyuk olan sayi bulunup return ile geri donulur ve diger metin kutusuna en buyuk sayi yazdirilir. import java.awt.*; import java.applet.Applet; import java.awt.event.*; BY Ahmet Tolga Tat Sayfa 123 public class max extends Applet implements ActionListener { Label label1, label2, label3, resultLabel; TextField number1, number2, number3, result; int num1, num2, num3, max; public void init() { label1 = new Label( "Enter first number:" ); number1 = new TextField ( "0", 10 ); label2 = new Label( "Enter second number:" ); number2 = new TextField ( "0", 10 ); label3 = new Label( "Enter third number:" ); number3 = new TextField ( "0", 10 ); resultLabel = new Label( "Maximum value is:" ); result = new TextField ( "0", 10 ); result.setEditable( false ); number1.addActionListener( this ); number2.addActionListener( this ); number3.addActionListener( this ); add( label1 ); add( number1 ); add( label2 ); add( number2 ); add( label3 ); add( number3 ); add( resultLabel ); add( result ); } public int maximum( int x, int y, int z) { return Math.max( x, Math.max( y, z)); } public void actionPerformed( ActionEvent e) { num1 = Integer.parseInt( number1.getText() ); num2 = Integer.parseInt( number2.getText() ); num3 = Integer.parseInt( number3.getText() ); max = maximum( num1, num2, num3); result.setText( Integer.toString( max ) ); } } Rastgele Sayi Türetme Bu bolumde birden fazla metod iceren bir oyun programi olusturacagiz. Programda daha once gosterilen yapilar kullanilacaktir. double randomValue = Math.random( ); Random metodu 0.0 ile 1.0 arasinda rastgele double bir sayi uretir.Bu aradaki sayilarin her biri esit sansa sahiptir. Random metodunu gostermek icin bir program yazacagiz. Bu programda 20 kere zar atisini simule edecegiz ve uretilen sayilari satirlara sirasi ile yazdiracagiz. Program 1 ile 6 arasinda rastgele sayi uretir. Programi asagida gorebilirsiniz. Random ile birlikte " * " operatoru kullanilir. BY Ahmet Tolga Tat Sayfa 124 ( int ) ( math.random( )*6 ) 0 ile 5 arasinda rastgele sayi uretmek icin yukaridaki ifade kullanilir. Buna scalling denir. 6 scalling faktorudur.Program icerisinde her uretilen sayiya 1 eklenmistir. import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class random extends Applet implements ActionListener { int frequency[] = { 0, 0, 0, 0, 0, 0, 0 }; int limit; Label label1; TextField field1; public void init() { label1 = new Label ( "Zar kaç kere atýlacak?" ); field1 = new TextField ( "1000", 5 ); field1.addActionListener( this ); add ( label1 ); add ( field1 ); } public void paint( Graphics g ) { int Ypos = 70; g.drawString( "Zar", 25, 55); g.drawString( "Gelme Sýklýðý", 100, 55); for (int i = 1; i <= 6; i++) { g.drawString( Integer.toString( i ), 25, Ypos); g.drawString( Integer.toString( frequency[ i ]), 100, Ypos); Ypos += 15; } } public void actionPerformed( ActionEvent e ) { limit = Integer.parseInt( field1.getText() ); for (int i = 1; i <= 6; i++ ) { frequency [ i ] = 0; } for ( int roll = 1; roll <= limit; roll++ ) { int face = 1 + (int)( Math.random() * 6 ); frequency[ face ]++; } repaint(); } } Otomatik Degiskenler Su ana kadar degisken isimleri için tanimlayicilar kullanilmistir.(identifiers) degiskenlerin bir çok özellkileri vardir : ad, tip, boyut, deger, süre(duration), menzil (scope). Bunlardan ilk dördü açiktir. Süre ise degiskene ilk referans verilip bellekte yer açilmasindan, bellekten silinineye kadar geçen süredir. Bu süre her degisken için farklidir. Bazilari çok kisa, bazilari ise tüm program boyunca hayatta kalirlar. Menzil ise program içinden degiskene referans edilebilen yerlerdir. Bazilarinin menzili modül seviyesinde kalirken bazilari da tüm programdan referans BY Ahmet Tolga Tat Sayfa 125 edilebilir. Metotlarin yerel degiskenleri ve parametrelerde yaratilan degiskenleri "otomatik süreli degiskenler" olarak adlandirilir. Bu degiskenler islenme sirasi kendilerine geldiginde yaratilirlar ve metottan çikana kadar var olurlar. Metottan çikinca da gene otomatik olarak imha edilirler. Otomatik süreli degiskenler kisaca "Otomatik Degiskenler" diye adlandirilir. Java ayrica static süreli degiskenlere de izin vermektedir. Bu tür degiskenler bellege yüklendikten programin bitmesine kadar yasarlar. Statik süreli metotlarin adlari ise ilk bellege yüklendigi andan program bitimine kadar varolur. Ancak bu her zaman kullanilabilecekleri anlamina gelmez, çünkü menzil ve süre (duration) kisitlamalari hala geçerlidir. Scope Kurallari Bir degiskene ait scope o degiskene program icerisinden ulasilabildigimiz sahalardir. Mesela bir yerel degiskene tanimlandigi blok disindan ulasilamaz. O degiskene sadece tanimlandigi blok icerisinden referans edilebilir. Bir degisken icin class scope ve block scope' una bakilir. Metodlar ve ornek degiskenler icin class scope soz konusudur. Class scope sinifa ait ' { ' ile baslar ve ' } ' ile son bulur. Class scope sinif icerisindeki metodlar icerisinden diger metod ve ornek degiskenlere ulasilabilmesini saglar. Blok icerisindeki degiskenler block scope 'a sahiptir. Block scope tanimlanmasi ile baslar ve blok sonu olan ' } ' ile biter. Recursion ( tekrarlama ) Daha once uzerinde durdugumuz programlar genel olarak metodlardan olusuyor ve birbirlerini bir duzen icerisinde hiyerarsik olarak cagiriyorlardi. Bir recursive metod ise kendi icerisinden kendisini cagiran metod olarak tanimlanabilir. Basit ornekleri mevcuttur. Asagidaki programimiz ( FactorialTest.java ) recursion bir programdir. 0' dan 10' a kadar olan sayilarin faktoriyellerini hesaplar ve yazdirir. Recursive bir metod olan factorial once sayinin 1' e esit veya 1' den kucuk olup olmadigini kontrol eder, eger bu sart gerceklesirse factorial 1 degerini dondurur. Eger bu sart dogru degil ise bu satir islenir ; return number*factorial ( number - 1 ); yani factorial metodu icerisinden yine factorial metodu (number-1) parametresi yollanarak cagrilir. import java.applet.Applet; import java.awt.Graphics; public class faktorial extends Applet { public void paint( Graphics g ) { int Ypos = 25; for (long i = 0; i <= 10; i++) { g.drawString( i + "! = " + factorial( i ), 25, Ypos); Ypos += 15; } } public long factorial( long number ) { if (number <= 1) return 1; else return number * factorial( number - 1); } } BY Ahmet Tolga Tat Sayfa 126 Recursion ve Iterasyon Bu bolumde recursion ve iteration metodlari karsilastirilacak ve programcinin hangi sebeple hangi metodu nerede sececegi uzerinde durulacaktir.. Ikiside kontrol yapisina dayanir. Iteration tekrarlamali yapilari kullanir(for veya do/while). Recursion secmeli bir yapi kullanir( if, if /else veya switch gibi ) Hepsi tekrarlamayi icerir. Ikiside yok etmek icin bir test icerir. Iteration dongu sarti gerceklestiginde recursion ise temel sart gerceklestiginde yok olur. Eger iteration testinde dongu sarti gerceklesmezse sonsuz dongu meydana gelir. Recursion' un eksileri coktur.Surekli olarak mekanizmayi calistirir ve siksik overhead ( ustune yazma ) yapar. Bu da onun islemci zamani ve bellek acisindan pahali olmasi anlamina gelir. Iteration normal olarak metod icinde meydana gelir overhead ve extra bellek ayrimi ihmal edilir. Recursive olarak cozulebilecek her problem iterative olarakta cozulebilir. Recursive iteration ' a gore daha cok hatalari kontrol eder ve anlasilmasi ve yonetilmesi daha kolaydir. Method Overloading Java metodlarin isimlendirilmesi sirasinda ayni isimlerin kullanilmasina izin verir. Metodlar isimleri aynioldugu halde parametreleri farkli olabilir. Bu method overloading olarak tanimlanir. Bir method overloading meydana geldigi zaman java compiler'i metodlari sirasi ile test eder parametrelerin tiplerini, sayilarini ve sirasini karsilastirir ve uygun olan metod cagrilir. Method overloading ayni isi yapan fakat farkli veri tiplerini kullanan metodlar icin tercih edilir. Overloading methodlar programlari daha anlasilir ve okunur hale getirir. Asagida gordugunuz program ( MethodOverload.java ) overloaded metodlar olan square'lari kullanir. Metodlardan biri parametre olarak integer bir sayi alirken digeri double sayi almaktadir. import java.awt.Graphics; import java.applet.Applet; public class appmethodoverload extends Applet { public void paint( Graphics g) { g.drawString( "Tamsayý 8'in karesi = " + square( 8 ), 25, 25); g.drawString( "Tamsayý olmayan 6,5'un karesi = " + square( 6.5 ), 25, 40); } int square( int x ) { return x * x; } double square( double x ) { return x * x; } } Program icerisindeki square metodlari; BY Ahmet Tolga Tat Sayfa 127 int square ( int x ) &n bsp; double square ( double y ) Applet Siniflarinin Metodlari Su ana kadar bircok applet yazildi ama bir apletin uygulanmasi sirasinda otomatic olarak cagrilan applet sinifi uzerinde durulmadi. Asagidaki figurde applet sinifina ait metodlar, ne zaman cagrildiklari ve amaclari listelenmistir. Bu metod appletviewer veya browser tarafindan aplet islem icin yuklendigi zaman cagrilir. Apletin calismasi ile {PRIVATE}public void init ( ) calisir.Ornek degiskenleri ve bir aplete ait GUI bilesenlerini baslatmak, gosterilecek resim gibi seyleri yuklemek yaptiklari arasindadir. Bu metod baslangic metodu calisip islenmesi bittikten sonra public void start ( ) tekrar kullanicinin apletin yuklu oldugu HTML sayfasina donmekle birlikte calismaya baslar. Bu metod init metodu calismasini bitirdikten ve start metod calismaya basladiktan sonra appletin uzerine birseyler cizmek public void paint ( Graphics g ) icin calismaya baslar.Aplet tekrar boyanicak oldugu zaman tekrar otomatik olarakaktif hale gelir. Applet calismasini durdurdugunda veya kullanici HTML public void stop ( ) sayfasini terkettiginde veya kullanici HTML sayfasini terkettigi zaman calismaya baslar. Applet bellekten ayrildigi zaman calismaya baslar. Applet icin public void destroy ( ) ayrilmis kaynaklari yok eder. BY Ahmet Tolga Tat Sayfa 128 Java Lang Tüm object oriented dillerde olduðu gibi Java’da da bazý baþka hazýr sýnýflar size kullanmanýz için bir çok metot saðlar. Bu bölümde otomatik olarak yüklenen java.lang paketinin bazý sýnýflarýna deðineceðiz. java.lang paketi javanin dili olan siniflari icerir. java.lang.Math Tanýmlý Deðiþkenler; public final static double E – e sayýsýnýn hazýr deðerini verir. (2.71828...) public final static double PI – PI sayýsýnýn hazýr deðerini veirir. (3.14159... Metotlar; Metotlarý Math.metot() þeklinde çaðýrmalýsýnýz. public static type abs (type x) – Mutlak Deðer. public static double sqrt (double x) throws AritmeticException – Karekök. public static double pow(double x, double y) throws ArithmeticException – Üs alma. public static synchronized double random ( ) – Random sayý üretir. public static type max (type a, type b) – Ýki deðerin maksimumunu verir. public static long round (double x) – Verilen sayýyý yuvarlar. Örnek: //Path /Examples100/Math/Math1.java public class Math1 { public static void main (String args [ ] ) { int x; double rand, y, z, e; float max; rand = Math.random(); x=Math.abs(-123); y=Math.round(123.567); z=Math.pow(2,4); e=Math.E; max =Math.max((float)1e10, (float)3e9); BY Ahmet Tolga Tat Sayfa 129 System.out.println (rand); System.out.println (x); System.out.println (y); System.out.println (z); System.out.println (e); System.out.println (max); } } java.lang.Character Deklârasyon; char c; /* character deðiþkeni */ Character C; /* Character objesi */ Constructor; public Character (char deðer) – Verilen deðer ile bir karakter objesi oluþturur. Metotlar; public static boolean islowerCase (char ch) – Küçük harf ise true, degil ise false döner. public static boolean isUpperCase (char ch) - Büyük harf ise true, degil ise false döner. public static boolean isDigit (char ch) - Rakam ise true, degil ise false döner. public static boolean isSpace (char ch) - Boºluksa true, degil ise false döner. public static char toLowerCase (char ch) – Gelen karakteri küçük harfe çevirir. public static char toUpperCase (char ch) - Gelen karakteri büyük harfe çevirir. public char charValue ( ) – Verilen karakter objesinin char deðerini çevirir. public String toString ( ) – Karakter objesini String’e çevirir. Örnek; // Path /Examples100/Character/Char1.java public class Char1{ public static void main (String args[]){ char c1='A'; char c2='z'; char c3='5'; Character C1=new Character('C'); System.out.println ("Karakter "+c1+" buyuk harfmi? "+Character.isUpperCase(c1)); System.out.println ("Karakter "+c2+" buyuk harfmi? "+Character.isUpperCase(c2)); System.out.println ("Karakter "+c3+" rakam mi? "+Character.isDigit(c3)) ; BY Ahmet Tolga Tat Sayfa 130 System.out.println (c1+" kucuk harfe cevir: "+Character.toLowerCase(c1)); System.out.println ("Karakter objesi C1 in degeri: "+C1.charValue()); } } java.lang.Integer Deklârasyon; int i; /* integer deðiþkeni */ Integer I; /* Integer objesi */ Tanýmlý Deðiþkenler; public final static int MIN_VALUE – Bir integer’ýn alabileceði minimum deðeri verir. public final static int MAX_VALUE – Bir integer’ýn alabileceði maksimum deðeri verir. Metotlar; public static String toString (int i) – Verilen integer ‘i String’e çevirir. public static int parseInt (String s) throws NumberFormatException – Verilen String’i integer’a çevirir. public static Integer valueOf (String s) throws NumberFormatException - Verilen String’i integer objesine çevirir. public int intValue ( ) – Integer objesinin deðerini integer olarak verir. public long longValue( ) – Integer objesinin deðerini long olarak verir. public float floatValue( ) – Integer objesinin deðerini float olarak verir. public double doubleValue ( ) – Integer objesinin deðerini double olarak verir. public String toString ( ) – Integer objesinin deðerini String olarak verir. public boolean equals (Object obj) – Verilen objeyle karþýlaþtýrýr. Örnek; // Path /Examples100/Integer/Int1.java public class Int1 { public static void main (String args [ ] ) { Integer X; int x; double y; String stry=args[0]; X=Integer.valueOf("34") ; Try { x=Integer.parseInt(stry); BY Ahmet Tolga Tat Sayfa 131 System.out.println("x: "+x+", stringden alinmistir.") ; }catch (NumberFormatException e) { System.out.println ("Verilen arguman integer degildir.") ; System.exit (1) ; } y=X.doubleValue(); System.out.println("X double a cevrilmis: "+y); System.out.println("X as a String: " + X.toString ( ) ); } } java.lang.Long Long sýnýfýnýn metotlarý ve tarzý Integer sýnýfýnýn neredeyse aynýsýdýr. Gerekli metotlara API dokümantasyonundan bakýlabilir. java.lang.Float Deklârasyon; float f; /* float deðiþkeni f * / Float F; /* Float objesi F */ Constructor; public Float (type deðer) – Verilen float ya da double deðiþkeni ile bir Float objesi oluºturur. public Float (String s) throws NumberFormatException – Verilen String ile bir Float objesi oluºturur. Tanýmlý Deðiþkenler; public final static float MIN_VALUE – Bir float’ýn alabileceði minimum deðeri verir. public final static float MAX_VALUE – Bir float’ýn alabileceði maksimum deðeri verir. public final static float NEGATIVE_INFINITY – Eksi sonsuz. public final static float POSITIVE_INFINITY – Artý sonsuz. public final static float NaN – Sayý deðil (kendi dahil hiçbir þeye eþit olmayan bir float). Metotlar; public static native String toString (float f) – Verilen float’ý String’e çevirir. public static nativeFloat valueOf(String s) throws NumberFormetException – Verilen String’in deðerini float’a çevirir. BY Ahmet Tolga Tat Sayfa 132 public boolean is NaN( ) – Eðer Float objesinin deðeri NaN ise true, aksi halde false döner. public boolean isInfinite( ) - Eðer Float objesinin deðeri sonsuz ise true, aksi halde false döner. public String toString ( ) – Float objesini String’e çevirir. public int intValue ( ) – Float objesini integer’a çevirir. public long longValue ( ) – Float objesini long’a çevirir. public float floatValue ( ) – Float objesini float’a çevirir. public double doubleValue ( ) – Float objesini double’a çevirir. public boolean equals (Object obj) – Verilen objeyle karþýlaþtýrýr. java.lang.Double Double sýnýfýnýn metotlarý ve tarzý Float sýnýfýnýn neredeyse aynýsýdýr. Gerekli metotlara API dokümantasyonundan bakýlabilir. java.lang.String Constructor; public String (String deðer) – Verilen Stringden yeni bir String kopyasý yaratýr. public String (char deðer [ ] ) – Karakter dizisini String’e çevirir. public String (char deðer [ ], int offset, int sayý) – Karakter dizisini belli bir offset’ten baºlayarak belli sayýda karakter alarak String’e çevirir. Metotlar; public int length ( ) – String’in uzunluðunu geri verir. public char charAt(int index) – String’in belirli bir yerdeki karakterini verir. public boolean equals (Object obj) – String’i verilen objeyle karºýlaþtýrýr. public boolean equalsIsIgnoreCase (String s) - String’i verilen objeyle karþýlaþtýrýr fakat eþitliði ararken büyük küçük harflerden etkilenmez. public int compareTo(String s) – String’i verilen String ile karþýlaþtýrýr ve küçük, eþit ve büyük olma durumuna göre; negatif, sýfýr veya pozitif deðer döndürür. public booelan regionMatches (int offset, String diger, int doffset,int sayi) – String’i offset’ten baþlayarak verilen diðer String’de de doffset’ten baþlayarak sayi uzunluðunda karþilaþtýrýr. BY Ahmet Tolga Tat Sayfa 133 public boolean startsWith (String baº) – String’in verilen String ile baþlayýp baþlamadýðýný kontrol eder. public boolean andsWith (String son) – String’in verilen String ile bitip bitmediðini kontrol eder. public String substring (int baºIndex, int sonIndex) – Verilen baº ve son indexlerden String’i keserek yeni bir String yaratýr. public String concat (String str) – String’i verilen String ile birleºtirir. public String toLowerCase( ) –String’in tüm karakterlerini küçük harfe çevirir. public String toUpperCase( ) –String’in tüm karakterlerini büyük harfe çevirir. public String trim ( ) – String’in baþýndaki ve sonundaki boþluklarý atar. public char [ ] toCharArray ( ) – String’i karakter dizisine çevirir. public static String valueOf (type x) – Verilen x tipini String’e çevirir. public static String valueOf (char data[ ]) – Verilen karakter dizisini String’e çevirir. Örnek1; // Path /Examples100/String/String1.java class String1{ public static void main (String args[]){ String x="abc"; String y=new String("abc"); String z="abc"; if (x==y) System.out.println("x==y"); else if (x.equals(y)) System.out.println("x esittir y") ; if (x==z) System.out.println ("x==z"); } } Örnek2; // Path /Examples100/String/String2.java class String2{ public static void main (String args[]){ String bir=new String("Merhaba"); float f=3.141592f; String pi=String.valueOf(f); BY Ahmet Tolga Tat Sayfa 134 System.out.println("String bir: "+bir.toUpperCase()); System.out.println("String bir+pi: "+bir.concat(pi)); } } java.lang.StringBuffer Constructor; public StringBuffer ( ) – Boþ bir StringBuffer yaratýr. public StringBuffer (int i) – Boþ ama kapasitesi belli bir StringBuffer yaratýr. public StringBuffer (String str) Verilen String ile dolu bir StringBuffer yaratýr. Metotlar; public int length( ) – StringBuffer’ýn uzunluðunu verir. public synchronized void setLength (int yeniUzunluk) throws StringIndexOutOfBoundsException – StringBuffer’ýn uzunluðunu yeniden ayarlar. public synchronized char charAt (int index) throws StringIndexOutOfBoundsException – Ýstenen indexdeki karakteri verir. public synchronized void getChars (int bas, int son, char hedef[ ], int hBas) throws StringIndexOutOfBoundsException veya throws ArrayIndexOutOfBounds – StringBuffer daki baslangýç indexinden son indexine kadar olan karakterleri hedef karakter dizisine hBas indexinden tibaren atar. public synchronized void setCharAt (int index, char ch) throws StringIndexOutOfBoundsException – StringBuffer daki verilen indexteki karakteri verilen char karakteri yapar. public String toString( ) – StringBuffer ýn içerdiði veriyi bir String’e atar. public synchronized StringBuffer append (String str) – Bu StringBuffer’ýn sonuna bir String ekler. public synchronized StringBuffer insert(int offset, String str) throws StringIndexOutOfBoundsExceptio n – StringBuffer’ýn istenen offsetine, verilen String’i yerleºtirir. Örnek; // Path /Examples100/StringBuffer/StringBuffer1.java class StringBuffer1{ public static void main (String args[]){ int boy=args[0].length(); StringBuffer hedef=new StringBuffer(boy); BY Ahmet Tolga Tat Sayfa 135 for (int i=(boy-1);i>=0;i--){ hedef.append(args[0].charAt (i) ) ; } System.out.println(hedef.toString()); } } BY Ahmet Tolga Tat Sayfa 136 Java AWT Java API Paketleri Java bir çok önceden hazirlanmis sinif içermektedir. Bu siniflarin birbirleriyle iliskili olanlari package olusturmak üzere disk üzerinde ayni dizinlere gruplanmistir. Iste bütün bu package'lerin olusturdugu topluluk Java uygulamalari programlama arayüzleri (Java applications programming interface : Java API) olarak adlandirilmaktadir. Simdiye kadar ya zilan "import" metodu da bu sinifllarin bulundugu yerleri belirlemede kullanilmaktaydi. Bu arayüz Java'nin en büyü özelliklerinden birini olusturmaktadir, çünkü programcinin üzerindenbüyük bir yükü kaldirmaktadir. Java API Packages bir çok package içermektedir. Bunlarin hepsinin burada anlatilmasi uygun degildir. Sadece bir kaç örnek verilecektir. java.awt : Grafik arayüzleri yaratmak için gereken siniflari ve metotlari içerir. java.io : Programlarin girdi/çikti islemlerini gerçeklestirmek için gerekenler. java.net : Programlarin Internet veya Intranet üzerinden haberlesebilmesi için gerekenler. java.sql : Programlarin Veri tabanlarina erisimi için gerekenler. Ve daha bir çoklari. java.awt:Abstract Window.Toolkit. Çoklu platform destekli grafik tabanlý sýnýflarý içerir.Javanin en Onemli paketlerinden birisidir........ Temel AWT ve Olay Yakalama Java’nýn java.awt paketi GUI (Graphical User Interface – Grafiksel Kullanýcý Arabirimi) yaratmak için bir çok sýnýfa sahiptir ve ayný zamanda bunlarý yerleþtirmek için Layout Manager ‘larý ve olaylarý yakalamak için event sýnýfýný içerir. Genelde GUI parçalarýný eklemek için add komutu kullanýlýr ve de bunlarý eklemek için mutlaka bir panel veya frame’e ihtiyacýmýz vardýr. Frame Genelde appletlerde ekran sorun olmuyordu. Appletimiz zaten extend ettiði Applet sýnýfýndan panel olma özelliðini alýr ve kolayca grafiksel iþlemleri kaldýrýr. Fakat daha önce de fark ettiðiniz gibi henüz Java uygulamalarýnda grafiksel iþlemlerle çalýþamadýk çünkü bunu için frame kullanmamýz gereklidir. Örnek; //Path /Examples100/Frame/Frame1.java import java.awt.*; BY Ahmet Tolga Tat Sayfa 137 public class Frame1 extends Frame{ public static void main (String args[]){ Frame fr=new Frame("Merhaba Dunyali!"); fr.setSize(500,500); fr.setBackground(Color.blue); fr.show(); } } Panel Paneller de týpký frameler gibi GUI parçalarý ve hatta baþka panelleri eklemek için gerekli alaný yaratýr. Ýlk panel mutlaka bir window veya tabii ki bir frame objesine eklenmelidir. Örnek; //Path /Examples100/Panel/Panel1.java import java.awt.*; public class Panel1 extends Panel{ public static void main (String args[]){ Frame fr=new Frame("Panelli Frame!"); Panel pan=new Panel(); fr.setSize(500,500); fr.setBackground(Color.blue); fr.setLayout(null); pan.setSize(100,100); pan.setBackground(Color.yellow); fr.add(pan); fr.show(); } } Appletler zaten panel’in alt sýnýfý olduðundan direkt olarak GUI parçalarýný ekleyebiliriz Örnek; //Path /Examples100/Panel/Panel2.java import java.awt.*; import java.applet.Applet; public class Panel2 extends Applet{ Button but; public void init() { but=new Button(„OK“); BY Ahmet Tolga Tat Sayfa 138 add(but); } } Düzenleme Menejeri(layout manager) AWT elemanlarýný düzenlerken iki önemli þey bulunmaktadýr: 1. Panele yerleþtirerek hangi sýrada ve düzende elemanlarýn bulunacaðýnýn belirlenmesi 2. Ekranda panelin görünümünü idare eden düzenleme menejeri Ekrandaki her panelin bir düzenleme menejeri bulunur. AWT beº temel düzenleme menejeri kullanýlýr: 1.FlowLayout 2.GridLayout 3.GridBagLayout 4.BorderLayout 5.CardLayout Verilen bir panel için bir düzenleme menejeri yaratmak için setLayout() metodunu kullanabilirsiniz: public void init() { setLayout(new FlowLayout()); } Düzenleme menejeri bir defa yaratýldýktan sonra üzerine eleman ekleyebilirsiniz. FlowLayout Manager Bu yerleþim düzeninde eklenen parçalar liste þeklinde sýralanýr ve boº yerlere yerleþirler. Örnekte bir applet’e düðmeler ekleyeceðiz ve applet panel sýnýfýndan geldiði için FlowLayout’un sonucunu göreceðiz. FlowLayout (Akýþ Düzenleme) Sýnýfý FlowLayout sýnýfý en basit düzenleme biçimidir. Akýþ düzenleme sýnýfý elemanlarýn panele satýr, satýr sýralanmasýna izin verir. Eðer bir eleman bir satýra uymuyorsa bir sonrakine otomatik olarak yerleþtirilir. Akýþ düzenleme sýnýfýnýn satýr düzenleme olan aðý her satýr geçerlidir. Yani, bir satýrdaki elemanlarý ister ortaya yanaþýk, saða yanaþý k veya sola yanaþýk dizebilirsiniz. Basit ortaya yanaþýk bir FlowLayout sýnýfý yaratmak için aþaðýdaki satýrlarý kullanýnýz: setLayout(new FlowLayout()); Sola veya saða yanaþýk akýþ düzenleme sýnýfý oluþturmak için aþaðýdaki iki parametreyi kullanabilirsiniz(hiçbir parametre kullanýlmazsa ortaya yanaþýk olduðu varsayýlýr): FlowLayout.RIGHT FlowLayout.LEFT BY Ahmet Tolga Tat Sayfa 139 Yukarýdaki parametreleri aþaðýdaki gibi kullanabilirsiniz: setLayout(new FlowLayout(FlowLayout.LEFT)); FlowLayout sýnýfýnda elemanlar arasýndaki uzaklýklarý piksel olarak yatay ve dikey olarak (gap values-derinlik deðerleri) belirleyebilirsiniz. setLayout(new FlowLayout(FlowLayout.LEFT),10,10); Yukarýdaki örnekten de anlaþýlacaðý gibi eklediðimiz 10 deðerleri yatay ve dikey olarak iki eleman arasýndaki uzaklýðý piksel(nokta) olarak belirler. Örnek; //Path /Examples100/FlowLayout/FlowLayout1.java import java.awt.*; import java.applet.Applet; public class FlowLayout1 extends Applet{ Button but1,but2,but3; public void init() { but1=new Button(„But1“); but2=new Button(„But2“); but3=new Button(„But3“); add(but1); add(but2); add(but3); } } BorderLayout Manager Bu tarza göre beþ özel alan vardýr: North(kuzey), South(Güney), East(Doðu), West(Batý) ve Center(Merkez). Bir frame’e düðmeler ekleyip BorderLayout’un sonucunu göreceðiz çünkü Frame’lerde BorderLayout varsayýlan yerleþim düzeniydi. Border Layouts(Kenar Çizgi Layoutlarý) Border(kenar çizgi) Layout'larý, flow(akýþ) ve grid(ýzgara) Layoutlarýndan farklý olarak davranýr. Bir düzlemde, bir panel eklerken border layout kullanýlýr. Yerini belirlemek için coðrafi tanýmlamalar kullanýlýr; güney, doðu, batý ve merkez gibi. BY Ahmet Tolga Tat Sayfa 140 Border Layout'u kullanmak için, diðer layoutlarý kullanmak için oluþturduðumuz aþaðýdaki komut satýrýný yazýnýz: SetLayout(new BorderLayout()); Yukarýdaki satýrla oluþturulan BorderLayout üzerine elemanlar eklemek için add( ) metodunu kullanabilirsiniz. Add( ) metodunun ilk argümaný bir stringdir ve elemanýn Layout içindeki yerini belirlemek için kullanýlýr. Add("North",new TextField("Baþlýk",50)); Add("South",new TextField("Status",50)); add( ) metodunu diðer layout yöneticilerinde de kullanabilirsiniz. Border Layout'un hem yatay hem de dikey çukurlarý vardýr. Güney ve kuzey elemanlarýna ek olarak, diðer yön elemanlarý da kullanýlabilir. Panelin her bir tarafýna elemanlarý yerleþtirebilir siniz. Border Layout üzerinde çukurlar oluþturmak için, aþaðýdaki piksel deðerlerini parametre olarak kabul eden komutu kullanýnýz. SetLayout(new BorderLayout(10,10)); Örnek; //Path /Examples100/BorderLayout/BorderLayout1.java import java.awt.*; public class BorderLayout1 extends Frame{ public static void main (String args[]){ Frame fr=new Frame("BorderLayout!"); Button butN, butS, butE, butW, butC; butN=new Button(„North“); butS=new Button(„South“); butE=new Button(„East“); butW=new Button(„West“); butC=new Button(„Center“); fr.setSize(250,250); fr.add(„North“,butN); fr.add(„South“,butS); fr.add(„East“,butE); fr.add(„West“,butW); fr.add(„Center“,butC); fr.show(); } } GridLayout Manager Bu yerleþim tipi sýra ve sütun mantýðýna dayanýr. Mesela üç sýralý ve iki sütunlu bir GridLayout’ta GUI parçalarýný yerleþtirmek üzere altý adet hücre oluþur. BY Ahmet Tolga Tat Sayfa 141 Grid ve Grid Bag Layout Bir grid layout kullanarak bir paneli satýrlar ve kolonlara ayýrabilir siniz. Panele yerleþtirdiðiniz her bir eleman gridin(ýzgaranýn) bir hücresine karþýlýk gelir. Bir grid layout'u oluþturmak için kaç satýr ve sütundan oluþacaðýný belirleyiniz. Aþaðýdaki örnekte olduðu gibi satýr ve sütun sayýlarýný parametre olarak veriniz. SetLayout(new GridLayout(3,3)); Grid layoutlarda elemanlar arasýnda yatay ve dikey boþluklar oluþur. Bu baþlýklarý, aþaðýdaki piksel deðerlerini ekleyerek oluþturabilirsiniz. SetLayout(new GridLayout(3,3,10,15)); Yukarýdaki kod 10 piksel yatay, 15 piksel dikey boºluk oluºturur. GridBagLayout'larý, GridBAgLAyout sýnýfýndan elemanlarla oluþturulur. GridBagLayout sizin kullanýcý arayüzü elemanlarýnýzý dikdörtgensel bir grid içerisinde kullanmanýza yarar; fakat GridBagLayout'larda programcý daha fazla kontrol yapmak durumundadýr. Örnek; //Path /Examples100/GridLayout/GridLayout1.java import java.awt.*; import java.applet.Applet; public class GridLayout1 extends Applet{ Button but1,but2,but3,but4,but5,but6; public void init() { setLayout(new GridLayout(3,2)); //3 sýra 2 sutun but1=new Button(„But1“); but2=new Button(„But2“); but3=new Button(„But3“); but4=new Button(„But4“); but5=new Button(„But5“); but6=new Button(„But6“); add(but1); add(but2); add(but3); add(but4); add(but5); add(but6); } } BY Ahmet Tolga Tat Sayfa 142 Kart(Card) Layoutlarý Kart layoutlarý diðer layoutlardan farklýlýklar gösterir. Diðer layoutlarýn tam tersine, bir kart layoutuna elemanlarý eklediðimiz zaman, hepsi bir kerede ekranda gösterilmez. Kart layoutlarý, bir slide show gibi her bir kartý arka arkaya bir defada göste rmek için kullanýlýr. Genellikle, bir kart layout'u oluþtururken, ekleyeceðiniz elemanlar diðer container elemanlar olabilir(genellikle paneller). Her bir kart için farklý bir layout kullanarak, farklý görünümde ekranlar oluþturabilirsiniz. Panele eklediðiniz her bir kart için bir isim veriniz. Sonrasýnda, metodlar kullanarak CardLayout sýnýfýnda tanýmlanan metodlarla layout içerisindeki kartlar arasýnda geçiþ yapabilirsiniz. Aþaðýdaki örnekte, üç kart içeren bir layout vardýr: setLayout(new CardLayout()); Panel deneme1=new Panel() add("Birinci",deneme); Panel deneme2=new Panel() add("Ýkinci",deneme2); Panel deneme3=new Panel() add("Üçüncü",deneme3); show(bu,"Ýkinci"); Insets(kümeler) Insetler, bir panel üzerinde elemanlar arasýnda yatay ve dikey boþluklarýn miktarýný panel içerisinde belirlemede kullanýlýr. Panel üzerine yerleþtirilecek elemanlarýn üstten, alttan, soldan ve saðdan ne kadar boþluk býrakýlacaðýný belirlemede kullanýlýrlar. Bir inset oluþturmak için insets() metodunu kullanýný z. Public Insets insets(){ return new Insets(10,10,10,10); } Insets() metodunun yanýna verilen isim, örneðin yukarýdaki fonksiyon ismi de Insets olmak üzere, yanýna aldýðý dört parametrik deðer ile panel üzerinde yukarýdan, aþaðýdan, saðdan ve soldan piksel olarak ne kadar boþluk býrakýlacaðýný belirlerler. Button Radyo butonlar, kontrol kutularýnýn bir versiyonudur. Radyo butonlar görünüþ olarak kontrol kutularý gibidir. Fakat, bir radyo buton grubundan sadece bir tanesi seçilebilir. Bu butonlar birbirlerine seri baðlý þekildedir. Bir radyo butonlar grubu oluºturmak için ilk önce, bir CheckboxGroup oluþturulmalýdýr: CheckboxGroup.cbg=new CheckBoxGroup(); Yukarýda da görüldüðü gibi ilk önce bir kontrol kutusu grubu oluþturulmalý ve daha sonra aþaðýdaki gibi kontrol kutusu elemanlarý tanýmlanmalýdýr. BY Ahmet Tolga Tat Sayfa 143 add(new CheckBox("Evet",cbg,true); add(new CheckBox("Hayýr",cbg,false); Þimdi diðer bir örneði inceleyelim: CheckBoxGroup.cbg=new CheckBoxGroup(); add(new CheckBox("Yeºil",cbg,true); add(new CheckBox("Kýrmýzý",cbg,false); Yukarýdakilere ek olarak, getCheckGroup( ) ve setCheckboxGroup( ) metodlarýný kullanarak verilen bir kontrol kutusuna eriþebilir ve onun grubunu deðiþtirebilirsiniz. Sonuç olarak, getCurrent() ve setCurrent(checkbox) metodlarý, bir kontrol grub u içerisinde tanýmlanýrlar ve seçili, geçerli olan kontrol kutularýna eriþmeyi ve herhangi bir kontrol kutusunu geçerli hale getirm eyi saðlayan metodlardýr. Choice Seçim menüleri etiketler, butonlar ve kontrol kutularýna göre daha karmaþýk kullanýcý arayüzü (UI) elemanlarýdýr. Seçim menüleri popup menü (pull down menü) tipinde olabilirler. Kullanýcýnýn bir menü elemanýný seçmelerine olanak saðlarlar. Sonrasýnda da seçim ekranda görünür. Bir seçim menüsü oluþturmak için Choice sýnýfýndan bir örnek yaratýlmalýdýr. Sonrasýnda, oluþturduðunuz bu menü sistemine eleman eklemek için addItem() metodunu kullanýnýz. Choice c=new Choice(); c.addItem("Elma"); c.addItem("Armut"); add(c); --menüyü panele ekler Seçim menüsü ayný anda sadece bir tane eleman seçme olanaðý saðlar. Ayný anda birden çok eleman seçmek için kaydýrmalý listeleri(scrolling list) kullanýnýz. Seçim Menüsü Metodlarý {PRIVAT E}Metod getItem(int ) countItems () getSelecte dIndex() getSelecte dItem() select(int) select(strin g) Hareketi int parametresi ile belirlenen menü elemanýný geriye döndürür, int parametresi 0 deðeri ile baþlar ve dizi mantýðýnda olduðu gibi kullanýlýr. Bir seçim menüsündeki eleman sayýsýný verir. Seçili menü elemanýnýn indeks pozisyonunu geriye döndürür. Bir string olarak o anda geçerli olan elemaný geriye döndürür. Verilen bir pozisyondaki elemaný seçer. Verilen string ile menü elemanýný seçer. Örnek; //Path /Examples100/Choice/Choice1.java import java.awt.*; import java.applet.Applet; BY Ahmet Tolga Tat Sayfa 144 public class Choice1 extends Applet{ Choice renkSecici; public void init() { renkSecici=new Choice(); renkSecici.addItem („Mavi“); renkSecici.addItem („Sari“); renkSecici.addItem („Yesil“); add(renkSecici); } } Checkbox Ýþaretleme kutularý. Kontrol kutularý, seçmek veya seçimi kaldýrmak için kullanýlan iki deðerli elemandýr. Kontrol kutularý iþaretli(on) veya iþaretsiz(off)dirler. Bu kontrol kutularýný belirlemek için iki özel durum söz konusudur: Özel olmayan halde, kontrol kutularý birden çok ise birbirlerine seri olarak baðlý deðildirler. Özel halde ise, bir seri kontrol kutusu vardýr ve içlerinden sadece birisi seçilebilecektir. Özel olmayan kontrol kutularýný CheckBox sýnýfýný kullanarak aþaðýdaki seçeneklerden biriyle oluºturabilirsiniz: CheckBox(), seçili olmayan kontrol kutusunu oluºturur. CheckBox(String), verilen stringi etiket olarak kullanan bir kontrol kutusu oluºturur. CheckBox(String,null, boolean), verilen stringi etiket olarak kullanan bir kontrol kutusu oluþturur ve boolean argümanýnýn doðru(true) olup olmamasýna(false) göre ya seçilidir ya da seçili deðildir. Aþaðýda kontrol kutularý için haýrlanmýþ örnekleri bulabilirsiniz: add(new Checkbox("kitap")); add(new Checkbox("kalem")); add(new Checkbox("silgi")); add(new Checkbox("Çanta,null,true"); Kontrol Kutusu Metodlarý {PRIVATE} Hareketi Metod getLabel() Kontrol kutusunun etiketini geriye döndürür. setLabel(strin Kontrol kutusunun etiketini deðiþtirir. g) getState() Kontrol kutusunun seçili olup olmadýðýný geriye döndürür. setState(bool Kontrol kutusunun durumunu deðiþtirir, seçili ise seçili deðil, seçili deðilse seçili ean) durumuna döndürür. BY Ahmet Tolga Tat Sayfa 145 Örnek; //Path /Examples100/Checkbox/Checkbox1.java import java.awt.*; import java.applet.Applet; public class Checkbox1 extends Applet{ Checkbox cb1; Checkbox cb2; public void init() { cb1=new Checkbox(„Acil“); cb2=new Checkbox(„Lux“); add(cb1); add(cb2); } } Radio Buttons CheckboxGroup kavramýyla birleþmiþ ve iliþkili hareket eden Checkbox’lara verilen isimdir. Radyo butonlar, kontrol kutularýnýn bir versiyonudur. Radyo butonlar görünüº olarak kontrol kutularý gibidir. Fakat, bir radyo buton grubundan sadece bir tanesi seçilebilir. Bu butonlar birbirlerine seri baðlý þekildedir. Bir radyo butonlar grubu oluºturmak için ilk önce, bir CheckboxGroup oluþturulmalýdýr: CheckboxGroup.cbg=new CheckBoxGroup(); Yukarýda da görüldüðü gibi ilk önce bir kontrol kutusu grubu oluþturulmalý ve daha sonra aþaðýdaki gibi kontrol kutusu elemanlarý tanýmlanmalýdýr. add(new CheckBox("Evet",cbg,true); add(new CheckBox("Hayýr",cbg,false); Þimdi diðer bir örneði inceleyelim: CheckBoxGroup.cbg=new CheckBoxGroup(); add(new CheckBox("Yeºil",cbg,true); add(new CheckBox("Kýrmýzý",cbg,false); Yukarýdakilere ek olarak, getCheckGroup( ) ve setCheckboxGroup( ) metodlarýný kullanarak verilen bir kontrol kutusuna eriþebilir ve onun grubunu deðiþtirebilirsiniz. Sonuç olarak, getCurrent() ve setCurrent(checkbox) metodlarý, bir kontrol grubu içerisinde tanýmlanýrlar ve seçili, geçerli olan kontrol kutularýna eriþmeyi ve herhangi bir kontrol kutusunu geçerli hale getirm eyi saðlayan metodlardýr. Örnek; BY Ahmet Tolga Tat Sayfa 146 //Path /Examples100/Radio/Radio1.java import java.awt.*; import java.applet.Applet; public class Radio1 extends Applet{ CheckboxGroup cbg; public void init() { cbg=new CheckboxGroup(); add(new Checkbox(„bir“,cbg,true)); add(new Checkbox(„iki“,cbg,false)); add(new Checkbox(„uc“,cbg,false)); } } Menu’ler Choice menus Seçim menüleri etiketler, butonlar ve kontrol kutularýna göre daha karmaþýk kullanýcý arayüzü (UI) elemanlarýdýr. Seçim menüleri popup menü (pull down menü) tipinde olabilirler. Kullanýcýnýn bir menü elemanýný seçmelerine olanak saðlarlar. Sonrasýnda da seçim ekranda görünür. Bir seçim menüsü oluþturmak için Choice sýnýfýndan bir örnek yaratýlmalýdýr. Sonrasýnda, oluþturduðunuz bu menü sistemine eleman eklemek için addItem() metodunu kullanýnýz. Choice c=new Choice(); c.addItem("Elma"); c.addItem("Armut"); add(c); --menüyü panele ekler Seçim menüsü ayný anda sadece bir tane eleman seçme olanaðý saðlar. Ayný anda birden çok eleman seçmek için kaydýrmalý listeleri(scrolling list) kullanýnýz. Seçim Menüsü Metodlarý {PRIVAT E}Metod BY Ahmet Tolga Tat Hareketi Sayfa 147 getItem(int ) countItems () getSelecte dIndex() getSelecte dItem() select(int) select(strin g) int parametresi ile belirlenen menü elemanýný geriye döndürür, int parametresi 0 deðeri ile baþlar ve dizi mantýðýnda olduðu gibi kullanýlýr. Bir seçim menüsündeki eleman sayýsýný verir. Seçili menü elemanýnýn indeks pozisyonunu geriye döndürür. Bir string olarak o anda geçerli olan elemaný geriye döndürür. Verilen bir pozisyondaki elemaný seçer. Verilen string ile menü elemanýný seçer. Asagida Menu’ya bir örnek verilmistir.Programi kayit ederken BabaMenu diye kayid edip derleyin.Cünkü programda Public olan BabaMenu’dür. Örnek: import java.awt.*; import java.awt.event.*; class AnaMenu extends MenuBar { private MenuItem aGeri; private CheckboxMenuItem aRenk; public AnaMenu() { Menu m; //Datei m = new Menu("File"); m.add(new MenuItem("Yeni")); m.add(new MenuItem("Tekrar")); m.add(new MenuItem("Kaydet")); m.addSeparator(); m.add(new MenuItem("Cik")); add(m); //Bearbeiten m = new Menu("Calisma"); m.add((aGeri = new MenuItem("Geri"))); m.addSeparator(); m.add(new MenuItem("Kes")); m.add(new MenuItem("Kopyala")); m.add(new MenuItem("Yazdir")); m.add(new MenuItem("Sil")); add(m); //Optionen BY Ahmet Tolga Tat Sayfa 148 m = new Menu("Optionen"); m.add(new MenuItem("Einstellungen")); m.add((aRenk = new CheckboxMenuItem("Renk"))); add(m); //Info m=new Menu("Bilgi"); m.add(new MenuItem("Hakkinda")); m.add(new MenuItem("Yardim")); Menu m1=new Menu("YaziTipi"); m1.add(new MenuItem("Verdana")); m1.add(new MenuItem("Arial")); m1.add(new MenuItem("Impact")); m.add(m1); add(m); enableRueckgaengig(false); //Farbe anschalten setFarbe(true); } public void enableRueckgaengig(boolean ena) { if (ena) { aGeri.setEnabled(true); } else { aGeri.setEnabled(false); } } public void setFarbe(boolean on) { aRenk.setState(on); } } public class BabaMenu extends Frame { public static void main(String[] args) { BabaMenu wnd=new BabaMenu(); } public BabaMenu() { super("Menu Programi"); setLocation(100,100); setSize(500,400); setBackground(Color.white); BY Ahmet Tolga Tat Sayfa 149 setMenuBar(new AnaMenu()); setVisible(true); addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent event ) { setVisible(false); dispose(); System.exit(0); } } );//dikkat ) ? } } Text Fields Text alanlarý, string giriþine olanak saðlayan kullanýcý arayüzü elemanlarýdýr. Text alaný oluþturmak için aþaðýdaki adýmlardan birini kullanabilirsiniz: TextField(), 0 karakter uzunluðunda boþ bir text alaný oluþturur. TextField(int), int parametresi ile verilen uzunlukta bir string oluºturur. TextField(String), 0 karakter uzunluðunda yer ayýrarak verilen stringi ilk deðer olarak atar. TextField(String, int), int parametresi uzunluðunda yer ayýrarak, String deðerini ilk deðer olarak atar. Aþaðýdaki örnek, 30 karakter uzunluðundaki bir text alaný oluþturur ve ilk deðer olarak içerisine "Adýnýzý Giriniz:" stringini yerleþtirir. TextField tf=new TextField("Adýnýzý Giriniz",30) add(tf); BY Ahmet Tolga Tat Sayfa 150 Text alanlarýnýn önünde etiketler kullanabilirsiniz. Text alanlarý, text bölgesinden(text area) farklýdýr. Text alanlarý sýnýrlý büyüklükteyken tek satýrlýk bilgilerin giriþi için kullanýlýrlar. Text alanlarý sýnýrlý büyüklükteyken tek satýrlýk bilgilerin giriþi için kullanýlýrlar. Text bölgelerinin kaydýrma çubuklarý ve pencereleri vardýr, bu yüzden kullaným açýsýndan çok satýrlý bir text alaný gibi düºünülebilir. Text alanlarýný þifreler için de kullanabilirsiniz. Bu tip text alanlarýnýn içerisine bilgi giriþi olduðu halde girilen karakterleri belirleyemezsiniz. Text alaný ile bir þifre oluþturmak için, ilk önce bir text alaný oluþturulur ve daha sonra setEchoCharacter( ) metodu kullanýlýr. Aþaðýdaki örnek bir þifre giriþi saðlar: TextField tf=new TextField(30); tf.setEchoCharacter("*"); Bu örnekte ise iki text alaný ve bir þifre alaný oluþturulmaktadýr: add(new Label("Adýnýzý Giriniz")); add(new TextField("Adýnýzý bu alana giriniz",45)); add(new Label("Soyadýnýzý Giriniz")); add(new TextField("Soyadýnýzý bu alana giriniz",45)); add(new Label("Telefonunuzu Giriniz")); TextField t=new TextField(20); t.setEchoCharacter('*'); add(t); Text alanlarý TextComponent sýnýfýndan miras alýnýrlar. Text Alaný Metodlarý {PRIVATE} Hareketleri Metod getText() String olarak text alanýnýn deðerini geriye döndürür. setTextStrin Verilen stringi text alanýna koyar. g() getColumns( Text alanýnýn geniþliðini geriye döndürür. ) select(int,int Ýki tamsayý pozisyon arasýndaki textleri seçer(pozisyonlardan 0'dan baþlar). ) selectAll() Text alanýndaki tüm textleri seçer. Textin görünebilir olup olmadýðýný belirler. True(doðru) veya false(yanlýþ) deðeri isEditable() döndürür. setEditable( Textin görünebilirliðini kaldýrabilir veya eski haline döndürebilir, boolean boolean) parametresi true veya false deðerlerinden birini alýr. getEchoChar Text alanýna girilen stringi kapatan karakteri belirler. () echoCharIsS Text alaný için stringi kapatma karakteri belirler et() BY Ahmet Tolga Tat Sayfa 151 Olay Yakalama(Events) Kullanýcý tarafýndan yapýlan olaylarý yani iþlemleri ve hareketleri farkedebilme ve bunlarýn etkisi ile bazý görevleri yerine getirme kavramýdýr. JDK 1.1 ile beraber eski olay yakalama kavramý tamamen deðiþmiþtir. Artýk çok daha fazla object oriented ve kullanýmý kolaydýr. Örnek; //Path /Examples100/Event/Event1.java import java.applet.Applet; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Event1 extends Applet implements ActionListener { Button but; TextField tf1, tf2; public void init() { setLayout(new BorderLayout()); but=new Button("Karesi"); tf1=new TextField(); tf2=new TextField(); tf2.setEditable(false); add("North",tf1); add("South",tf2); add("Center", but); but.addActionListener(this); } public void actionPerformed(ActionEvent e) { tf2.setText(Double.toString(Math.pow(Integer.parseInt(tf1.getText()),2))); } } Kullanýcý Arayüzü(UI) Olaylarýný ve Hareketlerini Ele Almak Herhangi bir UI elemanýný harekete geçirmek için bir action() metodunu applet veya applet sýnýfýnda tanýmalayýnýz. Public boolean action(Event evt,Object arg){ .......................... } action( ) metodu, temel mouse ve klavye hareketlerine benzer. Bu metodlar gibi, pas geçilen nesne bu olayý simgeler. Action metodunun ikinci argümaný olayý üretecek kullanýcý arayüzü elemanýna dayanýr. Bir BY Ahmet Tolga Tat Sayfa 152 eleman bir olay üretirken, daha sonra gerekecek olan bilgiler pas edilir. Ek bilgiler action( ) metodu ile pas edilir. Etiketler haricindeki tüm kullanýcý arayüzü elemanlarýnýn farklý hareketleri ve argümanlarý vardýr: Butonlar seçilip, týklandýðýnda hareket oluþturulur ve bir butonun argümaný butonun etiketidir. Kontrol kutularýnýn her iki türü(exclusive ve non-exclusive checkboxes) de kutu seçildiðinde iþaretlenir. Argümaný her zaman "doðrudur". Seçim menüleri, bir menü elemaný seçildiðinde bir hareket üretirler ve argümaný o seçilen menü elemanýdýr. Text alanlarý; kullanýcý imleç text alanýndayken enter tuþuna basarak geri dönerken bir hareket yaratýr. Örneðin, tab butonu ile bir diðer text alanýna geçilebilir veya mouse ile bir buton týklanabilir veya return hareketine baðlý bir trigger(tetikley ici) koºturulabilir. Temel hareketlerin tam aksine, seçebileceðiniz birçok nesneye deðiþik hareketler baðlayablirsiniz. Bunlardan biri de, "Mouse Down" olayýdýr. Birçok kullanýcý arayüzü elemanlarýnýn ürettiði farklý hareketleri action( ) metodu ile belirleyebilirsiniz. Bu arayüz elemanlarýnýn hangilerinin hareket için gönderildiklerini belirlemede instanceOf operatörünü kullanýnýz. Public void boolean action(Event evt,Object arg) { if(evt.target instanceof(TextField) handleText(evt.target); else if(evt.target instanceof Choice) handleChoice(arg); } Buna raðmen, kullanýcý arayüzü elemanlarýnýn hareketini action( )'ýn bodysi içerisinde ele alabilirsiniz. Böylece her elemaný ayrý ayrý metodla tanýmlamak yerine, action( ) metodu içerisinde bir defada tanýmlayabilirsiniz. Burada, iki tane handler(ele alan) metod var. Text alanýndaki hareketi ele alan metod, handleText(). Seçim menüsü üzerindeki bir elemanýn hareketini ele alan handleChoice metodudur. Ele almak istediðiniz harekete beðlý olarak, hareketten argüman pas edebilirsiniz, örneðin UI elemanýnýn yolladýðý bilgi veya diðer içerebilecek herhangi bir bilgiyi... Aþaðýda beþ temel button üzerinde renklendirilmiþ etiketler bulunmaktadýr. Action( ) metodu, bit buton hareketi için test eder ve kelimeyi changeColor( ) metoduna pas eder. Böylece üzerine týklanan butonun r engi ekranýn arka fontu olarak deðiþir. import java.awt.*; public class ButtonActionsTest extends java.applet.Applet { public void init(){ setBackground(Color.white); add(new Button("Red")); add(new Button("Blue")); add(new Button("Green")); add(new Button("White")); add(new Button("Black")); } BY Ahmet Tolga Tat Sayfa 153 public boolean action(Event evt,Object arg) { if(evt.target instanceof Button) changeColor((String)arg); return true; } void changeColor(String bname) { if(bname.equals("Red")) setBackground(Color.red); else if(bname.equals("Blue")) setBackground(Color.blue); else if(bname.equals("Green")) setBackground(Color.green); else if(bname.equals("White")) setBackground(Color.white); else if(bname.equals(Color.black); } } Ýç-Ýçe Paneller ve Elemanlar Özel appletlere kullanýcý arayüzü(UI) elemanlarý eðlendiricidir; fakat iç içe yerleºtirilmiº panellerle görsel güzelliklere eriºebilirsiniz. Bu panel üzerine çeºitli boyutlarda paneller ekleyerek; üzerlerinde farklý renkler belirleyebilirsiniz. Ýç-Ýçe Paneller Paneller gerçekten ekranda görüntülenen elemanlardýr; panellerin en büyük sýnýfý containerlardýr; diðer elemanlarý içerisinde bulundurur. Applet sýnýfý panelin bir alt sýnýfýndan kalýtým yoluyla appletleri alýr. Panelleri bir applet içerisine atmak için, yeni bir panel oluþturunuz ve applete ekleyiniz; diðer herhangi bir kullanýcý arayüzü(UI) elemanlarýný da ekleyebilirsiniz. SetLayout(new GridLayout(1,2,10,10); Panel Panel1=new Panel(); Panel Panel2=new Panel(); add(panel1); add(panel2); Daha sonrasýnda, her bir paneli birbirinden baðýmsýz olarak kullanabilirsiniz. Panel1.setLayout(new FlowLayout()); Panel1.add(new Button("Up")); Panel1.add(new Button("Down")); Olaylar(Events) ve Ýç-Ýçe Paneller Ýç-içe paneller yaratýlýrken, paneller bir hiyerarþi içerisinde sýralanýrlar. Bu hiyerarþi, bir appletteki elemanlarýn birbiriyle nasýl etkileþeceðini belirleyeeceðinden önemlidir. Ayrýca, hiyerarþi olaylarý ele almayý da etkiler, özellikle kullanýcýnýn giriþ olaylarý, örneðin mouse ve klavye olaylarý gibi... Olaylar, en içteki elemanlardan alýnýr ve gövdeye doðru zincir geçilir. Örneðin, bir alt panelde mouse olaylarý (mouseDown( ) ve mouseUp( ) metodlarý) kullanýlsýn ve panel bir buton içersin. Butonu týklamak, paneli yaptýðýndan önce butonun olayý almasý demektir. BY Ahmet Tolga Tat Sayfa 154 Temel olay metodlarý geriye mantýksal deðerler döndürür. Bir olayý ele alma metodu, ister temel olay metodlarý olsun, isterse daha jenerik handleEvent( ) olsun, verilen rasgele bir olayda, aþaðýdaki üç þeyi yapabilir: Olayla iliþkili deðildir (bu genellikle handleEvent( ) için doðrudur; çünkü tüm olaylarý sistem aracýlýðý ile üretir). Durum bu ise, olay bir eleman onu proses edene kadar geçer. Bu durumda, olayý ele alma metodu "false(yanlýþ)" geriye döndürmelidir. Olayý yakalar, iþler ve geriye "true(doðru)" döndürür. Bu yöntemde olay; o olayla ilintili metod ile durdurulur. Bu durumda temel mouseDown(); keyDown() metodlarý kullanýlýr. Metodu yakalar, iþler ve bir sonraki olay alýcýsýna gönderir. Bu daha az kullanýlan bir metoddur. Bu halde olay metodu, geriye "false(yanlýþ)" döndürmelidir. Kullanýcý Arayüzü Elemanlarýna Ekler Burada ele alýnacak UI elemanlarý hareket üretmediklerinden, action( ) metodunu kullanarak davranýþlarýný ele alamazsýnýz. Bunun yerine, jenerik bir handleEvent() kullanýlmalýdýr. Text Bölgeleri(Text Areas) Text bölgeleri, text alanlarýna(text fields) benzer; fakat text alanlarýndan farklý olarak fazla miktarda veri satýrý alma yeteneðine sahiptirler. Text alanlarý sýnýrlý büyüklüktedir ve aþaðýya, yukarýya doðru kaydýrýlamaz. Text giriþi için çok kullanýþlý dýrlar. Bir text alaný oluþturmak için aþaðýdaki fonksiyonlardan herhangi birini kullanabilirsiniz: TextArea( ), 0 satýr uzunluðunda ve 0 karakter geniþliðinde boþ bir text bölgesi oluþturur. Text bölgesine bir boyut vermeden panele eklemeyiniz; çünkü görüntülenmemesi gibi bir problem oluþacaktýr. TextArea(int,int), verilen sayýda satýr ve kolondan oluþan boþ bir text bölgesi oluþturur. TextArea(String) 0 satýr ve 0 kolondan oluþan ve Stringi görüntülemeye çalýþan bir text bölgesi oluºturur. TextArea(String,int,int) verilen boyutta Stringi görüntüleyen bir text bölgesi oluºturur. String str="Bir zamanlar bir cadý vardý, küçük çocuklarý kaçýrýrdý" add(new TextArea(str,10,60)); Hem text bölgeleri hem de text alanlarý TextComponent sýnýfýndan özellikleri kalýtým yoluyla alýrlar. Text Bölgesi Metodlarý {PRIVATE}Metod Hareketi getColumns() Text bölgesinin karakter veya kolon olarak geniþliðini belirler. getRows() Text bölgesindeki satýrlarýn sayýsýný döndürür. insertText(String,int) Pozisyonu belirtilen texti yerleºtirir. replaceText(String,int,i Verilen bir pozisyondaki yeni stringi eskisiyle deðiþtirir. nt) setLineIncrement(int Scrollbarýn kaç satýr olarak deðiþeceðini belirler, default deðeri 1 dir inc) getLimeIncrement() Son noktasý belirlenmiþ bir scrollbarýn satýrlar arasý artýþ miktarýný BY Ahmet Tolga Tat Sayfa 155 belirler. getPageIncrement(int Scrollbar seçiliyken bir sayfalýk scrolling miktarýný belirler.Default inc) deðeri 10 dur. GetPageIncrement Scrollbar seçiliyken bir scrolling hareketinin kaç satýr olduðunu belirler. Scrolling(kaydýrma) Listeleri Seçim menülerini hatýrlayýnýz, farklý opsiyonlar içerisinden bir seçim yapmanýza olanak saðlarlar. Bir kaydýrma listesi, fonksiyonellik olarak seçimlik menülere benzerler. Bir listeden birden çok seçim yapabilirsiniz. Kaydýrma listeleri iki önemli yönden farklýlýk gösterirler: Kaydýrma listeleri(scrolling lists) pop-up menü deðillerdir. Elemanlardan oluþan birer listelerdir. Bir listeden bir veya daha çok eleman seçimine olanak saðlarlar. Diðer elemanlara eriþebilmeniz için scrollbar(kaydýrma çubuðu) vardýr. Bir kaydýrma listesi, istenirse bir defada sadece bir eleman seçimine olanak saðlar(exclusive) veya birden çok eleman seçimini saðlayabilir(nonexclusive ). Bir kaydýrma listesi oluþturmak için, List sýnýfýnýn bir örneðini yaratýnýz. Sonraki adýmda bir listeye eleman ekleyiniz. List sýnýfýnýn iki constructor'u (oluþturucusu) vardýr. List() her defasýnda sadece bir eleman seçimine olanak saðlayan bir kaydýrma listesi yaratýr. List(int, boolean) belirlenen sayýda görünen satýr ile ekranda boþ bir kaydýrma sýnýfý yaratýr. Boolean argümaný birden çok satýr seçilebiliyorsa (true), seçilemiyorsa (false) deðerini alýr. Bir liste nesnesi oluºturduktan sonra, addItem() metodunu kullanarak elemanlarý listeye ekleyiniz. Sonra da, elemaný iliþkilendirmek istediðiniz panele ekleyiniz. List eleman=new List(5,true); eleman.addItem("NewYork"; eleman.addItem("Chicago"; eleman.addItem("Miami"; eleman.addItem("Londra"; eleman.addItem("Michigan"; eleman.addItem("Paris"; Kaydýrma Listesi Metodlarý table border> MetodHareketi getItem(int)Belirlenen pozisyondaki stringi geriye döndürür. countItems()Menüdeki eleman sayýsýný geriye döndürür. getSelectedIndex()Seçili elemanýn index pozisyonunu geriye döndürür. getSelectedIndexes()Index pozisyonlarýný bir dizi olarak geriye döndürür. getSelectedItem()Seçili olan elemaný bir string olarak geriye döndürür. getSelectedItems()Birden çok seçili eleman varsa, bir dizi olarak string deðerlerini geriye döndürür. select(int)Belirlenen bir pozisyondaki elemaný seçer. select(String)Be lirlenen bir stringe sahip elemaný seçer. Scrollbar(kaydýrma çubuklarý) ve Sliderlar Text alanlarý ve kaydýrma listeleri kendi kaydýrma çubuklarýna (scrollbars) sahiptirler. Bu tür kullanýcý arayüzü elemanlarýnda kaydýrma çubuklarý elemanlardan baðýmsýz parçalar deðillerdir. Bir kullanýcý arayüzü olarak kaydýrma çubuklarýný (scrollbars) veya sliderlarý tek baþýna yaratabilirsiniz. Kaydýrma çubuklarý bir maximum ve minumum arasýndaki deðerleri seçmek için kullanýlýr. BY Ahmet Tolga Tat Sayfa 156 Baþlangýç ve scrollbarýn sonundaki oklar bazý küçük unite deðerleri ile azaltýlýr veya arttýrýlabilir.(default deðeri 1 dir) Bir defalýk Page-Down hareketi sonucunda getirilecek satýr sayýsý.(default deðeri 10 dur) Scrollbar üzerinde bulunan kutuya asansör veya baþparmak denir. Mouse ile bu kut uyu hareket ettirerek listeler içerisinde daha hýzlý ilerleyebilirsiniz. Bir scrollbar yaratmak için üç tane constructor(oluºturucu) kullanabilirsiniz. Scrollbar(), default deðeri 0 olan bir kaydýrma çubuðu yaratýr. Scrollbar(int), default deðeri 0 olan bir kaydýrma çubuðu yaratýr. Argüman, Scrollbar.Horizontal ve Scrollbar.Vertical sýnýf deðiþkenlerini kullanabilmeniz için olanak saðlar. Scrollbar(int, int, int, int) aþaðýdaki argümanlara sahip bir scrollbar yaratýr. Argüman I. Scrollbarýn yatay mý yoksa dikey mi olduðunu belirler: Scrollbar.Horizontal Scrollbar.Vertical Argüman II. Maximum ve minumum deðerler arasýndaki deðeri simgeler. Argüman III. Scrollbarýn kutusunun geniþliðini veya yüksekliðini belirler. Argüman IV. ve Argüman V. scrollbar için kullanýlacak minumum ve maximum deðerleri belirler. Aþaðýda çok basit bir scrollbar örneði listelenmiþtir. Bu scrollbarýn sayacý deðiþtikçe sol tarafýna kaçýncý deðer üzerinde olduðu yazýlmaktadýr. import java.awt.*; public class SliderTest extends java.applet.Applet { Label I; public void init() { I=new Label("0"); add(I); add(new Scrollbar(Scrollbar.HORIZONTAL,0,0,1,100)); } public boolean handleEvent(Event evt) { if (evt.target instanceOf Scrollbar) { int v=((Scrollbar)evt.target).getValue(); I.setText(String.valueOf(v)); } return true; } } Scrollbar Metodlarý {PRIVATE}Metod getMaximum() getMinumum() getOrientation() getValue() setValue(int) Hareketi Maximum deðeri geriye döndürür. Minumum deðeri geriye döndürür. Scrollbarýn yönünü geriye döndürür: 0 ->Scrollbar.HORIZONTAL 1 ->Scrollbar.VERTICAL Scrollbarýn o andaki geçerli deðerini döndürür. Scrollbarýn geçerli deðerini oluþturur. Kanvaslar(canvases) Bir kanvas(canvas) üzerine çizim yapýlabilen bir elemandýr. Bir kanvas yaratmak için Canvas sýnýfýný kullanýnýz. BY Ahmet Tolga Tat Sayfa 157 Canvas can=cew Canvas(); add(can); UI Olaylarý(kullanýcý arayüzü olaylarý) Önceki bölümde kullanýcýnýn klavye veya mouse giriþinden üretilen temel olaylarýn özellikleri incelendi. Bu olay tipleri Event nesnelerinin bir olay numarasý (event id) olarak depolanýr. MouseDown(), keyDown() olaylarýný kullanarak bu olaylarý ele alan metodlar tanýmlanýr. Olaylarý yönetmenin en genel yöntemi, handleEvent() metodunu kullanmaktýr. Ek Olaylar(Events) {PRIVATE}Ol ay Action_Event Key_Action List_Deselect List_Select Scroll_Absolut e Scroll_Line_D own Scroll_Line_U p Scroll_Page_D own Scroll_Page_U p Hareketi Bir UI elemaný hareket oluþturduðunda üretilir. Text alaný hareketi oluþtuðunda üretilir. Bir kaydýrma listesinde(scrollinglist) elemanlarýn seçimi kaldýrýldýðýnda üretilir. Bir kaydýrma listesindeki elemanlarýn seçimi durumunda üretilir. Scrollbarýn kutusu hareket ettirilirken üretilir. Scrollbarýn altýndaki veya solundaki ok týklandýðýnda üretilir. Scrollbarýn üstündeki veya saðýndaki ok týklandýðýnda üretilir. Scrollbarýn altýndaki alanlara veya saðýndaki alanlara geçildiðinde üretilir. Scrollbarýn üzerindeki alanlara veya solundaki alanlara geçildiðinde üretilir. Örnek: import java.awt.*; import java.applet.*; public class gui2 extends Applet { private TextArea t1,t2; private Button b; public void init() { String s ="Bir asagi bir de yukari dogru \n"+ "bakiyordu. Sanki birseyler arar gibiydi. \n" + BY Ahmet Tolga Tat Sayfa 158 "O sirada tam arkasinda bir seyler kimildadi.\n"+ "O da ne !!?...."; t1=new TextArea (5,20); t1.setText (s); t2=new TextArea (5,20); b=new Button ("KOPYALA>>>"); setLayout (new FlowLayout (FlowLayout.RIGHT,55,55)); add (t1); add (b); add (t2); } public boolean action (Event e,Object o) { if (e.target==b) { t2.setText (t1.getSelectedText()); return true; } return false; } } Örnek: import java.awt.*; import java.applet.*; public class renklicerceve extends Applet { private DemoFrame f; private Button showFrame; public void init() { String s="Click here!"; showFrame=new Button(s); add(showFrame); } public boolean action (Event e, Object o) { if (e.target==showFrame ) { String s="This frame does something!"; if (f!=null){ f.hide(); f.dispose(); } f=new DemoFrame(s); f.resize(300,200); f.setResizable(false); f.show(); } return true; } } class DemoFrame extends Frame { private Button a,b,c,d; public DemoFrame (String s) { super (s); a=new Button ("Yellow"); b=new Button ("Red"); c=new Button ("Blue"); BY Ahmet Tolga Tat Sayfa 159 d=new Button ("Green"); add ("North",a); add ("East",b); add ("South",c); add ("West",d); } public boolean handleEvent (Event e) { if (e.id==Event.WINDOW_DESTROY){ hide(); dispose(); return true; } return super.handleEvent(e); } public boolean action (Event e,Object o) { if (e.target==a) setBackground (Color.yellow); else if (e.target==b) setBackground (Color.red); else if (e.target==c) setBackground (Color.blue); else if (e.target==d) setBackground (Color.green); repaint(); return true; } } Örnek: import java.applet.Applet; import java.awt.*; public class kartlar extends Applet { private Canvas c; private CardLayout cardManager; private Panel deck,p1,p2,p3,p4; private Button b1,b2,b3,prevButton, nextButton,lastButton,firstButton; public void init() { setLayout ( new BorderLayout () ); b1=new Button ("FIRST CARD"); b2=new Button ("SECOND CARD"); b3=new Button ("THIRD CARD"); c=new Canvas(); c.setBackground(Color.green); c.resize(80,80); deck=new Panel(); cardManager=new CardLayout(); deck.setLayout (cardManager); add ("East",deck); p1=new Panel(); p1.add(b1); deck.add(b1.getLabel(),p1); p2=new Panel(); p2.add(b2); p2.add(c); deck.add(b2.getLabel(),p2); p3=new Panel(); p3.setLayout (new BorderLayout()); p3.add ("North",new Button ("North Pole")); BY Ahmet Tolga Tat Sayfa 160 p3.add ("West",new Button ("The West")); p3.add ("East",new Button ("Far East")); p3.add ("South",new Button ("South Pole")); p3.add ("Center",b3); deck.add(b3.getLabel(),p3); p4=new Panel(); p4.setLayout (new GridLayout(2,2)); p4.add (firstButton=new Button("First")); p4.add (nextButton=new Button("Next")); p4.add (prevButton=new Button("Previous")); p4.add (lastButton=new Button("Last")); add("West",p4); } public boolean action (Event e,Object o) { if (e.target==firstButton) cardManager.first(deck); else if (e.target==prevButton) cardManager.previous(deck); else if (e.target==nextButton) cardManager.next(deck); else if (e.target==lastButton) cardManager.last(deck); return true }} BY Ahmet Tolga Tat Sayfa 161 Java Applet Java Applet Temelleri Daha önce ilk appletimizi yazmýþtýk ve o zaman appletimizi Applet sýnýfýndan extend etmemiz gerektiðini öðrenmiçtik. (Sonuçta bir tarayýcýnýn ekranýnda çalýþabilmesi ve kendine o web sayfasýnda bir alan yaratabilmesi için bir sürü yeteneðe sahip olmasý lazým ve o yeteneklerini de iþte hazýr Applet class’ýndan almaktadýr. Bu yeteneklerle beraber belirli zamanlarda çalýþtýrýlan bazý metotlarý inherit eder. Þimdi bu metotlarý tanýyacaðýz. Applet Metotlarý init() Bu metot, applet java destekli tarayýcý tarafýndan ilk açýldýðýnda çalýþýr. Ve ilk ve son kez gerekli duyduðumuz baþlangýç iþlemlerini çalýþtýrýr. public void init(){ //müziði hafýzaya yukle //bazý sabitleri ve deðiþkenleri ata } start() Start metodu appletin baþlangýç iþlemleri sonuçlandýktan sonra veya ayrýca applet tekrar ziyaret edildiði zamanlarda çalýþýr public void start(){ //gerekli iºlemler baºla //müziði çalmaya baþla } stop() Bu metot appletin ekranda olmadýðý zamanlarda çaðrýlýr. public void stop(){ //thread’leri dondur //müziði durdur } destroy() Destroy metotu, tarayýcý kapatýldýðý zaman çalýþýr ve genel de aktif olan thread’leri öldürmek gibi son iþlemleri yani temizliði yapmakla yükümlüdür. BY Ahmet Tolga Tat Sayfa 162 public void destroy(){ //tüm alt threadleri öldür } resize(int geniºlik, int yükseklik) Init metotu için de kullanýlmasý gereklidir, applete sayfa üzerinde ayrýlacak alaný tanýmlar. paint(Graphics g) Bu metot appletin alanýndaki çizimden sorumludur ve genelde applet ilk açýldýðýnda otomatik olarak ilk çizimleri yapmak üzere çalýþýr. Graphics sýnýfý alýnýr. public void paint(Graphics g) { g.drawString(„Merhaba!“,20,20); //ekrana Merhaba1 yazýsýný basar } update(Graphics g) Bu bir ara metottur. Repaint metodu painti çaðýrmadan önce update ile ekraný tekrar temizler ve hazýrlar. repaint() Bu metot paint fonksiyonunu tekrar çalýþtýrýr. Appletlere Parametre Göndermek Bazen yazdýðýnýz programýn kaynak kodunda deðiþiklik yapmaktansa dýþardan bazý deðerleri deðiþtirmek için ona parametreler göndeririz. Java Appletlerinde bunu HTML kodundaki applet komutuyla yapabiliyoruz. Yani bir web tasarýmcýsý belli bir amaç için yazýlmýþ appleti deðiþik deðerlerle çalýþtýrabilir. Önce web sayfasýndan nasýl gönderildiðine bakalým; Örnek; Path /Examples100/AppletBasics/AppletBasics1.html <title> Test Zamani </title> <hr> <applet code=Applet1.class width=200 height=200> <param name=x value=30> <param name=y value=40> </applet> <hr> Þimdi ise nasýl alýnýp, kullanýldýðýna bakalým; Örnek; // Path /Examples/AppletBasics/Applet1.java import java .awt .Graphics; import java.applet.Applet; public class Applet1 extends Applet{ String koordinatx, koordinaty; public void init(){ koordinatx=getParameter("x"); koordinaty=getParameter(" y"); } BY Ahmet Tolga Tat Sayfa 163 public void paint(Graphics g){ g.drawString("Merhaba!",Integer.parseInt(koordinatx), Integer.parseInt(koordinaty)); } } Multimedia Graphic Sýnýfýna Ait Metotlar drawLine (x1, y1, x2, y2) drawRect (x, y, geniºlik,yükseklik) fillRect (x, y, geniºlik, yükseklik) clearRect (x, y, geniºlik, yükseklik) drawRoundRect (x, y, geniþlik, yükseklik, arkGeniþliði, arkYüksekliði) fillRoundRect (x, y, geniþlik, yükseklik, arkGeniþliði, arkYüksekliði) draw3DRect (x, y, geniþlik, yükseklik, boolean kabarýk) fill3DRect (x, y, geniþlik, yükseklik, boolean kabarýk) drawOval (x, y, geniºlik, yükseklik) fillOval (x, y, geniºlik, yükseklik) drawArc (x, y, geniþlik, yükseklik, ilkAçý, arkAçýsý) fillArc (x, y, geniþlik, yükseklik, ilkAçý, arkAçýsý) drawPolygon (int [ ] xNoktalarý, int [ ] yNoktalarý, noktaSayýsý) fillPolygon (int [ ] xNoktalarý, int [ ] yNoktalarý, noktaSayýsý) drawsString (string s, x, y) drawChars (char data [ ], offset, uzunluk, x, y ) drawBytes (byte data [ ], offset, uzunluk, x, y ) Örnek; //Path /Examples100/Graphics/Graphics1.java import java.awt.*; import java.applet.Applet; public class Graphics1 extends Applet { public void paint (Graphics g) { g.drawLine(10,10,10,40); g.drawRect(50,50,20,20); g.fillRect(80,80,20,20); g.drawArc(110,110,30,15,30,90); } } Image Kullanýmý ve Metotlarý drawImage(Image im, int x, int y, ImageObserver resimTutucu) – Resmi çiz. Image – Bu deðiþken imaj dosyalarýný tutar. getImage(URL url, String s) – Verilen resmi alýr ve atayabilir. BY Ahmet Tolga Tat Sayfa 164 Örnek; //Path /Examples100/Image/Image1.java import java.awt.*; import java.applet.Applet; public class Image1 extends Applet { Image im; public void init() { im=getImage(getDocumentBase(),"Im1.gif"); } public void paint (Graphics g) { g.drawImage(im,5,20,this); g.drawString("Bu bir cicek",5,10); } } Audio Kullanýmý Metotlarý AudioClip – Bu deðiþken ses dosyalarýný tutar. getAudioClip(URL sesDizini, String sesDosyasý) AudioClip.play() AudioClip.loop() AudioClip.stop() Örnek; //Path /Examples100/Audio/Audio1.java import java.awt.Graphics; import java.applet .*; public class Audio1 extends Applet{ AudioClip ses; public void init() { ses=getAudioClip(getDocumentBase(),"S1.au"); } public void start() { ses.loop(); } public void stop() { ses.stop(); } BY Ahmet Tolga Tat Sayfa 165 } Asagidaki Applet dügmelere basildikca au dosyalarini calistirir.Programi calistirmak icin hello.au ve world .au muzik dosyalariniz olmasi gerekir. Örnek: import java.awt.*; import java.awt.event.*; import java.applet.*; public class HWApplet extends Applet implements ActionListener { Button hello; Button world; AudioClip helloClip; AudioClip worldClip; public void init() { super.init(); setLayout(new FlowLayout()); hello = new Button("Hello"); hello.addActionListener(this); add(hello); world = new Button("World"); world.addActionListener(this); add(world); helloClip = getAudioClip(getCodeBase(),"hello.au"); worldClip = getAudioClip(getCodeBase(),"world.au"); } public void actionPerformed(ActionEvent event) { String cmd = event.getActionCommand(); if (cmd.equals("Hello")) { helloClip.play(); } else if (cmd.equals("World")) { worldClip.play(); } } } BY Ahmet Tolga Tat Sayfa 166 Ýmgelerin Yüklenmesi, Gösterimi ve Boyutlandýrýlmasý Java'nýn çokluortam özellikleri grafikler, imgeler, animasyonlar, sesler ve kýsaca video'yu içermektedir. Biz çokluortam konumuza imgelerle baþlýyoruz. Konunun daha iyi anlaþýlmasý için aþaðýdaki örnek üzerinde incelemeler yaparak gerekli kýsýmlarý detaylý bir biçi mde ele alýnacaðýz. import java.awt.*; import java.applet.Applet; public class deneme extends Applet { privateImage deneme; public void init() { deneme=getImage(getDocumentBase(),"deneme0.jpg"); } public void paint( Graphics g ) { g.drawImage(deneme,1,1,this); int width=deneme.getWidth(this); int height=deneme.getHeight(this); g.drawImage( deneme,1,90,width*2,height*2,this); } } Yukarýdaki programda image tipindeki deneme deðiþkeni aþaðýdaki satýrda ilkleniyor. deneme=getImage(getDocumentBase(),"deneme0.jpg");Buradaki getImage metodunun 2 parametresinden ilki olan getDocumentBase(), 2. parametrede kullanýlan dosyanýn lokasyonunu belirten bir metoddur. 2. parametrede kullanýlan dosya isminin gif veya jpg uzantýlý olmasý gerekir. Applet'in paint metodu Graphics ve drawImage metodunu kullanarak imgeyi görüntüler. Applet, drawImage metodunun iki versiyonunu kullanýyor. g.drawImage(deneme[currentimage],1,1,this);satýrýnda girilen 4 parametreden ilki image nesnesini, 2. ve 3. parametreler imgenin sol üst köºesini, 4. parametre ise appleti gösterir. g.drawImage( deneme,1,90,width*2,height*2,this)satýrý imgenin yeniden boyutlandýrýlmýþ halinin çýktýsý için drawImage metodunun diðer versiyonunu kullanýyor. Bu satýrda imgenin çýktýsýnda boyutunun imgenin orjinal boyutunun 2 katý olmasý saðlanýyor. BY Ahmet Tolga Tat Sayfa 167 import java.awt.*; import java.applet.Applet; public class denemeloop extends Applet { private Image deneme[]; private int totalimages=15, currentimage=0, sleeptime=50; public void init() { deneme = new Image[totalimages]; for (int i=0;i < deneme.length;i++) deneme[i]=getImage(getDocumentBase(),"deneme"+i+".jpg"); } public void paint( Graphics g ) { g.drawImage(deneme[currentimage],1,1,this); currentimage=(currentimage+1)%totalimages; try{ Thread.sleep(sleeptime); } catch(InterruptedException e) { showStatus (e.toString()); } repaint(); } public void start() { currentimage=0; } } Denemeloop sýnýfý applet'in init metodunda yüklenen image tipinde bir diziyi iºler. GetImage metodu her bir imgenin yüklenmesi için kullanýlýyor: deneme[i]=getImage(getDocumentBase(),"deneme"+i+".jpg");2. parametrede geçen "deneme"+i+".jpg" formatý, i sayaç deðerine göre sýrasý gelen her bir dosyanýn alýnmasý için BY Ahmet Tolga Tat Sayfa 168 kullanýlmaktadýr. Örnekteki animasyonun gösterimi Applet'in paint metodu tarafýndan saðlanýyor.Programýn hemen baþýnda tanýmlanan CurrentImage deðiþkeni gösterilen imgelerden o andaki(gösterilen) imgenin numarasýný tutar. Bu sayede drawImage metodunda deneme dizisinin kaçýncý elemanýn applet'e çýktý olarak verileceði belirlenir.Ýlk olarak drawImage metodu bir çerçevenin gösterimi için kullanýlýyor, sonra applet çok kýsa bir süre için (50 milisaniye) bekler: Thread.sleep(sleeptime);Sonra, repaint metodu çalýþýr. Bu metod applet'in update metodunu applet'in arka yüzünün silinmesi (temizlenmesi) için çaðýrýr.Daha sonra update metodu paint metodunu bir sonraki imgenin gösterimi için aktif hale getirir. Bu applet'in çalýþtýrýlmasý esnasýnda imgelerin yüklenmesinin zaman aldýðý görülüyor. Yükleme anýndaki bu zaman kaybý programýn çalýþmasýda genel bir yavaþlamaya neden olmaktadýr. Bunun asýl nedeni ise parçalý imgelerin görüntülenmesinden kaynaklanmaktadýr. Ayrýca, bu animasyon her imge görüntülenmesinde bir titreþim yapmaktadýr. Bunun sebebi ise çaðrýlan update metodudur. update metodu applet'i temizlediði zaman, temizleme iºini applete yine applet boyunda boþ bir çerçeve çizmeyle yapmaktadýr. Bu, az önce çizilen imgenin silinmesini saðlamaktadýr. Sonuç olarak, applet bir imge çizer, belli bir süre bekler, sonra appletin arka planýný siler(titreþime neden olur) ve yeni imgeyi çizer. Applet, sonsuz özyinelemeli bir çaðrým gerçekleþtiriyor görünüyor- paint, repainti. repaint metodu update metodunu; update, paint'i; paint ise tekrar repaint metodunu çaðýrmaktadýr. Bu sonsuz özyinelemeli çaðrým 'daki asýl problem eðer kullaný cý baþka bir Web sayfasýna geçse bile bu applet CPU kullanmaya devam edecektir ve belki sistemin performansý düþecektir. Çift Grafik Tamponlama Eðer çokluortam tabanlý uygulamalar geliþtirmek istiyorsanýz, kullanýcýlarýnýz sizden düzgün ses ve animasyonlar isteyeceklerdir. Kötü sunuºlar kabul edilemez. Mutlaka elinizdekinin en mükemmelini vermelisiniz.Çift Grafik Tamponlama(graphics double buffering) tekniðiyle, program bir imgeyi ekrana sunarken(render ederken) bir yandan diðer imgeyi de gösterim için ekransýz tampon(off-screen buffer) içinde hazýrlayabilir. Tabii ki, bu yöntemle gelen fazla bellek sarfiyatý da olacaktýr. Bu extra bellek ihtiyacý fazla olabilir ama geliþmiþ görüntü performansý bu ihtiyaca deðecektir. Çift Grafik Tamponlama(graphics double buffering) yöntemi paint metodu dýþýnda kalan herhangi bir metod içinde çizim iþini gerçekleþtirmek zorunda olan bazý programlarda da faydalý olmaktadýr. Ekransýz tampon(off-screen buffer) metodlar hatta farklý sýnýflarýn nesneleri arasýnda çizim için gidip gelebilir. Çizimin sonuçlarý daha sonra görüntülenebilir. Uyarý:Double buffering(Çift Grafik Tamponlama) yöntemi animasyonun titreþimini azaltabilir ancak animasyonun iþleyiþ hýzýný görünür þekilde yavaþlatabilir. Çift Grafik Tamponlama'nýn basitçe içeriði þöyledir: boþ bir Image yarat, boº imgenin üzerini çiz(Graphics sýnýfýnýn metodlarýný kullanarak) ve imgeyi görüntüle.Aþaðýdaki kod bir önceki denemeloop örneðinin açýlýp çift grafik tamponlama yönteminin eklemiþ halidir . import java.awt.*; import java.applet.Applet; public class denemeloop2 extends Applet { private Image deneme[]; private int totalimages=2, BY Ahmet Tolga Tat Sayfa 169 currentimage=0, sleeptime=50; private Graphics gContext; private Image buffer; public void init() { deneme = new Image[totalimages]; buffer=createImage(160,80); gContext=buffer.getGraphics(); gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); for (int i=0;i < deneme.length;i++) deneme[i]=getImage(getDocumentBase(),"deneme"+"loop2"+i+".jpg"); } public void start() { gContext.drawImage(deneme[0],0,0,this); currentimage=1; } public void paint( Graphics g ) { g.drawImage(buffer,0,0,this); gContext.fillRect(0,0,160,80); gContext.drawImage(deneme[currentimage],0,0,this); currentimage=(currentimage+1)%totalimages; try{ Thread.sleep(sleeptime); } catch(InterruptedException e) { showStatus (e.toString()); } repaint(); } } BY Ahmet Tolga Tat Sayfa 170 Çift Grafik Tamponlama yönteminin uygulanýþýnda iki anahtar parça var-bir Image(imge) referansý(bu programda buffer) ve bir de Graphics referansý(gContext bu programda). Image(Ýmge), görüntülenecek pixellerin saklandýðý yerdir.Graphics referansý da bu pixellerin çizimi için kullanýlýr.Image ve Graphics referanslarý ekran-harici imge(off-screen image) ve ekran-harici grafik içeriði(off-screen graphics context)'ne iþaret ederler çünkü bu iki deðiþken gerçek ekran pixel hesabý deðil tampon pixel hesaplamalarýný yaparlar. Çift grafik tamponu aþaðýdaki iki satýrla(init metodunda) oluþturulur: buffer=createImage(160,80); gContext=buffer.getGraphics(); Ýlk satýr applet'in createImage metodunu,boyutlarý 160 a 80 olan bir imge yaratmak için kullanýr. Ýkinci satýr Image sýnýfýnýn getGraphics metodunu Image tipindeki buffer deðiþkeninden grafiðin içeriðini almak için kullanýr. gContext referansý ekran-dýþý imge çiziminde kullanýlacaktýr. gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); satýrlarý ekran-dýþý grafik içeriðinin çizim rengini beyaz yapar ve ekran-dýþý imgeye beyaz bir dikdörtgen çizer. Start metodu, imge dizisindeki ilk imgenin gContext kullanýlarak çizilmesini saðlar. Ýmge buffer deðiþkeninde saklanýr. Paint metodu buffer deðiþkeninde bulunan imge herneyse onu görüntülemekle ve bir sonraki imgenin hazýrlýðýndan sorumludur. Ýlk olarak, fillRect ekran-dýþý imgenin temizlenmesi için kullanýlýr. Sonra, bir sonraki imge ekran-dýþý imgeye çizilir. Belli bir süre bekledikten sonra repaint metodu çaðrýlýr.Bu çaðrým ayrý bir thread iþleyiþine(update çalýþýr) neden olur. Bu applet'in çalýþmasý sýrasýnda animasyonun hala imge yüklenmesi sýrasýnda düzgün olmadýðýna dikkat ediniz. Ancak, imgeler tamamen yüklendikten sonra, bir önceki örnekteki titreºimlerin birçoðu elenmiº hale gelir.Appletin bu versiyonu hala bir sonsuz özyineleme içindedir.Bir sonraki örnekte titreþimleri tamamen eleyeceðiz Ýmge Yükleme Denetimi için MediaTracker Sizin de ilk iki animasyonda gördüðünüz gibi, imgeler yüklendiðinde, yüklenen imgeler belli aralýklarla parçalý imgeler gibi görüntüleniyorlardý. Bu, animasyonun çirkin ve göze hoþ gelmeyen bir görüntü vermesine neden oluyordu. Aþaðýdaki programda animasyonu Java'nýn MediaTracker tipini kullanmak için açtýk. Ne zaman ki bir imge tamamen yüklendiðinde animasyonun bir parçasý gibi görüntülenir. import java.awt.*; import java.applet.Applet; public class denemeloop3 extends Applet { private Image deneme[]; privateint totalimages=2, currentimage=0, sleeptime=50; private Graphics gContext; private Image buffer; BY Ahmet Tolga Tat Sayfa 171 private MediaTracker imageTracker; public void init() { deneme = new Image[totalimages]; buffer=createImage(160,80); gContext=buffer.getGraphics(); gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); imageTracker=new MediaTracker(this); for (int i=0;i < deneme.length;i++){ deneme[i]=getImage(getDocumentBase(),"deneme"+"loop2"+i+".jpg"); imageTracker.addImage(deneme[i],i); } try{ imageTracker.waitForID(0); } catch(InterruptedException e) { } } public void start() { gContext.drawImage(deneme[0],0,0,this); currentimage=1; } public void paint( Graphics g ) { g.drawImage(buffer,0,0,this); if (imageTracker.checkID(currentImage,true)){ gContext.fillRect(0,0,160,80); gContext.drawImage(deneme[currentimage],0,0,this); currentimage=++currentimage%totalimages; } try{ Thread.sleep(sleeptime); } BY Ahmet Tolga Tat Sayfa 172 catch(InterruptedException e) { showStatus (e.toString()); } repaint(); } public void update(Graphics g){ paint(g);} } Görüldüðü gibi denemeloop3.html örneði ilk iki örnekten daha düzgün çalýþmýþtýr. Bunu saðlayan da MediaTracker sýnýfýdýr. Ýmgeleri bir programa yüklerken, imgeler programýn o imgenin yüklenmesinin ne zaman tamamlandýðýný belirleyebilmesi için MediaTracker sýnýfýndan bir nesneyle kayýtlanýrlar. imageTracker=new MediaTracker(this); satýrýyla MediaTracker ilklenir. Constructor'un parametresi bir ImageObserver(imgelerin üzerinde çizileceði nesne)'dýr. Bu durumda applet(this) ImageObserver görevindedir. GetImage metodunun her imgenin yüklenebilmesi için çalýþmasýndan sonra imageTracker.addImage(deneme[i],i);satýrý yüklenen imgeyi MediaTracker nesnesi olan imageTracker ile kayýtlamak için çalýþtýrýlýr. Ýlk parametre yüklenen imgeye referans eden deðiþken, 2. parametre de MediaTracker'ý o imgenin statüsünde sorgulamak için kullanýlabilecek bir tamsayý ID'dir. ID tek olmak zorunda deðildir. Birçok imgeyi bir grup olarak izlemek için ayný ID numarasý verilebilir. Tüm imgeler imageTracker ile kayýtlandýktan sonra imageTracker.waitForID(0);satýrý 0 ID'li imge tamamen yüklenene kadar programýn beklemesini saðlar. Program, imge yüklenene kadar çalýþmasýný durdurur. Ýlk imgenin yüklenmesi tamamlandýðýnda, start metodunda görüntülenmesi için hazýrlatýlýr, sonra paint metodunda görüntülenir. Sonraki imgenin görüntülenmesi için hazýrlanýþý bir if yapýsý tarafýndan paint metodunda saðlanýr. if (imageTracker.checkID(currentImage,true))koþulu 2 iþ yapar. Ýlki, checkID metodu, imgenin tamamen yüklenip yüklenmediðini anlamak için currentImage'ý kontrol eder. Eðer yüklenmiþse true deðeri döner ve if yapýsýnýn vücudu sonraki imgenin hazýrlanýþý için çalýþýr.Eðer imge tamamen yüklenmemiþse if yapýsý false deðeri döndürür ve else parçasý çalýþýr. Eðer checkID çalýþmaya baþladýðýnda imge daha yüklenmeye baþlamamýþsa 2. parametre imge yüklemeye þimdi baþlamalýdýr anlamýna gelmektedir. MediaTracker titreºimi engellemez, basitçe imgeler yüklendikçe animasyonun baþlangýcýný düzeltir. Dolayýsýyla parçalý imgeler görüntülenmez. Tüm titreþimin engellenmesi için, kendi tanýmýmýz olan applet'in update metodunu saðladýk. Önceki örneklerde update metodu applet'i silip, paint metodunu çaðýrýyor demiþtik. Appletin temizlenmesi titreºime neden olur. Bizim update tanýmýmýz orjinal update metodunu override etmektedir. Yeni versiyon basitçe paint metodunu çaðýrmaktadýr. Applet temizleme iþlemi yapýlmadý!. Ama bir önceki imgenin yerini nasýl temizleriz? Cevap, biz temizlemeyi zaten yapmýþtýk. Her imgenin görüntülenmesi için hazýrlanýþý sýrasýnda, ekran-dýþý imgeyi temizliyoruz, dolayýsýyla arka plan tamamen beyaz. Sonra, yeni imgeyi beyaz arka plana çiziyoruz. Ekran-dýþý imge görüntülendiðinde, yeni imgenin beyaz arka planý applet üzerindeki tüm imgeyi saklar. BY Ahmet Tolga Tat Sayfa 173 Animasyon akýþý için ayrý bir thread kullanmak ªimdiye kadar görülen tüm animasyon örneklerindeki ortak sorun appletin sürekli çalýþmasýydý. Aþaðýdaki örnek program yeni bir çokluortam veya animasyon tekniði sunmaktan çok bir animasyonun "browser friendly" olmasý için yaratýlmasýnýn kolay bir yolunu sunmaktadýr. Önceden deðindiðimiz gibi, kullanýcý baþka bir sayfaya geçse bile animasyonlarýmýz çalýþmaya ve CPU zamanýný almaya devam edecektir. Bu örnek te animasyonu ayrý bir thread olarak çalýþtýrmamýz ve thread üzerinde kontrolümüzün olmasý için applet'i açýyoruz. import java.awt.*; import java.applet.Applet; public class denemeloop4 extends Applet { private Image deneme[]; private int totalimages=2, currentimage=0, sleeptime=50; private Graphics gContext; private Image buffer; private MediaTracker imageTracker; private Thread animate; public void init() { deneme = new Image[totalimages]; buffer=createImage(160,80); gContext=buffer.getGraphics(); gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); imageTracker=new MediaTracker(this); for (int i=0;i < deneme.length;i++){ deneme[i]=getImage(getDocumentBase(),"deneme"+"loop2"+i+".jpg"); imageTracker.addImage(deneme[i],i); } try{ imageTracker.waitForID(0); } catch(InterruptedException e) { BY Ahmet Tolga Tat Sayfa 174 } } public void start() { gContext.drawImage(deneme[0],0,0,this); currentimage=1; if (animate==null) { animate=new Thread(this); animate.start(); } } public void stop() { if (animate!=null) { animate.stop(); animate=null; } } public void paint( Graphics g ) { g.drawImage(buffer,0,0,this); } public void run() { while (true) { if (imageTracker.checkID(currentImage,true)){ gContext.fillRect(0,0,160,80); gContext.drawImage(deneme[currentimage],0,0,this); currentimage=++currentimage%totalimages; } try{ Thread.sleep(sleeptime); } catch(InterruptedException e) { BY Ahmet Tolga Tat Sayfa 175 showStatus (e.toString()); } repaint(); } } public void update(Graphics g){ paint(g);} } Ses Parçalarý Yükleme ve Çalma Java programlarý ses parçalarýný iþleyip çalabilirler. Sisteminizin ses ile ilgili donanýmlara(speaker ve ses kartý) sahip olmasý gerekir. Java sesleri çalmak için iki mekanizma saðlar-applet'in play metodu veya audioClip arayüzünden play metodu ile ses çalma gerçekleþtirilebilir. Eger siz bir programda bir ses çalmak istiyorsanýz applet metodu play sizin için sesi yükleyecek ve çalacaktýr. Aþaðýdaki program ses için küçük bir örnek teºkil etmektedir: import java.awt.*; import java.applet.Applet; public class loadaudioandplay extends Applet { private AudioClip sound; private Button playsound,loopSound,stopsound; public void init() { sound=getAudioClip(getDocumentBase(), "hi.au"); playsound=new Button ("play"); playsound.addActionListener(this); add(playsound); loopSound=new Button("Loop"); loopSound.addActionListener(this); add(loopSound); stopsound= new Button("stop"); stopsound.addActionListener(this); add(stopSound); } public void actionperformed(ActionEvent e) { if (e.getSource()==playSound) sound.play(); else if (e.getSource()==loopSound) sound.loop(); BY Ahmet Tolga Tat Sayfa 176 else if (e.getSource()==stopSound) sound.stop(); } } Imge Haritalarý Daha ilgi çekici web sayfalarýný yaratmada kullanýlab bir diðer teknik imge haritalarýnýn kullanýmýdýr. Bir imge haritasý kullanýcýnýn farklý amaçlar için týklayabileceði sýcak alanlar(hot areas)'ý olan bir imgedir. Ne zaman bir kullanýcý mouse ile bir hot area üzerine konumlanýrsa browser'ýn statüs alanýnda açýklayýcý bir bilgi belirir. Bu teknik bubble help sistemlerin yapýmýnda kullanýlýr.Ne zaman bir kullanýcý ekrandaki herhangi bir eleman üzerine konumlanýrsa bubble help destekli sistem genellikle küçük bir pencerede bir mesaj vererek kullanýcýyý yönlendirir. Ayrýca mesaj statü çubuðunda da görüntülenir. Aþaðýda verilmiþ olan program, Java Multimedia Cyber Classroom adlý CD den ikonlar içeren imgeleri yüklüyor. Bu ikonlar tanýdýk gelebilir. Bu kitaptaki ikonlar yine bu CD den alýnmýþ ikonlardýr. Program kullanýcýnýn mouse ile bir imgeyi point etmesini ve açýklayýcý bilgi vermeyi saðlamaktadýr. MouseMouve metodu mouse için koordinatlarý alýr ve bu koordinatlarý translateLocation metoduna gönderir. translateLocation metodu daha sonra ilgili appletin statü çubuðunda bir mesaj görüntüler. Bu applete týklama herhangi bir olaya sebep olmaz. Ýleriki ünitelerde "Networking" konusunda baþka bir web sayfasýný browser'a yüklemenin teknikleri anlatýlacaktýr. Bu networking özellikleriyle bu appleti modifiye edebilir, ve her ikonun farklý bir URL ile iliþkilendirilmesi saðlanabilir . import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class ImageMap extends Applet implements MouseListener, MouseMotionListener{ Image deneme; MediaTracker trackImage; int width,height; public void init() { addMouseListener(this); addMousemMotionListener(this); trackImage=new MediaTracker(this); deneme=getImage (getDocumantBase(),"deneme0.jpg"); trackImagwe.addImage(deneme,0); try{ trackImage.waitForAll(); } BY Ahmet Tolga Tat Sayfa 177 catch(InterruptedException e) { } width=deneme.getWidth(this); height=deneme.getHeight(this); resize(width,height); } public void paint( Graphics g ) { g.drawImage(deneme,0,0,this); } public mouseMoved(MouseEvent e) {showStatus(translateLocation(e.getX()))} public mouseExited(MouseEvent e) { showStatus("Pointer outside deneme applet"); } public void mouseDragged(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseClicked(MouseEvent e){} public String translateLocation(int x) { int iconWidth = width/6; if (x>=0 && x < = iconWidth) return "Common Prg.Error"; else if (x>iconWidth && x < =iconWidth*2) return "Good prog. Practise"; else if (x>iconWidth*2 && x< =iconWidth*3) return "Performance Tip"; else if (x>iconWidth*3 && x< =iconWidth*4) return "Portability Tip"; else if (x>iconWidth*4 && x< =iconWidth*5) return "Soft. Engineering Observation"; else if (x>iconWidth*5 && x< =iconWidth*6) return "Testing and Debugging Tip"; return ""; } } BY Ahmet Tolga Tat Sayfa 178 Java Swing Swing ile awt’teden daha fazlasini yapabilirsiniz. Simdi biraz swing yabalim..Düütt daatt datt ddüüüt dancing...J [ Import javax.swing.*; ] JFrame import java.awt.*; import javax.swing.*; public class JFrameExample { public static void main(String[] args) { JFrame f = new JFrame("This is a test"); f.setSize(400, 150); Container content = f.getContentPane(); content.setBackground(Color.white); content.setLayout(new FlowLayout()); content.add(new JButton("Button 1")); content.add(new JButton("Button 2")); content.add(new JButton("Button 3")); f.addWindowListener(new ExitListener()); f.setVisible(true); } } import java.awt.*; import java.awt.event.*; public class ExitListener extends WindowAdapter { public void windowClosing(WindowEvent event) { System.exit(0); } } BY Ahmet Tolga Tat Sayfa 179 import javax.swing.*; import java.awt.*; public class WindowUtilities { public static void setNativeLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting native LAF: " + e); } } public static void setJavaLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting Java LAF: " + e); } } public static void setMotifLookAndFeel() { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } catch(Exception e) { System.out.println("Error setting Motif LAF: " + e); } } public static JFrame openInJFrame(Container content, BY Ahmet Tolga Tat Sayfa 180 int width, int height, String title, Color bgColor) { JFrame frame = new JFrame(title); frame.setBackground(bgColor); content.setBackground(bgColor); frame.setSize(width, height); frame.setContentPane(content); frame.addWindowListener(new ExitListener()); frame.setVisible(true); return(frame); } /** Uses Color.white as the background color. */ public static JFrame openInJFrame(Container content, int width, int height, String title) { return(openInJFrame(content, width, height, title, Color.white)); } public static JFrame openInJFrame(Container content, int width, int height) { return(openInJFrame(content, width, height, content.getClass().getName(), Color.white)); } } BY Ahmet Tolga Tat Sayfa 181 Look and Feel import javax.swing.*; import java.awt.*; public class WindowUtilities { public static void setNativeLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting native LAF: " + e); } } public static void setJavaLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting Java LAF: " + e); } } public static void setMotifLookAndFeel() { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } catch(Exception e) { System.out.println("Error setting Motif LAF: " + e); } } ... } JLabel import java.awt.*; import javax.swing.*; public class JLabels extends JFrame { public static void main(String[] args) { new JLabels(); } public JLabels() { super("Using HTML in JLabels"); WindowUtilities.setNativeLookAndFeel(); BY Ahmet Tolga Tat Sayfa 182 addWindowListener(new ExitListener()); Container content = getContentPane(); Font font = new Font("Serif", Font.PLAIN, 30); content.setFont(font); String labelText = "<html><FONT COLOR=RED>Red</FONT> and " + "<FONT COLOR=BLUE>Blue</FONT> Text</html>"; JLabel coloredLabel = new JLabel(labelText, JLabel.CENTER); coloredLabel.setBorder (BorderFactory.createTitledBorder("Mixed Colors")); content.add(coloredLabel, BorderLayout.NORTH); labelText = "<html><B>Bold</B> and <I>Italic</I> Text</html>"; JLabel boldLabel = new JLabel(labelText, JLabel.CENTER); boldLabel.setBorder (BorderFactory.createTitledBorder("Mixed Fonts")); content.add(boldLabel, BorderLayout.CENTER); labelText = "<html>The Applied Physics Laboratory is a division " + "of the Johns Hopkins University." + "<P>" + "Major JHU divisions include:" + "<UL>" + " <LI>The Applied Physics Laboratory" + " <LI>The Krieger School of Arts and Sciences" + " <LI>The Whiting School of Engineering" + " <LI>The School of Medicine" + " <LI>The School of Public Health" + " <LI>The School of Nursing" + " <LI>The Peabody Institute" + " <LI>The Nitze School of Advanced International Studies" + "</UL>"; JLabel fancyLabel = new JLabel(labelText, new ImageIcon("images/JHUAPL.gif"), JLabel.CENTER); fancyLabel.setBorder (BorderFactory.createTitledBorder("Multi-line HTML")); content.add(fancyLabel, BorderLayout.SOUTH); pack(); setVisible(true); } } JButton import import import import import import java.awt.*; java.awt.event.*; javax.swing.AbstractButton; javax.swing.JButton; javax.swing.JPanel; javax.swing.JFrame; BY Ahmet Tolga Tat Sayfa 183 import javax.swing.ImageIcon; public class ButtonDemo extends JPanel implements ActionListener { protected JButton b1, b2, b3; public ButtonDemo() { ImageIcon leftButtonIcon = new ImageIcon("images/right.gif"); ImageIcon middleButtonIcon = new ImageIcon("images/middle.gif"); ImageIcon rightButtonIcon = new ImageIcon("images/left.gif"); b1 = new JButton("Disable middle button", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER); b1.setHorizontalTextPosition(AbstractButton.LEFT); b1.setMnemonic(KeyEvent.VK_D); b1.setActionCommand("disable"); b2 = new JButton("Middle button", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M); b3 = new JButton("Enable middle button", rightButtonIcon); //Use the default text position of CENTER, RIGHT. b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand("enable"); b3.setEnabled(false); //Listen for actions on buttons 1 and 3. b1.addActionListener(this); b3.addActionListener(this); b1.setToolTipText("Click this button to disable the middle button."); b2.setToolTipText("This middle button does nothing when you click it."); b3.setToolTipText("Click this button to enable the middle button."); //Add Components to this container, using the default FlowLayout. add(b1); add(b2); add(b3); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("disable")) { b2.setEnabled(false); b1.setEnabled(false); b3.setEnabled(true); } else { b2.setEnabled(true); b1.setEnabled(true); b3.setEnabled(false); } } public static void main(String[] args) { JFrame frame = new JFrame("ButtonDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { BY Ahmet Tolga Tat Sayfa 184 System.exit(0); } }); frame.getContentPane().add(new ButtonDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } } import java.awt.*; import javax.swing.*; public class JButtons extends JFrame { public static void main(String[] args) { new JButtons(); } public JButtons() { super("Using JButton"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.white); content.setLayout(new FlowLayout()); JButton button1 = new JButton("Java"); content.add(button1); ImageIcon cup = new ImageIcon("images/cup.gif"); JButton button2 = new JButton(cup); content.add(button2); JButton button3 = new JButton("Java", cup); content.add(button3); JButton button4 = new JButton("Java", cup); button4.setHorizontalTextPosition(SwingConstants.LEFT); content.add(button4); pack(); setVisible(true); } } JPanel import java.awt.*; import javax.swing.*; public class JPanels extends JFrame { public static void main(String[] args) { new JPanels(); } BY Ahmet Tolga Tat Sayfa 185 public JPanels() { super("Using JPanels with Borders"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.lightGray); JPanel controlArea = new JPanel(new GridLayout(3, 1)); String[] colors = { "Red", "Green", "Blue", "Black", "White", "Gray" }; controlArea.add(new SixChoicePanel("Color", colors)); String[] thicknesses = { "1", "2", "3", "4", "5", "6" }; controlArea.add(new SixChoicePanel("Line Thickness", thicknesses)); String[] fontSizes = { "10", "12", "14", "18", "24", "36" }; controlArea.add(new SixChoicePanel("Font Size", fontSizes)); content.add(controlArea, BorderLayout.EAST); JPanel drawingArea = new JPanel(); // Preferred height is irrelevant, since using WEST region drawingArea.setPreferredSize(new Dimension(400, 0)); drawingArea.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); drawingArea.setBackground(Color.white); content.add(drawingArea, BorderLayout.WEST); pack(); setVisible(true); } } import java.awt.*; import javax.swing.*; public class SixChoicePanel extends JPanel { public SixChoicePanel(String title, String[] buttonLabels) { super(new GridLayout(3, 2)); setBackground(Color.lightGray); setBorder(BorderFactory.createTitledBorder(title)); ButtonGroup group = new ButtonGroup(); JRadioButton option; int halfLength = buttonLabels.length/2; // Assumes even length for(int i=0; i<halfLength; i++) { option = new JRadioButton(buttonLabels[i]); group.add(option); add(option); option = new JRadioButton(buttonLabels[i+halfLength]); group.add(option); add(option); } } } BY Ahmet Tolga Tat Sayfa 186 Internal Frames import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JInternalFrames extends JFrame { public static void main(String[] args) { new JInternalFrames(); } public JInternalFrames() { super("Multiple Document Interface"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.white); JDesktopPane desktop = new JDesktopPane(); desktop.setBackground(Color.white); content.add(desktop, BorderLayout.CENTER); setSize(450, 400); for(int i=0; i<5; i++) { JInternalFrame frame = new JInternalFrame(("Internal Frame " + i), true, true, true, true); frame.setLocation(i*50+10, i*50+10); frame.setSize(200, 150); frame.setBackground(Color.white); desktop.add(frame); frame.moveToFront(); } setVisible(true); } } JToolBar import java.awt.*; import javax.swing.*; public class ToolBarButton extends JButton { private static final Insets margins = new Insets(0, 0, 0, 0); public ToolBarButton(Icon icon) { super(icon); setMargin(margins); BY Ahmet Tolga Tat Sayfa 187 setVerticalTextPosition(BOTTOM); setHorizontalTextPosition(CENTER); } public ToolBarButton(String imageFile) { this(new ImageIcon(imageFile)); } public ToolBarButton(String imageFile, String text) { this(new ImageIcon(imageFile)); setText(text); } } import java.awt.*; import javax.swing.*; import java.awt.event.*; public class JToolBarExample extends JFrame implements ItemListener { private BrowserToolBar toolbar; private JCheckBox labelBox; public static void main(String[] args) { new JToolBarExample(); } public JToolBarExample() { super("JToolBar Example"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.white); toolbar = new BrowserToolBar(); content.add(toolbar, BorderLayout.NORTH); labelBox = new JCheckBox("Show Text Labels?"); labelBox.setHorizontalAlignment(SwingConstants.CENTER); labelBox.addItemListener(this); content.add(new JTextArea(10,30), BorderLayout.CENTER); content.add(labelBox, BorderLayout.SOUTH); pack(); setVisible(true); } public void itemStateChanged(ItemEvent event) { toolbar.setTextLabels(labelBox.isSelected()); pack(); } } JLists BY Ahmet Tolga Tat Sayfa 188 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class ListDemo extends JFrame implements ListSelectionListener { private JList list; private DefaultListModel listModel; private static final String hireString = "Hire"; private static final String fireString = "Fire"; private JButton fireButton; private JTextField employeeName; public ListDemo() { super("ListDemo"); listModel = new DefaultListModel(); listModel.addElement("Alison Huml"); listModel.addElement("Kathy Walrath"); listModel.addElement("Lisa Friendly"); listModel.addElement("Mary Campione"); //Create the list and put it in a scroll pane list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); list.addListSelectionLis tener(this); JScrollPane listScrollPane = new JScrollPane(list); JButton hireButton = new JButton(hireString); hireButton.setActionCommand(hireString); hireButton.addActionListener(new HireListener()); fireButton = new JButton(fireString); fireButton.setActionCommand(fireString); fireButton.addActionListener(new FireListener()); employeeName = new JTextField(10); employeeName.addActionListener(new HireListener()); String name = listModel.getElementAt( list.getSelectedIndex()).toString(); employeeName.setText(name); //Create a panel that uses FlowLayout (the default). JPanel buttonPane = new JPanel(); buttonPane.add(employeeName); buttonPane.add(hireButton); buttonPane.add(fireButton); Container contentPane = getContentPane(); contentPane.add(listScrollPane, BorderLayout.CENTER); contentPane.add(buttonPane, BorderLayout.SOUTH); } class FireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if BY Ahmet Tolga Tat Sayfa 189 //there's a valid selection //so go ahead and remove whatever's selected. int index = list.getSelectedIndex(); listModel.remove(index); int size = listModel.getSize(); if (size == 0) { //Nobody's left, disable firing. fireButton.setEnabled(false); } else { //Adjust the selection. if (index == listModel.getSize())//removed item in last position index--; list.setSelectedIndex(index); //otherwise select same index } } } //This listener is shared by the text field and the hire button class HireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //User didn't type in a name... if (emp loyeeName.getText().equals("")) { Toolkit.getDefaultToolkit().beep(); return; } int index = list.getSelectedIndex(); int size = listModel.getSize(); //If no selection or if item in last position is selected, //add the new hire to end of list, and select new hire. if (index == -1 || (index+1 == size)) { listModel.addElement(employeeName.getText()); list.setSelectedIndex(size); //Otherwise insert the new hire after the current selection, //and select new hire. } else { listModel.insertElementAt(employeeName.getText(), index+1); list.setSelectedIndex(index+1); } } } public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (list.getSelectedIndex() == -1) { //No selection, disable fire button. fireButton.setEnabled(false); employeeName.setText(""); } else { //Selection, update text field. fireButton.setEnabled(true); BY Ahmet Tolga Tat Sayfa 190 String name = list.getSelectedValue().toString(); employeeName.setText(name); } } } public static void main(String s[]) { JFrame frame = new ListDemo(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } } JTree import java.awt.*; import javax.swing.*; import javax.swing.tree.*; public class SimpleTree extends JFrame { public static void main(String[] args) { new SimpleTree(); } public SimpleTree() { super("Creating a Simple JTree"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); Object[] hierarchy = { "javax.swing", "javax.swing.border", "javax.swing.colorchooser", "javax.swing.event", "javax.swing.filechooser", new Object[] { "javax.swing.plaf", "javax.swing.plaf.basic", "javax.swing.plaf.metal", "javax.swing.plaf.multi" }, "javax.swing.table", new Object[] { "javax.swing.text", new Object[] { "javax.swing.text.html", "javax.swing.text.html.parser" }, "javax.swing.text.rtf" }, "javax.swing.tree", "javax.swing.undo" }; DefaultMutableTreeNode root = processHierarchy(hierarchy); JTree tree = new JTree(root); BY Ahmet Tolga Tat Sayfa 191 content.add(new JScrollPane(tree), BorderLayout.CENTER); setSize(275, 300); setVisible(true); } private DefaultMutableTreeNode processHierarchy(Object[] hierarchy) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]); DefaultMutableTreeNode child; for(int i=1; i<hierarchy.length; i++) { Object nodeSpecifier = hierarchy[i]; if (nodeSpecifier instanceof Object[]) // Ie node with children child = processHierarchy((Object[])nodeSpecifier); else child = new DefaultMutableTreeNode(nodeSpecifier); // Ie Leaf node.add(child); } return(node); } } import import import import java.awt.*; javax.swing.*; javax.swing.tree.*; javax.swing.event.*; public class SelectableTree extends JFrame implements TreeSelectionListener { public static void main(String[] args) { new SelectableTree(); } private JTree tree; private JTextField currentSelectionField; public SelectableTree() { super("JTree Selections"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); DefaultMutableTreeNode child; DefaultMutableTreeNode grandChild; for(int childIndex=1; childIndex<4; childIndex++) { child = new DefaultMutableTreeNode("Child " + childIndex); root.add(child); for(int grandChildIndex=1; grandChildIndex<4; grandChildIndex++) { grandChild = new DefaultMutableTreeNode("Grandchild " + childIndex + "." + grandChildIndex); child.add(grandChild); } } tree = new JTree(root); tree.addTreeSelectionListener(this); content.add(new JScrollPane(tree), BorderLayout.CENTER); BY Ahmet Tolga Tat Sayfa 192 currentSelectionField = new JTextField("Current Selection: NONE"); content.add(currentSelectionField, BorderLayout.SOUTH); setSize(250, 275); setVisible(true); } public void valueChanged(TreeSelectionEvent event) { currentSelectionField.setText ("Current Selection: " + tree.getLastSelectedPathComponent().toString()); } } import java.awt.*; import javax.swing.*; public class DynamicTree extends JFrame { public static void main(String[] args) { int n = 5; // Number of children to give each node if (args.length > 0) try { n = Integer.parseInt(args[0]); } catch(NumberFormatException nfe) { System.out.println("Can't parse number; using default of " + n); } new DynamicTree(n); } public DynamicTree(int n) { super("Creating a Dynamic JTree"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); JTree tree = new JTree(new OutlineNode(1, n)); content.add(new JScrollPane(tree), BorderLayout.CENTER); setSize(300, 475); setVisible(true); } } Alert Dialogs (JOptionPane) import import import import javax.swing.*; java.awt.*; java.awt.event.*; java.util.StringTokenizer; public class JOptionPaneExamples extends JFrame implements ActionListener { public static void main(String[] args) { new JOptionPaneExamples(); } BY Ahmet Tolga Tat Sayfa 193 private JButton popupDialogButton; private JRadioButton[] dialogTypeButtons; private JRadioButton[] messageTypeButtons; private int[] messageTypes = { JOptionPane.PLAIN_MESSAGE, JOptionPane.INFORMATION_MESSAGE, JOptionPane.QUESTION_MESSAGE, JOptionPane.WARNING_MESSAGE, JOptionPane.ERROR_MESSAGE }; private JLabeledTextField titleField, messageField, selectionValuesField, buttonLabelsField, focusedButtonField; private JCheckBox ignoreSelectionValuesBox; private ButtonGroup messageTypeButtonGroup, buttonTypeButtonGroup, dialogTypeButtonGroup; private JRadioButton[] buttonTypeButtons; private int[] buttonTypes = { JOptionPane.DEFAULT_OPTION, JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.OK_CANCEL_OPTION }; private JCheckBox[] lookAndFeelBoxes; public JOptionPaneExamples() { super("JOptionPane Examples"); addWindowListener(new ExitListener()); WindowUtilities.setNativeLookAndFeel(); Container content = getContentPane(); content.setLayout(new GridLayout(0, 1)); JPanel buttonPanel = new JPanel(); popupDialogButton = new JButton("Show Option Pane(s)"); popupDialogButton.addActionListener(this); buttonPanel.add(popupDialogButton); content.add(buttonPanel); dialogTypeButtonGroup = new ButtonGroup(); dialogTypeButtons = new JRadioButton[] { new JRadioButton("Show Message", true), new JRadioButton("Get Confirmation"), new JRadioButton("Collect Input"), new JRadioButton("Present Options") }; content.add(new RadioButtonPanel("Dialog type:", dialogTypeButtons, dialogTypeButtonGroup)); messageTypeButtonGroup = new ButtonGroup(); messageTypeButtons = new JRadioButton[] { new JRadioButton("Plain"), new JRadioButton("Information", true), new JRadioButton("Question"), new JRadioButton("Warning"), new JRadioButton("Error") }; content.add(new RadioButtonPanel("Option Pane Type:", messageTypeButtons, messageTypeButtonGroup)); lookAndFeelBoxes = new JCheckBox[] { new JCheckBox("Native", true), new JCheckBox("Java (Metal)"), new JCheckBox("Motif") }; content.add(new CheckBoxPanel("Looks to use:", lookAndFeelBoxes)); titleField = new JLabeledTextField("Title:", "Title to appear at top of border"); content.add(titleField); BY Ahmet Tolga Tat Sayfa 194 messageField = new JLabeledTextField("Message:", "Message to appear inside of dialog box"); content.add(messageField); buttonTypeButtonGroup = new ButtonGroup(); buttonTypeButtons = new JRadioButton[] { new JRadioButton("Default", true), new JRadioButton("Yes/No"), new JRadioButton("Yes/No/Cancel"), new JRadioButton("OK/Cancel") }; RadioButtonPanel buttonLabelPanel = new RadioButtonPanel("Button Labels:", buttonTypeButtons, buttonTypeButtonGroup); DisableListener.addEnabler(dialogTypeButtons[1], buttonLabelPanel); content.add(buttonLabelPanel); selectionValuesField = new JLabeledTextField("Choices to present to user (separate by spaces):", "Choice1 Choice2 Choice3 Choice4"); content.add(selectionValuesField); ignoreSelectionValuesBox = new JCheckBox("Ignore predefined choices and supply textfield to user"); DisableListener.addDisabler(ignoreSelectionValuesBox, selectionValuesField); DisableListener.addEnabler(dialogTypeButtons[2], selectionValuesField); DisableListener.addEnabler(dialogTypeButtons[2], ignoreSelectionValuesBox); content.add(ignoreSelectionValuesBox); buttonLabelsField = new JLabeledTextField("Button labels for \"Option\" dialog:", "Button1 Button2 Button3"); DisableListener.addEnabler(dialogTypeButtons[3], buttonLabelsField); content.add(buttonLabelsField); pack(); setVisible(true); } public void actionPerformed(ActionEvent event) { if (lookAndFeelBoxes[0].isSelected()) { WindowUtilities.setNativeLookAndFeel(); popUpDialog(); } if (lookAndFeelBoxes[1].isSelected()) { WindowUtilities.setJavaLookAndFeel(); popUpDialog(); WindowUtilities.setNativeLookAndFeel(); } if (lookAndFeelBoxes[2].isSelected()) { WindowUtilities.setMotifLookAndFeel(); popUpDialog(); WindowUtilities.setNativeLookAndFeel(); } } BY Ahmet Tolga Tat Sayfa 195 private void popUpDialog() { if (dialogTypeButtons[0].isSelected()) JOptionPane.showMessageDialog(this, messageField.getText(), titleField.getText(), getMessageType()); else if (dialogTypeButtons[1].isSelected()) JOptionPane.showConfirmDialog(this, messageField.getText(), titleField.getText(), getButtonType(), getMessageType()); else if (dialogTypeButtons[2].isSelected()) { String[] selections; if (selectionValuesField.isEnabled()) selections = substrings(selectionValuesField.getText()); else selections = null; JOptionPane.showInputDialog(this, messageField.getText(), titleField.getText(), getMessageType(), null, selections, null); } else if (dialogTypeButtons[3].isSelected()) JOptionPane.showOptionDialog(this, messageField.getText(), titleField.getText(), getButtonType(), getMessageType(), null, substrings(buttonLabelsField.getText()), null); } private int getAssociatedType(AbstractButton[] buttons, int[] types) { for(int i=0; i<buttons.length; i++) if (buttons[i].isSelected()) return(types[i]); return(types[0]); } private int getMessageType() { return(getAssociatedType(messageTypeButtons, messageTypes)); } private int getButtonType() { return(getAssociatedType(buttonTypeButtons, buttonTypes)); } private String[] substrings(String string) { StringTokenizer tok = new StringTokenizer(string); String[] substrings = new String[tok.countTokens()]; for(int i=0; i<substrings.length; i++) substrings[i] = tok.nextToken(); return(substrings); } } class CheckBoxPanel extends JPanel { public CheckBoxPanel(String labelString, JCheckBox[] checkBoxes) { setLayout(new FlowLayout(FlowLayout.LEFT)); add(new JLabel(labelString)); for(int i=0; i<checkBoxes.length; i++) { add(checkBoxes[i]); } BY Ahmet Tolga Tat Sayfa 196 } } import javax.swing.*; import java.awt.*; public class JLabeledTextField extends JPanel { private JLabel label; private JTextField textField; public JLabeledTextField(String labelString, String textFieldString, LayoutManager layout) { super(); setLayout(layout); label = new JLabel(labelString); textField = new JTextField(textFieldString); add(label); add(textField); } public JLabeledTextField(String labelString, String textFieldString) { this(labelString, textFieldString, new FlowLayout(FlowLayout.LEFT)); } public JLabel getJLabel() { return(label); } public JTextField getJTextField() { return(textField); } public String getText() { return(getJTextField().getText()); } public void setText(String textFieldString) { getJTextField().setText(textFieldString); } public void setFonts(Font f) { getJLabel().setFont(f); getJTextField().setFont(f); } public void setEnabled(boolean status) { getJLabel().setEnabled(status); getJTextField().setEnabled(status); BY Ahmet Tolga Tat Sayfa 197 super.setEnabled(status); } } import javax.swing.*; import java.awt.*; public class RadioButtonPanel extends JPanel { public RadioButtonPanel(String labelString, JRadioButton[] radioButtons, ButtonGroup buttonGroup) { setLayout(new FlowLayout(FlowLayout.LEFT)); add(new JLabel(labelString)); for(int i=0; i<radioButtons.length; i++) { buttonGroup.add(radioButtons[i]); add(radioButtons[i]); } } public void setEnabled(boolean state) { Component[] components = getComponents(); for(int i=0; i<components.length; i++) components[i].setEnabled(state); } } import javax.swing.*; import java.awt.event.*; public class DisableListener implements ItemListener { private JComponent target; private boolean defaultState; private static void addListener(AbstractButton source, JComponent target, boolean defaultState) { DisableListener enablerOrDisabler = new DisableListener(target, defaultState); source.addItemListener(enablerOrDisabler); } public static void addDisabler(AbstractButton source, JComponent target) { addListener(source, target, true); } public static void addEnabler(AbstractButton source, JComponent target) { addListener(source, target, false); BY Ahmet Tolga Tat Sayfa 198 } public DisableListener(JComponent target, boolean defaultState) { this.target = target; this.defaultState = defaultState; if (!defaultState) target.setEnabled(false); } public void itemStateChanged(ItemEvent event) { if (event.getStateChange() == ItemEvent.SELECTED) target.setEnabled(!defaultState); else target.setEnabled(defaultState); } } JPassword import javax.swing.*; import java.awt.*; import java.awt.event.*; public class PasswordDemo { public static void main(String[] argv) { final JFrame f = new JFrame("PasswordDemo"); JLabel label = new JLabel("Enter the password: "); JPasswordField passwordField = new JPasswordField(10); passwordField.setEchoChar('#'); passwordField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JPasswordField input = (JPasswordField)e.getSource(); char[] password = input.getPassword(); if (isPasswordCorrect(password)) { JOptionPane.showMessageDialog(f, "Success! You typed the right password."); } else { JOptionPane.showMessageDialog(f, "Invalid password. Try again.", "Error Message", JOptionPane.ERROR_MESSAGE); } } BY Ahmet Tolga Tat Sayfa 199 }); JPanel contentPane = new JPanel(new BorderLayout()); contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); contentPane.add(label, BorderLayout.WEST); contentPane.add(passwordField, BorderLayout.CENTER); f.setContentPane(contentPane); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.pack(); f.setVisible(true); } private static boolean isPasswordCorrect(char[] input) { char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' }; if (input.length != correctPassword.length) return false; for (int i = 0; i < input.length; i ++) if (input[i] != correctPassword[i]) return false; return true; } } JComboBox import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxDemo extends JPanel { JLabel picture; public ComboBoxDemo() { String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; // Create the combo box, select the pig JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); BY Ahmet Tolga Tat Sayfa 200 picture.setIcon(new ImageIcon("images/" + petName + ".gif")); } }); // Set up the picture picture = new JLabel(new ImageIcon("images/" + petStrings[petList.getSelectedIndex()] + ".gif")); picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); // The preferred size is hard-coded to be the width of the // widest image and the height of the tallest image + the border. // A real program would compute this. picture.setPreferredSize(new Dimension(177, 122+10)); // Layout the demo setLayout(new BorderLayout()); add(petList, BorderLayout.NORTH); add(picture, BorderLayout.SOUTH); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } public static void main(String s[]) { JFrame frame = new JFrame("ComboBoxDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.setContentPane(new ComboBoxDemo()); frame.pack(); frame.setVisible(true); } } JTable import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.JScrollPane; BY Ahmet Tolga Tat Sayfa 201 import import import import import javax.swing.JFrame; javax.swing.SwingUtilities; javax.swing.JOptionPane; java.awt.*; java.awt.event.*; public class TableDemo extends JFrame { private boolean DEBUG = true; public TableDemo() { super("TableDemo"); MyTableModel myModel = new MyTableModel(); JTable table = new JTable(myModel); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); //Add the scroll pane to this window. getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } class MyTableModel extends AbstractTableModel { final String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; final Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)}, {"Mark", "Andrews", "Speed reading", new Integer(20), new Boolean(true)}, {"Angela", "Lih", "Teaching high school", new Integer(4), new Boolean(false)} }; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; } BY Ahmet Tolga Tat Sayfa 202 public Object getValueAt(int row, int col) { return data[row][col]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { //Note that the data/cell address is constant, //no matter where the cell appears onscreen. if (col < 2) { return false; } else { return true; } } public void setValueAt(Object value, int row, int col) { if (DEBUG) { System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")"); } if (data[0][col] instanceof Integer && !(value instanceof Integer)) { try { data[row][col] = new Integer(value.toString()); fireTableCellUpdated(row, col); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(TableDemo.this, "The \"" + getColumnName(col) + "\" column accepts only integer values."); } } else { data[row][col] = value; fireTableCellUpdated(row, col); } if (DEBUG) { System.out.println("New value of data:"); printDebugData(); } } private void printDebugData() { int numRows = getRowCount(); int numCols = getColumnCount(); for (int i=0; i < numRows; i++) { System.out.print(" row " + i + ":"); for (int j=0; j < numCols; j++) { System.out.print(" " + data[i][j]); } System.out.println(); } BY Ahmet Tolga Tat Sayfa 203 System.out.println("--------------------------"); } } public static void main(String[] args) { TableDemo frame = new TableDemo(); frame.pack(); frame.setVisible(true); } } JScroll import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class ScrollDemo extends JPanel { private Rule columnView; private Rule rowView; private JToggleButton isMetric; private ScrollablePicture picture; public ScrollDemo() { // Start loading the image icon now. ImageIcon david = new ImageIcon("images/youngdad.jpeg"); // Create the row and column headers. columnView = new Rule(Rule.HORIZONTAL, true); columnView.setPreferredWidth(david.getIconWidth()); rowView = new Rule(Rule.VERTICAL, true); rowView.setPreferredHeight(david.getIconHeight()); // Create the corners. JPanel buttonCorner = new JPanel(); isMetric = new JToggleButton("cm", true); isMetric.setFont(new Font("SansSerif", Font.PLAIN, 11)); isMetric.setMargin(new Insets(2,2,2,2)); isMetric.addItemListener(new UnitsListener()); buttonCorner.add(isMetric); //Use the default FlowLayout // Set up the scroll pane. picture = new ScrollablePicture(david, columnView.getIncrement()); JScrollPane pictureScrollPane = new JScrollPane(picture); pictureScrollPane.setPreferredSize(new Dimension(300, 250)); pictureScrollPane.setViewportBorder( BorderFactory.createLineBorder(Color.black)); BY Ahmet Tolga Tat Sayfa 204 pictureScrollPane.setColumnHeaderView(columnView); pictureScrollPane.setRowHeaderView(rowView); pictureScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, buttonCorner); pictureScrollPane.setCorner(JScrollPane.LOWER_LEFT_CORNER, new Corner()); pictureScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new Corner()); // Put it in this panel. setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); add(pictureScrollPane); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } class UnitsListener implements ItemListener { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { // Turn it to metric. rowView.setIsMetric(true); columnView.setIsMetric(true); } else { // Turn it to inches. rowView.setIsMetric(false); columnView.setIsMetric(false); } picture.setMaxUnitIncrement(rowView.getIncrement()); } } public static void main(String s[]) { JFrame frame = new JFrame("ScrollDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setContentPane(new ScrollDemo()); frame.pack(); frame.setVisible(true); } } BY Ahmet Tolga Tat Sayfa 205 Networking Socket programlama Socket’tan okuma ve yazdirma: import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try { echoSocket = new Socket("localhost", 9999); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: taranis."); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for " + "the connection to: taranis."); System.exit(1); } BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String userInput; BY Ahmet Tolga Tat Sayfa 206 while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("echo: " + in.readLine()); } out.close(); in.close(); stdIn.close(); echoSocket.close(); } } Basit bir Chat örnegi: import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; public class chatClient extends Frame implements Runnable { private String hostname, message; protected BufferedReader in; protected PrintWriter out; protected TextArea output; protected TextField input; protected Button b; protected Thread listener; // Constructor looks after GUI public chatClient() { super("Chat Client"); setLayout(new BorderLayout()); output = new TextArea(); // Panel to arrange two components on BY Ahmet Tolga Tat Sayfa 207 Panel p = new Panel(); p.setLayout(new BorderLayout()); input = new TextField(); b= new Button("S end"); // What happens when we press the button... b.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { // read in text from textField, store as string message = input.getText(); out.println(message); System.out.println("Message is:" + message); //out.flush(); We set the boolean autoflush to true in constructor // blank the textField for next line input.setText(" "); } }); // ends inner class // add the textfield and button to the Panel p.add("North", input); p.add("South", b); BY Ahmet Tolga Tat Sayfa 208 // add the textArea and the Panel to the Frame add("Center", output); add("South", p); // what happens if we close the window.... this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); //ends inner class } // the 'engine' behind the GUI public void runClient() { // set hostname to 127.0.0.1 for testing hostname="localhost"; // try to create the socket and initialise the Streams try { Socket s = new Socket(hostname,9999); in = new BufferedReader(new InputStreamReader(s.getInputStream())); BY Ahmet Tolga Tat Sayfa 209 out = new PrintWriter(s.getOutputStream(),true); output.append("Connected to Server...\n"); } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } // initialise a listener thread to catch messages from server listener = new Thread(this); listener.start(); System.out.println("Listener started"); } // listener.start() creates a thread which calls run() public void run() { // just loop reading the input stream try { while(true){ String line = in.readLine(); System.out.println("Received from Server:" + line); BY Ahmet Tolga Tat Sayfa 210 output.append(line + "\n"); } } catch(IOException e) { System.err.println(e); } // when the Thread is killed... finally { listener = null; input.setText(" "); out.close(); } } public static void main(String args[]) { chatClient c = new chatClient(); c.pack(); c.show(); c.runClient(); } } import java.net.*; import java.io.*; BY Ahmet Tolga Tat Sayfa 211 import java.util.*; public class chatServer{ public chatServer() throws IOException{ // initialise new ServerSocket ServerSocket s = new ServerSocket(9999); while(true) { Socket client = s.accept(); System.out.println("Accepted connection from " + client.getInetAddress()+":"+ client.getPort()); chatHandler c = new chatHandler(client); c.start(); // chatHandler is derived from Thread, so we can call start() } } public static void main(String[] args) throws IOException { chatServer cs = new chatServer(); } } // end class definition // define class chatHandler as a derivation of Thread class chatHandler extends Thread { // declare variables protected Socket s; protected BufferedReader in; BY Ahmet Tolga Tat Sayfa 212 protected PrintWriter out; protected static Vector handlers = new Vector(); public chatHandler(Socket s) throws IOException { this.s = s; in = new BufferedReader(new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream(), true); System.out.println("Readers and Writers initialised"); } public void run() { System.out.println("run called"); try { // add this thread to class variable vector handlers.addElement(this); System.out.println("Element added to Vector"); // loop reading input and passing it to broadcast method while(true) { System.out.println("About to read inputstream"); BY Ahmet Tolga Tat Sayfa 213 String message = in.readLine(); System.out.println("Input Stream read"); System.out.println(message); broadcast(message); System.out.println("Message passed to broadcast method"); } } catch(IOException e) { System.err.println(e); } // if this thread is killed.... finally { // remove it from the vector handlers.removeElement(this); try { // tidy up debris! s.close(); } catch(IOException e) { System.err.println(e); } BY Ahmet Tolga Tat Sayfa 214 } } protected static void broadcast(String message) { System.out.println("Broadcast called"); synchronized(handlers) { Enumeration e = handlers.elements(); // returns true if there are other sockets running while (e.hasMoreElements()) { // loop to the next chatHandler in the vector chatHandler c = (chatHandler) e.nextElement(); try { synchronized(c.out) { c.out.println(message); } // end synchronized block }catch(Exception ex) { System.err.println(ex); c = null; BY Ahmet Tolga Tat Sayfa 215 } } // end while loop } // end synchronized block } // end broadcast } // ends class Basit bir Port Scanner örnegi //Kendi bilgisayarinizin Portlarini arar.Denemesi bedava. import java.net.*; import java.io.*; public class PortScanner { public static void main( String[] args) throws IOException { Socket connection = null; String host = "localhost";//kendi localhost‘unuz. try { for (int port = 1; port < 65536; port++) { try { connection = new Socket(host, port); System.out.println("Server on port " + port ); } catch (UnknownHostException error ) { System.err.println( error ); } } } catch (IOException error ) { System.err.println( error ); } finally { if (connection != null ) connection.close(); } } } InetAddress örnegi: import java.net.InetAddress; import java.net.InetAddress; import java.io.*; class SimpleDNS { BY Ahmet Tolga Tat Sayfa 216 public static void main(String[] args) { String hostName; if ( args.length != 1 ) { System.out.println("Usage: java SimpleDNS hostName"); System.exit(1); } hostName = args[0]; try { InetAddress address = InetAddress.getByName(hostName); byte ip[] = address.getAddress(); for (int octet=0; octet < ip.length; octet++) { System.out.print( ((int)ip[octet] & 0xff) + " " ); } System.out.println(); } catch (IOException DNSerror) { System.err.println(DNSerror); System.exit(1); } } } Basit bir Client/Server(Istemci/Sunuc) programi tcpClient.java import java.net.*; import java.io.*; public class tcpClient { public static void main(String[] args) { BY Ahmet Tolga Tat Sayfa 217 int port = 1500; String server = "localhost"; Socket socket = null; String lineToBeSent; BufferedReader input; PrintWriter output; int ERROR = 1; // read arguments if(args.length == 2) { server = args[0]; try { port = Integer.parseInt(args[1]); } catch (Exception e) { System.out.println("server port = 1500 (default)"); port = 1500; } } // connect to server try { socket = new Socket(server, port); System.out.println("Connected with server " + socket.getInetAddress() + ":" + socket.getPort()); } catch (UnknownHostException e) { System.out.println(e); System.exit(ERROR); } catch (IOException e) { System.out.println(e); System.exit(ERROR); } try { input = new BufferedReader(new InputStreamReader(System.in)); output = new PrintWriter(socket.getOutputStream(),true); // get user input and transmit it to server while(true) { lineToBeSent = input.readLine(); // stop if input line is "." if(lineToBeSent.equals(".")) break; output.println(lineToBeSent); } } catch (IOException e) { System.out.println(e); } try { socket.close(); } catch (IOException e) { System.out.println(e); } BY Ahmet Tolga Tat Sayfa 218 } } tcpServer.java import java.net.*; import java.io.*; public class tcpServer { public static void main(String args[]) { int port; ServerSocket server_socket; BufferedReader input; try { port = Integer.parseInt(args[0]); } catch (Exception e) { System.out.println("port = 1500 (default)"); port = 1500; } try { server_socket = new ServerSocket(port); System.out.println("Server waiting for client on port " + server_socket.getLocalPort()); // server infinite loop while(true) { Socket socket = server_socket.accept(); System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort()); input = new BufferedReader(new InputStreamReader(socket.getInputStream())); // print received data try { while(true) { String message = input.readLine(); if (message==null) break; System.out.println(message); } } catch (IOException e) { BY Ahmet Tolga Tat Sayfa 219 System.out.println(e); } // connection closed by client try { socket.close(); System.out.println("Connection closed by client"); } catch (IOException e) { System.out.println(e); } } } catch (IOException e) { System.out.println(e); } } } BY Ahmet Tolga Tat Sayfa 220 JDBC JDBC (Java Database Connectivity) JDBC nedir? JDBC Java programlari ile herhangi bir databank arasinda iletisimi saglayan Java JDBC API’sidir(Java köprüsüdür).JDBC bize herhangi bir veritabanina Java üzerinden ulasmamzi ve SQL ile direk olarak programlama yapabilmemezi saglar.SQL bir Sorgulama Script dilidir ve bir programlama dili degildir. Java Programi JDBC Köprüsü Veritabani (Database) Java ile veritabani programlamak icin SQL dilini bilmek gerekir. Nasil baglanti kurulur? Class.forName(„sun.jdbc.odbc.JdbcOdbcDriver“); sayesinde Java ile veritabani baglanti kurar. Örnek: Asagidaki program sayesinde herhangi bir databak ile baglanti kurabilirsiniz. import java.net.URL; import java.sql.*; class jdbcquery { public static void main (String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection connection = DriverManager.getConnection ("jdbc:odbc:test", "isim", "sifre"); Statement statement = connection.createStatement(); BY Ahmet Tolga Tat Sayfa 221 dbout(statement); System.out.println("--- Baska Giris---"); statement.executeUpdate("UPDATE adresler SET TelNr=12345678 WHERE Name='Cuneyt Arkin'"); dbout(statement); System.out.println ("--- Baska bir deger girin---"); statement.executeUpdate("INSERT INTO adresler VALUES ('Hakan Sükür', 'Inter Cikmaz sokak',0999988999"); dbout(statement); System.out.println ("--- silme"); statement.executeUpdate("DELETE FROM adresler WHERE TelNr=8764553"); dbout(statement); statement.close(); connection.close(); } catch(java.lang.ClassNotFoundException e) { System.out.println ("JDBC-ODBC-sürücüsü bulunamadi"); } catch(java.sql.SQLException e) { System.out.println ("Databank sorusturmada hata olustu"); } } private static void dbout(Statement statement) throws java.sql.SQLException { ResultSet result = statement.executeQuery ("SELECT Isim, Cadde, TelNr FROM adresler"); while (result.next()) { String Name = result.getString("Isim"); String Strasse = result.getString("Cadde"); int TelNr = result.getInt("TelNr"); System.out.println(Name + ", " + Strasse + ", " + TelNr); } result.close(); } } BY Ahmet Tolga Tat Sayfa 222 Örnek2: Asagidaki Örnek program bir grafik arayüzüne sahiptir ve JDBC köprüsünü kullanarak database ile baglanti kurar. import import import import import javax.swing.*; java.awt.*; java.awt.event.*; javax.swing.event.*; java.sql.*; public class VLookup1 extends JFrame { String dbUrl = "jdbc:odbc:people"; String user = ""; String password = ""; Statement s; JPanel panel = new JPanel(); JTextField searchFor = new JTextField(); JTextField tf1=new JTextField(); JLabel completion =new JLabel(""); JTextArea results = new JTextArea(); JLabel lb1 =new JLabel(""); public VLookup1() { searchFor.getDocument().addDocumentListener(new SearchL()); panel.setLayout(null); searchFor.setBounds(new Rectangle(100,100,150,25)); completion.setBounds(new Rectangle(100,170,50,25)); results.setBounds(new Rectangle(100,200,300,200)); tf1.setBounds(new Rectangle(100,130,150,25)); lb1.setBounds(new Rectangle(100,150,150,25)); lb1.setText("Aranan Soyad:\n"); panel.add(lb1,null); panel.add(searchFor,null); panel.add(completion,null); panel.add(results,null); panel.add(tf1,null); setSize(600,500); setVisible(true); setContentPane(panel); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection(dbUrl, user, password);s = c.createStatement(); } BY Ahmet Tolga Tat Sayfa 223 catch(Exception e) { results.setText(e.toString()); } Pencerekapat kapat=new Pencerekapat(); addWindowListener(kapat); } public class Pencerekapat extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } } class SearchL implements DocumentListener { public void changedUpdate(DocumentEvent e){ } public void insertUpdate(DocumentEvent e){ textValueChanged(); } public void removeUpdate(DocumentEvent e){ textValueChanged(); } } public void textValueChanged() { ResultSet r; if(searchFor.getText().length() == 0) { completion.setText(""); results.setText(""); return; } try { r = s.executeQuery("SELECT FIRST, LAST, EMAIL FROM people " +searchFor.getText()); if(r.next()) completion.setText( r.getString("last")); r = s.executeQuery("SELECT FIRST, LAST, EMAIL FROM people " +completion.getText()); BY Ahmet Tolga Tat Sayfa 224 } catch(Exception e) { results.setText(searchFor.getText() + "\n"); results.append(e.toString()); return; } results.setText(""); try { while(r.next()) { results.append(r.getString("Last") + ", "+ r.getString("fIRST") +": " + r.getString("EMAIL") + "\n"); } } catch(Exception e) { results.setText(e.toString()); } } public static void main(String[] args) { VLookup1 lookup=new VLookup1(); } } BY Ahmet Tolga Tat Sayfa 225 Corba Bu isten Çorba cikacaga benziyor. Corba nedir? Corba (Common Object Request Broker Arhitecture) heterojen aglardaki daginik objeler arasindaki haberlesmeyi saglar ve daginik sistemler için farkli servisler sunar. CORBA mimarisi platform ve programlama dilinden bagimsizligi gibi çok önemli iki özellige sahiptir. CORBA, dagitik, heterogen ve nesneye yönelik uygulamalar için ortaya konan bir endüstriyel standarttir. CORBA yazilim ve donanim saglayicilarinin olusturdugu Object Management Group (OMG) isimli ticari olmayan bir konsorsyum tarafindan olusturturulmustur. CORBA’da arayüzler OMG Interface Definition Language (IDL) kullanilarak hazirlanir. Bir IDL arayüz dosyasi, bir nesnenin uygulanabilmesi için sunucunun sagladigi veri çesitlerini, yöntemleri ve operasyonlari açiklar. IDL bir programlama dilinden daha çok arayüzleri tanimlayan bir dildir. Object Request Broker (ORB), sistem içindeki nesneler için bir iletisim merkezidir. Bu merkez, nesnelerin ag üzerinde iletisim kurabilmelerini saglayan nesne etkilesimini saglar. Basite indirgendiginde ORB’u istasyonlar arasi malzeme tasiyan bir trene benzetebiliriz. COBRA nesne servisleri nesne ömür standartlarini, isimleri, devamliligi, olay takibini, muameleleri ve es zamanliligi içerir. CORBA ortak araçlari, nesne sitemiminin kullanmasi için genel amaçli uygulamalar saglar. Veri tabani erisimi, e-posta, yazicidan baski alma bu uygulamalardan birkaçidir. Internet Inter-ORB Protocol (IIOP) CORBA 2.0 sartnamelerinde ortaya konan, internet üzerindeki genis dagitik uygulamalara erisimi saglayan bir açik internet protokoldur. Bu protokol TCP/IP üzerine kurulu ORB-ORB iletisimini saglar. IIOP farkli makinalar üzerindeki uygulamalarin haberlesmelerini saglar ve uygulama alni yerel agdan uluslararasi aga kadar genisletilebilir. BY Ahmet Tolga Tat Sayfa 226 Java'da RMI ile bir client, server'daki bir metodu cagirmakta, hatta iki makine arasinda nesneler gonderilebilmektedir. CORBA, RMI gibidir, fakat farkli dillerde olabiliyor. DCOM da bu teknolojilerin Microsoft esidir(Daha dogrusu Microsoft'un Dagitik sistemler icin gelistirdigi bir teknolojidir.) Yani RMI, CORBA ve DCOM teknolojik olarak birbirine cok benzeyen "middleware" veya "software bus" olarak adlandirilan cok onemli teknolojiler. Bunlar dagitik sistemlerde yaygin kullanilmaktalar. Corba ile Javada arayüzler hazirlamak icin http://java.sun.com/products/jdk/idl/. adserinden IDL programini indirmeniz ve buradaki idl.exe programini jdk’nin bulundugu bin dizinine kopyalamaniz gerekir. Corba arayüzü olusturmak icin ise xxx.idl olarak kayt ettiginiz Corba programi C:>jdk\bin\idlj xxx.idl yazarak arayüz olusturulur. //Örnek bir program // // StockMarketClient // // import org.omg.CORBA.*; import org.omg.CosNaming.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { ORB orb = ORB.init(); NamingContext root = NamingContextHelper.narrow( orb.resolve_initial_references("NameService") ); NameComponent[] name = new NameComponent[1] ; name[0] = new NameComponent("NASDAQ",""); StockMarket market = StockMarketHelper.narrow(root.resolve(name)); System.out.println("Price of MY COMPANY is " + market.get_price("MY_COMPANY")); } catch( SystemException e ) { System.err.println( e ); } } } // // // StockMarketServer // BY Ahmet Tolga Tat Sayfa 227 // import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase { public float get_price( String symbol ) { float price = 0; for(int i = 0; i < symbol.length(); i++) { price += (int) symbol.charAt( i ); } price /= 5; return price; } public StockMarketImpl( String name ) { super( name ); } } // // // StockMarketServer Main // // import org.omg.CORBA.*; import org.omg.CosNaming.*; import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) { try { ORB orb = ORB.init(); BOA boa = orb.BOA_init(); StockMarketImpl stockMarketImpl = new StockMarketImpl("NASDAQ"); boa.obj_is_ready( stockMarketImpl ); org.omg.CORBA.Object object = orb.resolve_initial_references("NameService"); NamingContext root = NamingContextHelper.narrow( object ) ; NameComponent[] name = new NameComponent[1]; name[0] = new NameComponent("NASDAQ", ""); BY Ahmet Tolga Tat Sayfa 228 root.rebind(name, stockMarketImpl); boa.impl_is_ready(); } catch( Exception e ) { e.printStackTrace(); } } } BY Ahmet Tolga Tat Sayfa 229 Kaynakca 1.Go To Java 2 Yazar:GuidoKrüger Addison-Wesley,1999 ISBN 3-8273-1370-8 http://www.gkrueger.com 2.Java ist auch eine Insel Yazar:Christian U. Ullenboom http://java-tutor.com/ 3.Thinking in Java Yazar:Bruce Eckel Prentice Hall Computer Books ISBN: 0136597238 http://www.bruceeckel.com 4.http://java.sun.com 5.http://www.omg.org 6.http://www.javaworld.com 7.http://bilmuh.ege.edu.tr 8.http://www.selfjava.de 9. ve daha aklimda olmayan bir sürü kaynak..?? ------------------------J J J J -------------------Bitti------------------J J J J --------------------------- BY Ahmet Tolga Tat Sayfa 230