Java Kitap
Java Kitap
ile programlama
Beta
Version 4.0
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
[Link] ......................................................................................................................................................................... 129
[Link] ................................................................................................................................................................. 130
[Link]...................................................................................................................................................................... 131
[Link].......................................................................................................................................................................... 132
[Link]........................................................................................................................................................................ 133
[Link] ............................................................................................................................................................ 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
Ö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.
• 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ð[Link]’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 ç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
[Link]ý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.
• 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 [Link] 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++
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.
• 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.
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 [Link] kaynaklarinin bir objeyi
baytkodlar olarak yapmasi için bir önceki daha düsük seviyede ki derleyiciye ihtiyaci olmasina
ragmen , degisik platformlarda yorumlanabilir .
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ý[Link]ý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.
• jdk1_2_2-[Link]
• jdk1_2_2-[Link]
• jdk1_2_2-[Link]
• jdk1_2_2-[Link]
• jdk1_2_2-[Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-[Link]
• jdk1_2_2-[Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-win- [Link]
• jdk1_2_2-[Link]
olmalý. Daha sonra [Link]'ý 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-[Link] 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ý[Link]'e týklayýn.
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.
Örnek:
//Java’ya hosgeldiniz
class MerhebaDunya{
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.
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.
[Link] satiri ani zamanda [Link] 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 [Link] olarak kaydetmemizdir.
javac [Link]
Eðer bu iþlem hiçbir sonuç vermezse demek ki her þey sorunsuz ve de artýk ayný dizinde
[Link] 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
import [Link];
}
Birinci satirda program icin aciklama yaziyoruz.
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 [Link]) 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ý[Link]
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 [Link]
olarak kayýt edelim. Kayýt iþleminden sonra yine ayný þekilde kaynak kodumuzu derliyoruz.
javac [Link]
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>
</body>
</html>
Yine standart bir text editörle(NotePad gibi) yazdýðýmýz bu dosyayý [Link] 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
appletviewer [Link]
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 [Link].*;
import [Link].*;
}
public void paint(Graphics g) {
[Link]([Link]);
[Link](10,10,300,100);
[Link]([Link]);
[Link](10,10,330,100);
[Link](9,9,332,102);
[Link](8,8,334,104);
[Link](7,7,336,106);
//Text kismi
[Link]([Link]);
[Link](font);
[Link](message,40,75);
}
}
Cikti islemleri(Input)
[Link] akisina print ve println islevlerini kullanarak cikti gönderebiliriz.
Örnegin;
[Link](“Canim Türkiyem“);
Yazarsak bilgisayarin ekranindan veya konsoldan Canim Türkiyemciktisini aliriz.
görürü[Link] ciktimizi ekrana yazdirdiktan sonra bir sonraki cikti icin alt satira gecmesini
istemezsek print islevini kullaniriz.
Örnegin;
[Link]“canim „);
[Link](„Türkiyem“);
Örnegin;
[Link](3);
Komutu bir tamsayi olan 3 sayisini ilk önce bir dizgiye cevirir ve ekrana bu dizgi [Link]
3 sayisini görürsünü[Link] bir cikti paremetresi asagidaki gibi olabilir.
[Link](„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([Link]));
try {
String giris=[Link]();
}
catch (IOException e ) { [Link](e);
}
Örnek:
import [Link].* ;
import Text;
class topla
{
public static void main (String args[]) throws IOException
{
int sayi1,sayi2;
int toplam=0;
//
Text m=new Text();
[Link]("Bir tamsayi giriniz: ");
sayi1=[Link]();
[Link]("Bir tamsayi daha giriniz");
sayi2=[Link]();
toplam=sayi1+sayi2;
[Link]("Toplam "+toplam);
} }
import [Link].*;
class Text {
• Yorumlar
• Ý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.
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. –[Link] ve 2,147,483,647 araliginda deger alabilir.
long
64 bitlik yer [Link] büyük bir aragliga sahiptir.
}
}
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 [Link] türü isaretsiz 16 bitten [Link] 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';
[Link]("char c="+ c);
}
}
Mantiksal degerler(booleans)
Boolean kosullu isletmenler (if,else,while ve do)tarafindan gereksinim [Link]ý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;
[Link]("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 [Link] agzindan cikan
kelimelerdir.
Java Stringleri String sinifindan turetilmis objeler olarak implemente [Link] nesne
olarak yapisinda tutulup islenmesi Java‘ya ustun özellikler saglar.Örnegin iki String’in
Stiring Uzunlugu:
Int Length()
Örnek:
class deneme {
public static void main(String args[])
{
char uzun[]={'a','b','c'};
String s=new String(uzun);
[Link]([Link]( ));
}
}
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";
[Link]("klm".length());
}
}
Stringleri Birlestirme:
class gleich {
public static void main(String args[]) {
String slte="20";
String a="Ich bin " + 20 + " Jahre alt";
[Link](a);
}
class solang {
public static void main(String args[]) {
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 {
int start=14;
int end=27;
[Link](buf);
}}
Örnek:
class indexbak{
[Link](s);
[Link]( "indexof(S) = " + [Link]('S') );
}
}
String Manipulasyonu
Concat( ) String concat( string s )
Iki stringi birlestirir.
String s1 = "bir";
String s2 = [Link]( "iki" ); // "biriki" stringini s2 degiskenine atar.
Örnek:
class degis {
public static void main(){
String s="Test edelim!";
[Link]("bak:"+s);
String upper=[Link]();
String upper=[Link]();
[Link]("UpperCase:"+upper);
[Link]("LowerCase:"+lower);
}
}
StringBuffer Nesnesi
StringBuffer stringlere daha fonksiyonel islevler kazandiran string sinifidir. StringBuffer
genisleyebilir ve yazilabilir karakter dizileri olusturabilmeyi saglar.
Örnek:
class sitbuf{
public static void main( ) {
}}
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( )
Diziler(Arrays)
Benzer tür degiskenlerin olusturdugu bir grublara dizi denir:Dizilerin Java da önemli bir yeri
vardir
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];
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];
[Link] // deðeri 8 dur
a [0].length // deðeri 2 tür.
Artýrma ve Eksiltme
Operatör Tanýmý Örnek Ýfade Tanýmý
++ Önce Arttýr ++a a yý 1 arttýrýp iþlemde öyle kullan
++ Sonra Arttýr a++ a yý iþlemde kullan sonra 1 arttýr
-- Önce Azalt --b b yý 1 azaltýp iþlemde öyle kullan
-- Sonra Azalt b-- b yý iþlemde kullan sonra 1 azalt
Karþýlaþ týrmalar
Standart Matematiksel Java Eºitlik ve Örnek Java Durumu Java Durumunun
Eþitlik ve Kýyaslama Kýyaslama Açýklamasý
Operatörleri Operatörleri
Eºitlik Operatörleri
= == x == y x eºittir y
!= x != y x eþit deðildir y
Kýyaslama
Operatörleri
> > x>y x büyüktür y
< < x<y x küçüktür y
>= x >= y x büyük eºittir y
<= x <= y x küçük eºittir y
Ö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 OR XOR Sola Kaydýr Saða Kaydýr Sýfýrla Saða Kaydýr
TE}NO
T
~ & | ^ << >> >>>
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ý ;
if (sayý < 0) {
else {
class eger
{
public static void main(String args[])
{
int x;
x=20;
if(x<15) {
[Link]("islem dogru");
}
else {
[Link]("Hata:Girdiginiz sayi " +x);
}
}
}
Koºul kalibi
Bazen çok kýsa koþullar için if else yerine kullanýlýr.
örnek:
int cevap;
cevap=x < y ? x : y;
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 [Link].*;
import [Link].*;
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.
import [Link].*;
import [Link].*;
add( prompt1 );
add( input1 );
}
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:
[Link]( "GÝRDÝÐÝNÝZ SAYI = "+sayi, 50, 150 );
break;
case 10:
Örnek
// farz edin sayým pozitif
// deðeri olan bir rakam
switch (sayým % 3) {
case 0:
renkAta (0);
break;
case 1:
break;
case 2:
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.
/********************************
*Örnek
*
*********************************/
import [Link].*;
import [Link].*
import [Link].*;
import [Link].*;
Örnek
class don{
public static void main(String args[]) {
int x;
[Link]("Cuneyt 10 defa sorar:");
for(x=0;x<=10;x++){
[Link]("(: Bitmedimi bu askimiz hala Nalan ");
}
[Link]("Nalan cevap verir:");
[Link]("THE SON :)");
}
}
Örnek
import [Link];
import [Link];
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 :
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 [Link] verilmezse bu, kontrol deðiþkeninin daha önceki komutlard a
tanýmlanmýþ ve deðer atanmýþ olmasýný gerektirir. [Link] verilmezse bu
ise for döngüsünün sonsuz bir döngü olacaðý anlamýna gelir. [Link] 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 [Link];
import [Link];
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 {
while döngüleri
While cok kullanilan tekrarlama yapilarindan biridir.( ) icindeki boolean terim true(dogru)oldugu
sürece yeniden islemi döndürü[Link] programda boolean islemi sonuclandiracak bir ifade yoksa
bu döngü sonsuza kadar devam edebilir.
//while örnegi
import [Link].*;
class whileornek {
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.
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
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 [Link].*;
import [Link].*;
public class whileornek extends Applet {
int n[];
int c=0;
int num;
int y=25;
int toplam=0;
Label prompt1;
TextField input1;
if ([Link]==input1){
c++;
num=([Link]([Link]()));
n[c]=num;
repaint();
}
return true;
}
}
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
Ö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
[Link] = renk;
}
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ý
classBody
Örnek:
import [Link].*;
class selam {
static String name;
public void setYourName(String n)
{
name=n;
}
public void sayHello(Graphics g)
{
[Link]("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ý[Link] 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 [Link] sýnýf üyeleri
deðiþkenlerini tanýmlarýný sýnýf yapýsý içerisinde tanýmlaný[Link] olarak, biz
deðiþkenleri methodlarýn tanýmlanmasýndan hemen önce yaparýz. Bu gerekli
olmasa bile
classDeclaration {
method declarations
import [Link].*;
import [Link].*;
import [Link].*;
Font font;
public void init(){
setForeground([Link]);
font = new Font("Helvetica", [Link], 12);
setLayout(new BorderLayout());
}
repaint();
return true;
}
return [Link](e);
}
public boolean action(Event e, Object arg)
{
if("Random".equals(arg)){
Al = (int)([Link]()*40000+1);
[Link](sliderAlText +
[Link](Al));
[Link](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;
[Link](font);
[Link](0,0,300,300);
redBits = (int)([Link]()*255);
blueBits = (int)([Link]()*255);
greenBits = (int)([Link]()*255);
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
[Link] örnek kodda görülgügü üzere dogal üye degiskeni Integer olarak
isimlendirilmistir sinif IntegerClass ile birlikte.
class IntegerClass {
int anInteger;
. . .
. . .
}
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ç[Link] Üye degiskenleri ve
methodlar ayniisimde olababilirler.Örnegin Asagidaki kod hatasiz olarak çalisir.
class IntegerClass {
int anInteger;
. . .
}
Kisaca tanim protosu asagidaki gibidir.:
[accessSpecifier] [static] [final] [transient] [volatile] type variableName
Üye degiskenleri tanimlari asagidaki gibi tanimlanir :
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 [Link].* ;
import [Link].* ;
public class selamla extends Applet{
[Link](adsoy);
[Link](d);
}
public boolean action( Event e, Object o )
{
adsoy = [Link]();
[Link]( "" ); // clear data entry
field
repaint();
return true;
}
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 [Link] 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() {
. . .
Object[] stackelements;
. . .
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 {
Object[] stackelements;
. . .
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) {
. . .
[Link] bir method sinif ismi ile ayni ise bu metoda biz baslandirici
BY Ahmet Tolga Tat Sayfa 59
[Link] metodun özel bir görevi [Link] 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.
Örnek:
import [Link].* ;
import [Link].* ;
public class numara extends Applet{
Stupid temp;
temp=a;
a=b;
b=temp;
[Link]("======= during swap1 ========",10,130);
[Link](d,145);
[Link](d,160);
}
class Stupid {
int myNum;
Stupid(int n) {
myNum = n;
}
public void sayHello(Graphics g,int yp) {
[Link]("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 [Link] sinif ile
yani ismi tasimak [Link] 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 [Link] 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()
Genel olarak kurucular kendi elemanlarinin kullanilir yeni nesne durumunu atamak için
[Link] 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ç[Link]
yazildigi gibi.
new Rectangle(myPointObj, myDimensionObj);
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;
super("AnimationThread");
[Link] = fps;
[Link] = num;
. . .
. . .
}
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
PAket disindan olan hiç kimse sinifa ulasip onun degerlerini [Link] 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 [Link] 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 [Link] 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 [Link] bisikleti, yaris
bisikleti, ve iki kisilik bisiklet ayni zamanda bazi hareketleride paylasirlar: fren sikma
pedal hizini degistirme
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.
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.
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;
}
[Link]
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 [Link] 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.
Eðer sen yeni bir Window alt sýnýfý oluþturmak istiyorsan [Link] 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.
[Link]: Final methods can't be
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
[Link] ve [Link] 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.
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
[Link] nasil hizla pedal çevriliyor ise veya nerde frene basiliyorsa.)
Gruplamanin Ehemmiyeti
• Modulleme--nesnenin kaynak programinin bir nesne için yazilip gelistirilmesi
tamamen kaynak koddon bagimsiz olarak [Link], 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
[Link] 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.
[Link](100);
[Link]()
[Link]=“mavi“;
[Link]++; //derleyici hatasý çünkü
// depo private’dý.
class Motor{
public void ayarlaMotorHýzý (int pedalPoz){
class Araba {
ayarlaVites ( ) ;
basPedal ( );
...
[Link]ýzý ( ) ;
...
}
Fakat eski murat’nýn programla ilgisi kalmadý ve Garbage Collector tarafýndan hafýzadan
otomatik olarak silindi.
return depo;
}
public int okuHýz ( ) {
..............
return hýz;
}
}
public Bot ( ) {
varTekerlek = false;
sayýTekerlek = 0;
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
...
}
Method Overloading
Bazende kendi içinizde ayný isimde fakat farklý deðiþkenler grubu alan metotlar yaratabilirsiniz.
class SporAraba extends Araba {
/ / Ýki constructor
}
public SportsAraba (String renk, String model) {
......
}
...}
public Myclass ( ) {
}
Genelde override ettiðimiz metotla geri dönmek için kullanýlýr.
......
return depo;
}
.........
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.
...
ayarlaVites( );
basPedal ( ) ;
...
}
public void dur( ) {
pedalPoz = 0;
frenYap( ) ;
hýz = 0.0;
}
...
demirAl ( ) ;
/ / veya
ipiCoz ( ) ;
yolVer ( ) ;
...
atDemir ( ) ;
...
}
private protected- Sadece sýnýf üyelerine uygulanabilir. Sadece sýnýf üyeleri ve ayný
paketteki alt sýnýflara açýktý[Link] – 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;
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.
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.
[Link]
[Link]
[Link]
import [Link];
import paket ismi.*;
Örnek:
Import [Link];
Import [Link].*;
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ç[Link] bazý hata durumlarý:
• ArithmeticException – 0 a bölünme hatasý
örnek:
public void paint (Graphics g) {
try {
[Link] (Kelimeler [ i ] , 25 , 25) ;
}
catch (ArrayIndexOutOfBoundsException e)
{
[Link] („kelimeler sýnýr dýþý“ ,25,25) ;
i=-1;
}
i++;
}
Örnek:
int tamam;
if (tamam = = -1) {
veya
. . .....
try {
} catch (ServerCevapsizException e) {
g. drawString („ server cevapsýz baska deniyorum“, 5, 5);
try {
baglaBeni(baskaServer) ;
} catch (ServerCevapsizException e) {
}
....}
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
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.
Asagidaki program da tek bir BytePrinter thread inin icrasini saglamak uzere tasarlanmistir :
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.
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.
Ö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");
[Link](Thread.MIN_PRIORITY);
[Link](Thread.NORM_PRIORITY);
[Link](Thread.MAX_PRIORITY);
[Link]();
[Link]();
[Link]();
}
}
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" );
[Link]();
[Link]();
[Link]();
[Link]();
}}
Örnek:
class PrintThread extends Thread{
int sleepTime;
public PrintThread(String id)
{
super(id);
sleepTime = (int) ([Link]() * 5000);
[Link]( "Isim: " + getName() +
"; sleep: " + sleepTime );
}
public void run()
{
try
{
sleep(sleepTime);
}
catch(InterruptedException exception)
{
[Link]( "Exception: " + [Link]() );
}
[Link]( "Thread " +getName() );
}
}
Thread eszamanlama
Java thread eszamanlama islemini gerceklestirebilmek icin monitor ler kullanir.
Synchronized(eszamanlanmis) metotlari olan her nesne bir monitor nesnesidir.
BY Ahmet Tolga Tat 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.
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.
Asagida verilmis olan ornek, yukaridaki ornegin eszamanli hale getirilmis versiyonudur.
//[Link] 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);
[Link]();
[Link]();
}
}
class ProduceInteger extends Thread {
private HoldInteger pHold;
public ProduceInteger(HoldInteger h){
pHold=h;
}
public void run(){
for (int count=0;count < 10;count++){
[Link]( count );
[Link]( "Producer set sharedInt to " +
count );
//sleep for a random interval
try{sleep( (int) ([Link]() * 3000) );
}
catch(InterruptedException e){
[Link]( "Exception " + [Link]() );
}
}
}
}
class ConsumeInteger extends Thread {
private HoldInteger cHold;
public ConsumeInteger(HoldInteger h){
cHold=h;
}
public void run(){
int val;
val=[Link]();
[Link]( "Consumer retrieved "+val);
while (val!=9){
//sleep for a random interval
try{sleep( (int) ([Link]() * 3000) );
}
catch(InterruptedException e){
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.
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 :
[Link] sinifina ait getThreadGroup() metodu ve
[Link] 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 = [Link]().getThreadGroup();
while(true) {
if ([Link]() != null) top = [Link]();
else break;
}
Thread[] theThreads = new Thread[[Link]()];
[Link](theThreads);
for (int i = 0; i < [Link]; i++) {
[Link](theThreads[i]);
}
}
}
Thread lerin gercek listesi, sistemden sisteme degisiklikler gosterecektir fakat asagidakine benzer
bir cikti muhtemeldir :
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
[Link] 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 [Link].*;
import [Link].*;
Bu bölümde [Link] 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 [Link] 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.
private Vector v;
//Görsel elemanlar
private TextField input;
private Button ekleBtn, silBtn, ilkBtn, sonBtn, bosBtn,
mevcutBtn, konumBtn, trimBtn, statsBtn, displayBtn;
if ([Link]( searchKey) )
showStatus(searchKey + " vectorde mevcut" );
else
showStatus(searchKey + " vectorde mevcut degil");
}
else if ([Link]()==konumBtn) {
showStatus("Eleman "+ [Link]([Link]())+" konumunda");
}
else if ([Link]()== trimBtn) {
[Link]();
showStatus(" Vectorün kapasitesi eleman sayisina çekildi");
}
else if ([Link]()==statsBtn) {
showStatus("Eleman sayisi= " + [Link]() +"- kapasite = " +[Link]());
}
else if ([Link]()== displayBtn) {
Enumeration enum= [Link]();
StringBuffer buf = new StringBuffer();
while ( [Link]())
[Link]([Link]()).append(" ");
showStatus( [Link]());
}
[Link]("");
}
}
Ö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.
[Link]( [Link]() );
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( [Link]() );
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.
[Link]();
[Link]();
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 [Link] 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.
private Stack s;
//Görsel elemanlar
private TextField input;
private Button pushBtn, popBtn, peekBtn, bosBtn, aramaBtn,
goruntuleBtn;
if (result==-1)
showStatus( searchKey + "Bulunamadi");
else
showStatus( searchKey +" "+result+" indexinde bulundu");
}
else if ([Link]()== goruntuleBtn) {
Enumeration enum =[Link]();
StringBuffer buf = new StringBuffer();
while ([Link]())
[Link]( [Link] Element()).append(" ");
showStatus([Link]());
}
}
}
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.
import [Link].*;
import [Link].*;
import [Link];
if ( val == null )
showStatus( "Put: " + [Link]() );
else
showStatus( "Put: " + [Link]() +
"; Replaced: " + [Link]() );
}
else if ( [Link] == get ) {
Object val = [Link]( [Link]() );
if ( val != null )
showStatus( "Get: " + [Link]() );
else
showStatus( "Get: " + [Link]() +
" not in table" );
}
else if ( [Link] == remove ) {
Object val = [Link]( [Link]() );
if ( val != null )
showStatus( "Remove: " + [Link]() );
else
showStatus( "Remove: " + [Link]() +
" not in table" );
}
else if ( [Link] == empty ) {
showStatus( "Empty: " + [Link]() );
BY Ahmet Tolga Tat Sayfa 103
}
else if ( [Link] == containsKey ) {
showStatus( "Contains key: " +
[Link]( [Link]() ) );
}
else if ( [Link] == containsObj ) {
showStatus( "Contains object: " +
[Link]( new Employee( [Link](),
[Link]() ) ) );
}
else if ( [Link] == clear ) {
[Link]();
showStatus( "Clear: Table is now empty" );
}
else if ( [Link] == listElems ) {
StringBuffer buf = new StringBuffer();
[Link]( [Link]() );
}
else if ( [Link] == listKeys ) {
StringBuffer buf = new StringBuffer();
[Link]( [Link]() );
}
return true;
}
}
class Employee {
private String first;
private String last;
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.
[Link] ( );
Ifadesi Hashtable'in boþ olup olmadigini kontrol eder.
[Link] ( [Link] ( ) );
Ifadesi ise parametre olarak girilen key li elemanin Hashtableda olup olmadigini kontrol eder.
[Link] ( );
Metodu ile Hashtable temizlenir.
[Link] ( );
[Link] ( );
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 [Link] 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 = [Link] ( [Link] ( ) );
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.
[Link] ( input );
Bu ifade dissal bir dosyadan veri almak için kullanilir. input bir inputstream dir ve bu stream'in
içerigi proterty'ye aktarilir.
[Link](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 [Link]'dan çok daha zengin bir rastgele sayi üretici sunmaktadir. Bunun
[Link]'dan farki ürettigi sayiyi bir daha üretmemesi yani hep farkli sayilar üretmesidir.
Random r = new Random ( )
Yukaridaki ifade ile random class'ini kullanabiliriz.
import [Link].*;
import [Link].*;
import [Link];
if ( c % 8 == 0 )
[Link](" ");
}
return [Link]();
}
}
import [Link].*;
import [Link].*;
import [Link];
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.
[Link]( bitNumber );
Yukaridaki ifade ile bir konumdaki bit 1'e esitlenir yani set edilir.
[Link]( bitNumber );
Yukaridaki ifade ile bir konumdaki bit 0'a esitlenir yani reset edilir.
[Link]( 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.
import [Link];
import [Link].*;
import [Link].*;
int counter = 0;
if ( [Link]( val ) )
showStatus( val + " is a prime number" );
else
showStatus( val + " is not a prime number" );
return true;
}
}
Exception cesitleri
Java bircok farkli exception nesnesi [Link] 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.
EXCEPTION ACIKLAMA
try { ....
}
catch(){ ....
}
Eger bir try blogu calistirilip ,hicbir hata ile karsilasilmazsa kontrol son hata yakalayicidan
sonraki ilk koddan devam [Link] finally blok varsa bu blok calistirilir.
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" [Link]
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
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.
FINALLY BLOGU
Bir exception oldugu zaman metottaki isleyis ani ve dogrusal olmayan bir yola [Link]
kodlanmasina bagli olarak bir exception'in zamansiz bir sekilde geri donmesine bile sebep
[Link] bir metot giriste bir dosyayi aciyor ve cikista kapatiyorsa exception- handling
mekanizmasinin bu dosyayi kapatan kodu gecmemesi [Link] anahtar kelimesi bu ihtimal
icin tasarlanmistir.
Finally blogu istege [Link] varsa "try" blogunun catch tumcesinden sonra yer [Link],
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.
IllegalAccessException
InstantionationException
InterruptedException
NoSuchMethodException
ArithmeticException
ArrayStoreException
ClassCastExeception
IllegalArgumentException
IllegalThreadStateException
NumberFormatException
IllegalMonitorStateException
IndexOutOfBoundException
ArrayIndexOutOfBoundException
StringIndexOutOfBoundException
NegativeArraySizeExecption
NullPointerException
SequrityException
Exception
IOException
MalFormedURLException
ProtocolException
SocketException
UnknownHostException
UnknownServiceException
import [Link];
import [Link].*;
// 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 );
}
try {
result = quotient( number1, number2 );
showStatus( number1 + " / " + number2 + " = " +
[Link]( result ) );
}
catch ( ZeroException exception ) {
showStatus( [Link]() );
}
}
return true;
}
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.
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.
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
[Link] butun metodlarin tanimlamasi bir sinif taniminin icerisinde yapilmalidir.
Metod tanimlamasinin formati asagidaki gibidir.
Metod ismi herhangi gecerli bir ifade olabilir. Dondurulecek degerin tipi void ise bu ifade
Metodun birsey döndürmeyecegini gö[Link] listesinde birden fazla parametre var ise
"," ile birbirinden ayrilirlar. Parametere listesindeki parametreler metod cagrildigi zaman kabul
[Link] tanimlamalari acik bir sekilde yapilmalidir. "{" ve "}" arasinda yazilan
hersey metodun govdesini [Link] olarakta [Link] 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 [Link].*;
import [Link];
import [Link].*;
import [Link];
import [Link].*;
import [Link].*;
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 );
[Link]( this );
add ( label1 );
add ( field1 );
}
public void paint( Graphics g )
{
int Ypos = 70;
[Link]( "Zar", 25, 55);
[Link]( "Gelme Sýklýðý", 100, 55);
for (int i = 1; i <= 6; i++)
{
[Link]( [Link]( i ), 25, Ypos);
[Link]( [Link]( frequency[ i ]), 100, Ypos);
Ypos += 15;
}
}
public void actionPerformed( ActionEvent e )
{
limit = [Link]( [Link]() );
for (int i = 1; i <= 6; i++ )
{
frequency [ i ] = 0;
}
for ( int roll = 1; roll <= limit; roll++ )
{
int face = 1 + (int)( [Link]() * 6 );
frequency[ face ]++; }
repaint();
}
}
Otomatik Degiskenler
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 ( [Link] ) 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 [Link];
import [Link];
public class faktorial extends Applet
{
public void paint( Graphics g )
{
int Ypos = 25;
for (long i = 0; i <= 10; i++)
{
[Link]( 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 [Link] 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 ( [Link] ) overloaded metodlar olan square'lari
kullanir. Metodlardan biri parametre olarak integer bir sayi alirken digeri double sayi almaktadir.
import [Link];
import [Link];
public class appmethodoverload extends Applet
{
public void paint( Graphics g)
{
[Link]( "Tamsayý 8'in karesi = " + square( 8 ), 25, 25);
[Link]( "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;
}
}
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 ( ) [Link] 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 [Link] 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.
[Link]
Tanýmlý Deðiþkenler;
public final static double E – e sayýsýnýn hazýr deðerini verir. (2.71828...)
public static type max (type a, type b) – Ýki deðerin maksimumunu verir.
int x;
double rand, y, z, e;
float max;
rand = [Link]();
x=[Link](-123);
y=[Link](123.567);
z=[Link](2,4);
e=Math.E;
max =[Link]((float)1e10, (float)3e9);
BY Ahmet Tolga Tat Sayfa 129
[Link] (rand);
[Link] (x);
[Link] (y);
[Link] (z);
[Link] (e);
[Link] (max);
}
}
[Link]
Deklârasyon;
char c; /* character deðiþkeni */
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.
// Path /Examples100/Character/[Link]
public class Char1{
public static void main (String args[]){
char c1='A';
char c2='z';
char c3='5';
Character C1=new Character('C');
[Link]
Deklârasyon;
int i; /* integer deðiþkeni */
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.
Try
{
x=[Link](stry);
BY Ahmet Tolga Tat Sayfa 131
[Link]("x: "+x+", stringden alinmistir.") ;
}catch (NumberFormatException e)
{
[Link] ("Verilen arguman integer degildir.") ;
[Link] (1) ;
}
y=[Link]();
[Link]("X double a cevrilmis: "+y);
[Link]("X as a String: " + [Link] ( ) );
}
}
[Link]
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.
[Link]
Deklârasyon;
float f; /* float deðiþkeni f * /
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 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 boolean isInfinite( ) - Eðer Float objesinin deðeri sonsuz ise true, aksi halde false
döner.
public String toString ( ) – Float objesini String’e çevirir.
[Link]
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.
[Link]
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 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.
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 static String valueOf (char data[ ]) – Verilen karakter dizisini String’e çevirir.
Örnek1;
// Path /Examples100/String/[Link]
class String1{
public static void main (String args[]){
String x="abc";
String y=new String("abc");
String z="abc";
if (x==y)
[Link]("x==y");
else if ([Link](y))
[Link]("x esittir y") ;
if (x==z)
[Link] ("x==z");
}
}
Örnek2;
// Path /Examples100/String/[Link]
class String2{
public static void main (String args[]){
String pi=[Link](f);
[Link]
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 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.
int boy=args[0].length();
StringBuffer hedef=new StringBuffer(boy);
BY Ahmet Tolga Tat Sayfa 135
for (int i=(boy-1);i>=0;i--){
[Link](args[0].charAt (i) ) ;
}
[Link]([Link]());
}
}
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/[Link]
import [Link].*;
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/[Link]
import [Link].*;
public class Panel1 extends Panel{
public static void main (String args[]){
Frame fr=new Frame("Panelli Frame!");
Panel pan=new Panel();
[Link](500,500);
[Link]([Link]);
[Link](null);
[Link](100,100);
[Link]([Link]);
[Link](pan);
[Link]();
}
}
Appletler zaten panel’in alt sýnýfý olduðundan direkt olarak GUI parçalarýný ekleyebiliriz
Örnek;
//Path /Examples100/Panel/[Link]
import [Link].*;
import [Link];
public class Panel2 extends Applet{
Button but;
public void init()
{
but=new Button(„OK“);
BY Ahmet Tolga Tat Sayfa 138
add(but);
}
}
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.
Örnek;
//Path /Examples100/FlowLayout/[Link]
import [Link].*;
import [Link];
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.
Örnek;
//Path /Examples100/BorderLayout/[Link]
import [Link].*;
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“);
[Link](250,250);
[Link](„North“,butN);
[Link](„South“,butS);
[Link](„East“,butE);
[Link](„West“,butW);
[Link](„Center“,butC);
[Link]();
}
}
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.
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/[Link]
import [Link].*;
import [Link];
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);
}
}
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:
[Link]=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:
[Link]=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();
[Link]("Elma");
[Link]("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
Hareketi
E}Metod
getItem(int 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.
countItems
Bir seçim menüsündeki eleman sayýsýný verir.
()
getSelecte
Seçili menü elemanýnýn indeks pozisyonunu geriye döndürür.
dIndex()
getSelecte
Bir string olarak o anda geçerli olan elemaný geriye döndürür.
dItem()
select(int) Verilen bir pozisyondaki elemaný seçer.
select(strin
Verilen string ile menü elemanýný seçer.
g)
Örnek;
//Path /Examples100/Choice/[Link]
import [Link].*;
import [Link];
[Link] („Mavi“);
[Link] („Sari“);
[Link] („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.
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:
[Link]=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:
[Link]=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;
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();
[Link]("Elma");
[Link]("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
Hareketi
E}Metod
BY Ahmet Tolga Tat Sayfa 147
getItem(int 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.
countItems
Bir seçim menüsündeki eleman sayýsýný verir.
()
getSelecte
Seçili menü elemanýnýn indeks pozisyonunu geriye döndürür.
dIndex()
getSelecte
Bir string olarak o anda geçerli olan elemaný geriye döndürür.
dItem()
select(int) Verilen bir pozisyondaki elemaný seçer.
select(strin
Verilen string ile menü elemanýný seçer.
g)
import [Link].*;
import [Link].*;
class AnaMenu
extends MenuBar
{
private MenuItem aGeri;
private CheckboxMenuItem aRenk;
public AnaMenu()
{
Menu m;
//Datei
m = new Menu("File");
[Link](new MenuItem("Yeni"));
[Link](new MenuItem("Tekrar"));
[Link](new MenuItem("Kaydet"));
[Link]();
[Link](new MenuItem("Cik"));
add(m);
//Bearbeiten
m = new Menu("Calisma");
[Link]((aGeri = new MenuItem("Geri")));
[Link]();
[Link](new MenuItem("Kes"));
[Link](new MenuItem("Kopyala"));
[Link](new MenuItem("Yazdir"));
[Link](new MenuItem("Sil"));
add(m);
//Optionen
BY Ahmet Tolga Tat Sayfa 148
m = new Menu("Optionen");
[Link](new MenuItem("Einstellungen"));
[Link]((aRenk = new CheckboxMenuItem("Renk")));
add(m);
//Info
m=new Menu("Bilgi");
[Link](new MenuItem("Hakkinda"));
[Link](new MenuItem("Yardim"));
);//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);
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);
[Link]("*");
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);
[Link]('*');
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()
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/[Link]
import [Link];
import [Link].*;
import [Link];
import [Link];
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();
[Link](false);
add("North",tf1);
add("South",tf2);
add("Center", but);
[Link](this);
}
public void actionPerformed(ActionEvent e)
{
[Link]([Link]([Link]([Link]([Link]()),2)));
}
}
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.
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([Link] instanceof(TextField)
handleText([Link]);
else if([Link] 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 [Link].*;
public class ButtonActionsTest extends [Link] {
Ýç-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.
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ý
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(non-
exclusive ).
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);
[Link]("NewYork";
[Link]("Chicago";
[Link]("Miami";
[Link]("Londra";
[Link]("Michigan";
[Link]("Paris";
Scrollbar Metodlarý
{PRIVATE}Metod Hareketi
getMaximum() Maximum deðeri geriye döndürür.
getMinumum() Minumum deðeri geriye döndürür.
Scrollbarýn yönünü geriye döndürür:
getOrientation() 0 ->[Link]
1 ->[Link]
getValue() Scrollbarýn o andaki geçerli deðerini döndürür.
setValue(int) 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);
Ek Olaylar(Events)
{PRIVATE}Ol
Hareketi
ay
Action_Event Bir UI elemaný hareket oluþturduðunda üretilir.
Key_Action Text alaný hareketi oluþtuðunda üretilir.
List_Deselect Bir kaydýrma listesinde(scrollinglist) elemanlarýn seçimi kaldýrýldýðýnda üretilir.
List_Select Bir kaydýrma listesindeki elemanlarýn seçimi durumunda üretilir.
Scroll_Absolut
Scrollbarýn kutusu hareket ettirilirken üretilir.
e
Scroll_Line_D
Scrollbarýn altýndaki veya solundaki ok týklandýðýnda üretilir.
own
Scroll_Line_U
Scrollbarýn üstündeki veya saðýndaki ok týklandýðýnda üretilir.
p
Scroll_Page_D
Scrollbarýn altýndaki alanlara veya saðýndaki alanlara geçildiðinde üretilir.
own
Scroll_Page_U
Scrollbarýn üzerindeki alanlara veya solundaki alanlara geçildiðinde üretilir.
p
Örnek:
import [Link].*;
import [Link].*;
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" +
Örnek:
import [Link].*;
import [Link].*;
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 ([Link]==showFrame ) {
String s="This frame does something!";
if (f!=null){
[Link]();
[Link]();
}
f=new DemoFrame(s);
[Link](300,200);
[Link](false);
[Link]();
}
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 ([Link]==Event.WINDOW_DESTROY){
hide();
dispose();
return true;
}
return [Link](e);
}
public boolean action (Event e,Object o)
{
if ([Link]==a)
setBackground ([Link]);
else if ([Link]==b)
setBackground ([Link]);
else if ([Link]==c)
setBackground ([Link]);
else if ([Link]==d)
setBackground ([Link]);
repaint();
return true; } }
Örnek:
import [Link];
import [Link].*;
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();
[Link]([Link]);
[Link](80,80);
deck=new Panel();
cardManager=new CardLayout();
[Link] (cardManager);
add ("East",deck);
p1=new Panel();
[Link](b1);
[Link]([Link](),p1);
p2=new Panel();
[Link](b2);
[Link](c);
[Link]([Link](),p2);
p3=new Panel();
[Link] (new BorderLayout());
[Link] ("North",new Button ("North Pole"));
BY Ahmet Tolga Tat Sayfa 160
[Link] ("West",new Button ("The West"));
[Link] ("East",new Button ("Far East"));
[Link] ("South",new Button ("South Pole"));
[Link] ("Center",b3);
[Link]([Link](),p3);
p4=new Panel();
[Link] (new GridLayout(2,2));
[Link] (firstButton=new Button("First"));
[Link] (nextButton=new Button("Next"));
[Link] (prevButton=new Button("Previous"));
[Link] (lastButton=new Button("Last"));
add("West",p4);
}
public boolean action (Event e,Object o)
{
if ([Link]==firstButton)
[Link](deck);
else if ([Link]==prevButton)
[Link](deck);
else if ([Link]==nextButton)
[Link](deck);
else if ([Link]==lastButton)
[Link](deck);
return true }}
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
stop()
Bu metot appletin ekranda olmadýðý zamanlarda çaðrýlýr.
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.
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/[Link]
<title> Test Zamani </title>
<hr>
<applet code=[Link] width=200 height=200>
<param name=x value=30>
<param name=y value=40>
</applet>
<hr>
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/[Link]
import [Link].*;
import [Link];
public class Graphics1 extends Applet
{
public void paint (Graphics g)
{
[Link](10,10,10,40);
[Link](50,50,20,20);
[Link](80,80,20,20);
[Link](110,110,30,15,30,90);
}
}
Örnek;
//Path /Examples100/Audio/[Link]
import [Link];
import [Link] .*;
public class Audio1 extends Applet{
AudioClip ses;
public void init()
{
ses=getAudioClip(getDocumentBase(),"[Link]");
}
public void start()
{
[Link]();
}
public void stop()
{
[Link]();
}
Örnek:
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
import [Link];
privateImage deneme;
deneme=getImage(getDocumentBase(),"[Link]");
}
[Link](deneme,1,1,this);
int width=[Link](this);
int height=[Link](this);
[Link]( deneme,1,90,width*2,height*2,this);
}
[Link](deneme[currentimage],1,1,this);
currentimage=(currentimage+1)%totalimages;
try{
[Link](sleeptime);
}
catch(InterruptedException e) {
showStatus ([Link]());
}
repaint();
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ý[Link]ý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: [Link](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ý[Link] 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.
import [Link].*;
import [Link];
[Link](buffer,0,0,this);
[Link](0,0,160,80);
[Link](deneme[currentimage],0,0,this);
currentimage=(currentimage+1)%totalimages;
try{
[Link](sleeptime);
}
catch(InterruptedException e) {
showStatus ([Link]());
}
repaint();
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 [Link].*;
import [Link];
imageTracker=new MediaTracker(this);
[Link](deneme[i],i);
}
try{
[Link](0);
}
catch(InterruptedException e) {
[Link](buffer,0,0,this);
if ([Link](currentImage,true)){
[Link](0,0,160,80);
[Link](deneme[currentimage],0,0,this);
currentimage=++currentimage%totalimages;
}
try{
[Link](sleeptime);
}
Görüldüðü gibi [Link] ö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 [Link](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 [Link](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
([Link](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.
import [Link].*;
import [Link];
imageTracker=new MediaTracker(this);
[Link](deneme[i],i);
}
try{
[Link](0);
}
catch(InterruptedException e) {
if (animate==null) {
animate=new Thread(this);
[Link]();
}
[Link](buffer,0,0,this);
}
while (true) {
if ([Link](currentImage,true)){
[Link](0,0,160,80);
[Link](deneme[currentimage],0,0,this);
currentimage=++currentimage%totalimages;
}
try{
[Link](sleeptime);
}
catch(InterruptedException e) {
BY Ahmet Tolga Tat Sayfa 175
showStatus ([Link]());
}
repaint();
}
}
public void update(Graphics g){ paint(g);}
}
import [Link].*;
import [Link];
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ý[Link] 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 [Link].*;
import [Link];
import [Link].*;
public class ImageMap extends Applet implements MouseListener, MouseMotionListener{
Image deneme;
MediaTracker trackImage;
int width,height;
addMouseListener(this);
addMousemMotionListener(this);
trackImage=new MediaTracker(this);
deneme=getImage (getDocumantBase(),"[Link]");
[Link](deneme,0);
try{
[Link]();
}
BY Ahmet Tolga Tat Sayfa 177
catch(InterruptedException e) {
width=[Link](this);
height=[Link](this);
resize(width,height);
[Link](deneme,0,0,this);
}
public mouseMoved(MouseEvent e)
{showStatus(translateLocation([Link]()))}
public mouseExited(MouseEvent e)
{
showStatus("Pointer outside deneme applet");
}
[ Import [Link].*; ]
JFrame
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
try {
[Link]([Link]());
} catch(Exception e) {
try {
[Link]([Link]());
} catch(Exception e) {
try {
[Link]("[Link]");
} catch(Exception e) {
int height,
String title,
Color bgColor) {
[Link](bgColor);
[Link](bgColor);
[Link](width, height);
[Link](content);
[Link](new ExitListener());
[Link](true);
return(frame);
int width,
int height,
String title) {
int width,
int height) {
[Link]().getName(),
[Link]));
import [Link].*;
import [Link].*;
[Link]([Link]());
} catch(Exception e) {
[Link]("Error setting Java LAF: " + e);
}
}
[Link]("[Link]");
} catch(Exception e) {
[Link]("Error setting Motif LAF: " + e);
}
}
...
JLabel
import [Link].*;
import [Link].*;
public JLabels() {
super("Using HTML in JLabels");
[Link]();
JButton
import [Link].*;
import [Link].*;
import [Link];
import [Link];
import [Link];
import [Link];
public ButtonDemo() {
ImageIcon leftButtonIcon = new ImageIcon("images/[Link]");
ImageIcon middleButtonIcon = new ImageIcon("images/[Link]");
ImageIcon rightButtonIcon = new ImageIcon("images/[Link]");
[Link](new WindowAdapter() {
public void windowClosing(WindowEvent e) {
BY Ahmet Tolga Tat Sayfa 184
[Link](0);
}
});
import [Link].*;
import [Link].*;
public JButtons() {
super("Using JButton");
[Link]();
addWindowListener(new ExitListener());
Container content = getContentPane();
[Link]([Link]);
[Link](new FlowLayout());
JButton button1 = new JButton("Java");
[Link](button1);
ImageIcon cup = new ImageIcon("images/[Link]");
JButton button2 = new JButton(cup);
[Link](button2);
JButton button3 = new JButton("Java", cup);
[Link](button3);
JButton button4 = new JButton("Java", cup);
[Link]([Link]);
[Link](button4);
pack();
setVisible(true);
}
}
JPanel
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
public JInternalFrames() {
super("Multiple Document Interface");
[Link]();
addWindowListener(new ExitListener());
Container content = getContentPane();
[Link]([Link]);
JDesktopPane desktop = new JDesktopPane();
[Link]([Link]);
[Link](desktop, [Link]);
setSize(450, 400);
for(int i=0; i<5; i++) {
JInternalFrame frame
= new JInternalFrame(("Internal Frame " + i),
true, true, true, true);
[Link](i*50+10, i*50+10);
[Link](200, 150);
[Link]([Link]);
[Link](frame);
[Link]();
}
setVisible(true);
}
}
JToolBar
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
public JToolBarExample() {
super("JToolBar Example");
[Link]();
addWindowListener(new ExitListener());
Container content = getContentPane();
[Link]([Link]);
toolbar = new BrowserToolBar();
[Link](toolbar, [Link]);
labelBox = new JCheckBox("Show Text Labels?");
[Link]([Link]);
[Link](this);
[Link](new JTextArea(10,30), [Link]);
[Link](labelBox, [Link]);
pack();
setVisible(true);
}
JLists
public ListDemo() {
super("ListDemo");
if (size == 0) {
//Nobody's left, disable firing.
[Link](false);
} else {
//Adjust the selection.
if (index == [Link]())//removed item in last position
index--;
[Link](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) {
if ([Link]() == -1) {
//No selection, disable fire button.
[Link](false);
[Link]("");
} else {
//Selection, update text field.
[Link](true);
[Link](new WindowAdapter() {
public void windowClosing(WindowEvent e) {
[Link](0);
}
});
[Link]();
[Link](true);
}
}
JTree
import [Link].*;
import [Link].*;
import [Link].*;
public SimpleTree() {
super("Creating a Simple JTree");
[Link]();
addWindowListener(new ExitListener());
Container content = getContentPane();
Object[] hierarchy =
{ "[Link]",
"[Link]",
"[Link]",
"[Link]",
"[Link]",
new Object[] { "[Link]",
"[Link]",
"[Link]",
"[Link]" },
"[Link]",
new Object[] { "[Link]",
new Object[] { "[Link]",
"[Link]" },
"[Link]" },
"[Link]",
"[Link]" };
DefaultMutableTreeNode root = processHierarchy(hierarchy);
JTree tree = new JTree(root);
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
public SelectableTree() {
super("JTree Selections");
[Link]();
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);
[Link](child);
for(int grandChildIndex=1; grandChildIndex<4; grandChildIndex++) {
grandChild =
new DefaultMutableTreeNode("Grandchild " + childIndex +
"." + grandChildIndex);
[Link](grandChild);
}
}
tree = new JTree(root);
[Link](this);
[Link](new JScrollPane(tree), [Link]);
BY Ahmet Tolga Tat Sayfa 192
currentSelectionField = new JTextField("Current Selection: NONE");
[Link](currentSelectionField, [Link]);
setSize(250, 275);
setVisible(true);
}
import [Link].*;
import [Link].*;
public DynamicTree(int n) {
super("Creating a Dynamic JTree");
[Link]();
addWindowListener(new ExitListener());
Container content = getContentPane();
JTree tree = new JTree(new OutlineNode(1, n));
[Link](new JScrollPane(tree), [Link]);
setSize(300, 475);
setVisible(true);
}
}
public JOptionPaneExamples() {
super("JOptionPane Examples");
addWindowListener(new ExitListener());
[Link]();
Container content = getContentPane();
[Link](new GridLayout(0, 1));
lookAndFeelBoxes =
new JCheckBox[] { new JCheckBox("Native", true),
new JCheckBox("Java (Metal)"),
new JCheckBox("Motif") };
[Link](new CheckBoxPanel("Looks to use:", lookAndFeelBoxes));
titleField =
new JLabeledTextField("Title:", "Title to appear at top of border");
[Link](titleField);
BY Ahmet Tolga Tat Sayfa 194
messageField =
new JLabeledTextField("Message:", "Message to appear inside of dialog
box");
[Link](messageField);
selectionValuesField =
new JLabeledTextField("Choices to present to user (separate by
spaces):",
"Choice1 Choice2 Choice3 Choice4");
[Link](selectionValuesField);
ignoreSelectionValuesBox =
new JCheckBox("Ignore predefined choices and supply textfield to
user");
[Link](ignoreSelectionValuesBox,
selectionValuesField);
[Link](dialogTypeButtons[2], selectionValuesField);
[Link](dialogTypeButtons[2],
ignoreSelectionValuesBox);
[Link](ignoreSelectionValuesBox);
buttonLabelsField =
new JLabeledTextField("Button labels for \"Option\" dialog:",
"Button1 Button2 Button3");
[Link](dialogTypeButtons[3], buttonLabelsField);
[Link](buttonLabelsField);
pack();
setVisible(true);
}
substrings([Link]()),
null);
}
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
JPassword
import [Link].*;
import [Link].*;
import [Link].*;
[Link](contentPane);
[Link](new WindowAdapter() {
public void windowClosing(WindowEvent e) { [Link](0); }
});
[Link]();
[Link](true);
}
JComboBox
import [Link].*;
import [Link].*;
import [Link].*;
public ComboBoxDemo() {
String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
[Link](new WindowAdapter() {
public void windowClosing(WindowEvent e) {[Link](0);}
});
[Link](new ComboBoxDemo());
[Link]();
[Link](true);
}
}
JTable
import [Link];
import [Link];
import [Link];
public TableDemo() {
super("TableDemo");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
[Link](0);
}
});
}
try {
data[row][col] = new Integer([Link]());
fireTableCellUpdated(row, col);
} catch (NumberFormatException e) {
[Link]([Link],
"The \"" + getColumnName(col)
+ "\" column accepts only integer values.");
}
} else {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
if (DEBUG) {
[Link]("New value of data:");
printDebugData();
}
}
JScroll
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
public ScrollDemo() {
// Start loading the image icon now.
ImageIcon david = new ImageIcon("images/[Link]");
[Link](JScrollPane.UPPER_LEFT_CORNER,
buttonCorner);
[Link](JScrollPane.LOWER_LEFT_CORNER,
new Corner());
[Link](JScrollPane.UPPER_RIGHT_CORNER,
new Corner());
[Link](new ScrollDemo());
[Link]();
[Link](true);
}
}
import [Link].*;
import [Link].*;
try {
echoSocket = new Socket("localhost", 9999);
out = new PrintWriter([Link](), true);
in = new BufferedReader(new InputStreamReader(
[Link]()));
} catch (UnknownHostException e) {
[Link]("Don't know about host: taranis.");
[Link](1);
} catch (IOException e) {
[Link]("Couldn't get I/O for "
+ "the connection to: taranis.");
[Link](1);
}
[Link]();
[Link]();
[Link]();
[Link]();
}
}
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
public chatClient()
super("Chat Client");
setLayout(new BorderLayout());
[Link](new BorderLayout());
[Link](new ActionListener(){
message = [Link]();
[Link](message);
[Link](" ");
[Link]("North", input);
[Link]("South", b);
add("Center", output);
add("South", p);
[Link](new WindowAdapter(){
[Link](0);
hostname="localhost";
try
[Link]("Connected to Server...\n");
catch(UnknownHostException e)
[Link](e);
catch(IOException e)
[Link](e);
[Link]();
[Link]("Listener started");
try
while(true){
catch(IOException e)
[Link](e);
finally
listener = null;
[Link](" ");
[Link]();
}
}
[Link]();
[Link]();
[Link]();
}
}
import [Link].*;
import [Link].*;
BY Ahmet Tolga Tat Sayfa 211
import [Link].*;
while(true) {
}
public static void main(String[] args) throws IOException
// declare variables
protected Socket s;
this.s = s;
in = new BufferedReader(new InputStreamReader([Link]()));
[Link]("run called");
try
[Link](this);
while(true)
[Link](message);
broadcast(message);
catch(IOException e)
[Link](e);
finally
[Link](this);
try
// tidy up debris!
[Link]();
catch(IOException e)
[Link](e);
}
BY Ahmet Tolga Tat Sayfa 214
}
[Link]("Broadcast called");
synchronized(handlers)
Enumeration e = [Link]();
while ([Link]())
try {
synchronized([Link])
[Link](message);
}catch(Exception ex)
{
[Link](ex);
c = null;
} // end broadcast
} // ends class
finally {
if (connection != null ) [Link]();
}
}
}
InetAddress örnegi:
import [Link];
import [Link];
import [Link].*;
class SimpleDNS {
[Link]
import [Link].*;
import [Link].*;
// read arguments
if([Link] == 2) {
server = args[0];
try {
port = [Link](args[1]);
}
catch (Exception e) {
[Link]("server port = 1500 (default)");
port = 1500;
}
}
// connect to server
try {
socket = new Socket(server, port);
[Link]("Connected with server " +
[Link]() +
":" + [Link]());
}
catch (UnknownHostException e) {
[Link](e);
[Link](ERROR);
}
catch (IOException e) {
[Link](e);
[Link](ERROR);
}
try {
input = new BufferedReader(new InputStreamReader([Link]));
output = new PrintWriter([Link](),true);
try {
[Link]();
}
catch (IOException e) {
[Link](e);
}
[Link]
import [Link].*;
import [Link].*;
int port;
ServerSocket server_socket;
BufferedReader input;
try {
port = [Link](args[0]);
}
catch (Exception e) {
[Link]("port = 1500 (default)");
port = 1500;
}
try {
catch (IOException e) {
[Link](e);
}
}
}
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 [Link] bir Sorgulama Script dilidir ve bir
programlama dili degildir.
Veritabani
Java Programi JDBC Köprüsü (Database)
Örnek:
Asagidaki program sayesinde herhangi bir databak ile baglanti kurabilirsiniz.
import [Link];
import [Link].*;
class jdbcquery
{
public static void main (String args[])
{
try
{
[Link]("[Link]");
Connection connection =
[Link]
("jdbc:odbc:test", "isim", "sifre");
Statement statement =
[Link]();
BY Ahmet Tolga Tat Sayfa 221
dbout(statement);
[Link]
("--- Baska bir deger girin---");
[Link]("INSERT INTO adresler VALUES ('Hakan Sükür', 'Inter
Cikmaz sokak',0999988999");
dbout(statement);
[Link]
("--- silme");
[Link]("DELETE FROM adresler WHERE TelNr=8764553");
dbout(statement);
[Link]();
[Link]();
} catch([Link] e)
{
[Link]
("JDBC-ODBC-sürücüsü bulunamadi");
} catch([Link] e)
{
[Link]
("Databank sorusturmada hata olustu");
}
}
while ([Link]())
{
String Name = [Link]("Isim");
String Strasse = [Link]("Cadde");
int TelNr = [Link]("TelNr");
[Link]();
}
}
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
import [Link].*;
public VLookup1() {
[Link]().addDocumentListener(new SearchL());
[Link](null);
[Link](new Rectangle(100,100,150,25));
[Link](new Rectangle(100,170,50,25));
[Link](new Rectangle(100,200,300,200));
[Link](new Rectangle(100,130,150,25));
[Link](new Rectangle(100,150,150,25));
[Link]("Aranan Soyad:\n");
[Link](lb1,null);
[Link](searchFor,null);
[Link](completion,null);
[Link](results,null);
[Link](tf1,null);
setSize(600,500);
setVisible(true);
setContentPane(panel);
try {
[Link]("[Link]");
try {
r = [Link]("SELECT FIRST, LAST, EMAIL FROM people "
+[Link]());
if([Link]())
[Link](
[Link]("last"));
r = [Link]("SELECT FIRST, LAST, EMAIL FROM people "
+[Link]());
catch(Exception e) {
[Link]([Link]() + "\n");
[Link]([Link]());
return;
}
[Link]("");
try {
while([Link]()) {
[Link]([Link]("Last") + ", "+ [Link]("fIRST") +": " +
[Link]("EMAIL") + "\n");
}
}
catch(Exception e) {
[Link]([Link]());
}
}
}
}
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.
Corba arayüzü olusturmak icin ise [Link] olarak kayt ettiginiz Corba programi
//
//
// StockMarketServer
//
import [Link].*;
import SimpleStocks.*;
//
//
// StockMarketServer Main
//
//
import [Link].*;
import [Link].*;
import SimpleStocks.*;
boa.impl_is_ready();
}
catch( Exception e )
{
[Link]();
}
}
}
[Link]
[Link] in Java
[Link]
[Link]://[Link]
[Link]://[Link]
[Link]://[Link]
[Link]://[Link]
[Link]://[Link]
J J J -------------------Bitti------------------J
------------------------J J J J ---------------------------