ile programlama

advertisement
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
Download