You are on page 1of 230

JAVA

ile programlama

Beta
Version 4.0

BY Ahmet Tolga Tat

Sayfa 1

Aciklama
Bu dkmanlarin hazirlanis amaci Java grenmek isteyenlere yardimci olmak icindir.Bu dkmanlar tek basina kaynak olarak kullanilamaz.Kitap icersinde bir cok yazim hatasi vardir ve kitap hic bir ticari amac icin kullanilamaz. Zamanim oldukca JDBC,Corba,RMI,XML JSP ve EJB konularina daha cok dkman hazirlayacagim.Kitap icersindeki hatalar icin bana mail atabilirsiniz. E-Mail:webmaster@turksoft.8m.com

Icindekiler
Javayi taniyalim............................................................................................................................5
Java nedir? .....................................................................................................................................................................................5 zellikler .......................................................................................................................................................................................5 Gelitirme & Uygulama ..............................................................................................................................................................9 Java Virtual Machine (JVM)....................................................................................................................................................11 JDK Kurulumu ...........................................................................................................................................................................12

Javaya giris .................................................................................................................................15


lk Java uygulamamiz................................................................................................................................................................15 Javada girdi ve Cikti islemleri(I/O).......................................................................................................................................20 Javanin temel yapisi.................................................................................................................................................................22

Degiskenler ve Trler..................................................................................................................24
Tamsayilar...................................................................................................................................................................................24 Karakterler(Characters).............................................................................................................................................................25 Virgll sayilar(floating points)..............................................................................................................................................25 Mantiksal degerler(booleans)...................................................................................................................................................26 Strings islemleri..........................................................................................................................................................................26 String Manipulasyonu...............................................................................................................................................................29 StringBuffer Nesnesi.................................................................................................................................................................30 Deikenlerin lk Deerleri......................................................................................................................................................31 Diziler(Arrays)............................................................................................................................................................................32

Javada operatrler .....................................................................................................................34


Artrma ve Eksiltme ...................................................................................................................................................................34 Karlatrmalar ..........................................................................................................................................................................34 Deer Atamalar..........................................................................................................................................................................35 Operatr ncelik tablosu...........................................................................................................................................................35 zel Karakterler .........................................................................................................................................................................35

Javada kontrol ............................................................................................................................37


If,else kaliplari............................................................................................................................................................................37 Koul kalibi.................................................................................................................................................................................38 Switch kalibi...............................................................................................................................................................................38 Break ve Continue komutlar ..................................................................................................................................................42 Dng kaliplari...........................................................................................................................................................................45 for dngleri................................................................................................................................................................................45 while dngleri ...........................................................................................................................................................................47 do-while dngleri .....................................................................................................................................................................48

Nesneye ynelik ............................................................................................................................51 BY Ahmet Tolga Tat Sayfa 2

Class(sinif) nedir? ......................................................................................................................................................................51 Snf Olusturma ..........................................................................................................................................................................52 Snf Tanmlanmas....................................................................................................................................................................53 ye degiskenlerinin tanimlanmasi..........................................................................................................................................56 Method Tanimlanmalari............................................................................................................................................................58 Kalitim Nedir? ............................................................................................................................................................................64 Methodlar Yenilendirmek.......................................................................................................................................................66 Nesne(Object) Nedir ve Ne ise yarar? ....................................................................................................................................67 Mesajlar .......................................................................................................................................................................................68 Javada p toplama(Garbaje Collection)..............................................................................................................................69 Javada alt sinif ve miras(Inheritance)....................................................................................................................................69 Javada ne geme ve airi ykleme ......................................................................................................................................71 This & Super...............................................................................................................................................................................71 Tanimsiz siniflar(Abstract Classes)........................................................................................................................................72 Javada ulaim kontrol ............................................................................................................................................................74 Static degiskenler ve Metodlar.................................................................................................................................................75 Javada paketler(Packages) ......................................................................................................................................................75 Arayzler(Interfaces).................................................................................................................................................................77 Exceptions...................................................................................................................................................................................77 Javada 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 Arayz) ..........................................................................................................................92

Java Utilities.................................................................................................................................95
Vector Class'i ve Enumeration zelligi .................................................................................................................................95 Stack Class'i ................................................................................................................................................................................99 Hashtable Class'i ..................................................................................................................................................................... 102 Properties Classi..................................................................................................................................................................... 105 Random Class'i ........................................................................................................................................................................ 105 Bit Islemleri ve Bitwise Islemcileri...................................................................................................................................... 106 BitSet Class'i ............................................................................................................................................................................ 110

Exception Handling ...................................................................................................................113


Javada hata yakalamanin temelleri..................................................................................................................................... 113 Exception cesitleri................................................................................................................................................................... 114 Exception handlingdeki blok tanimlari ............................................................................................................................. 115 Yeni Exception siniflari yapma ............................................................................................................................................ 118

Java Metodlari ...........................................................................................................................121


Java 'da Program Modulleri................................................................................................................................................... 121 Metodlar.................................................................................................................................................................................... 122 Rastgele Sayi Tretme ........................................................................................................................................................... 124 Recursion ve Iterasyon........................................................................................................................................................... 127 Method Overloading............................................................................................................................................................... 127 Applet Siniflarinin Metodlari ................................................................................................................................................ 128

Java Lang ...................................................................................................................................129


java.lang.Math ......................................................................................................................................................................... 129 java.lang.Character ................................................................................................................................................................. 130 java.lang.Integer...................................................................................................................................................................... 131 java.lang.Float.......................................................................................................................................................................... 132 java.lang.String........................................................................................................................................................................ 133 java.lang.StringBuffer ............................................................................................................................................................ 135

Java AWT ...................................................................................................................................137


Frame ......................................................................................................................................................................................... 137 Panel.......................................................................................................................................................................................... 138 Dzenleme 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(kmeler)........................................................................................................................................................................ 143 Button........................................................................................................................................................................................ 143 Checkbox.................................................................................................................................................................................. 145 Radio Buttons.......................................................................................................................................................................... 146 Menuler ................................................................................................................................................................................... 147 Choice menus........................................................................................................................................................................... 147 Text Fields................................................................................................................................................................................ 150

Java Applet.................................................................................................................................162
Java Applet Temelleri ............................................................................................................................................................ 162 Multimedia ............................................................................................................................................................................... 164 Audio Kullanm Metotlar.................................................................................................................................................... 165 ift Grafik Tamponlama........................................................................................................................................................ 169 Ses Paralar Ykleme ve alma ......................................................................................................................................... 176 Imge Haritalar......................................................................................................................................................................... 177

Java Swing ..................................................................................................................................179


JFrame ....................................................................................................................................................................................... 179 Look and Feel .......................................................................................................................................................................... 182 JLabel........................................................................................................................................................................................ 182 JButton...................................................................................................................................................................................... 183 JPanel ........................................................................................................................................................................................ 185 Internal Frames ........................................................................................................................................................................ 187 JToolBar ................................................................................................................................................................................... 187 JLists.......................................................................................................................................................................................... 188 JTree .......................................................................................................................................................................................... 191 Alert Dialogs (JOptionPane)................................................................................................................................................. 193 JPassword ................................................................................................................................................................................. 199 JComboBox.............................................................................................................................................................................. 200 JTable ........................................................................................................................................................................................ 201 JScroll........................................................................................................................................................................................ 204

Networking .................................................................................................................................206
Socket programlama ............................................................................................................................................................... 206

JDBC...........................................................................................................................................221
JDBC nedir? ............................................................................................................................................................................. 221

Corba ..........................................................................................................................................226
Corba nedir? ............................................................................................................................................................................. 226

Kaynakca ....................................................................................................................................230

BY Ahmet Tolga Tat

Sayfa 4

Javayi taniyalim
Java nedir?
Java programlama dilini ve onun evresel gelisimini aiklayan bir dizi makale ile baslar.Birinci ama olarak ,dilin tarihi hakkinda yayimlardan, mikrodalgalar ve amasir makinelerinden... uzak duracagim.( Eger aranizda bunlardan herhangi biri ile ilgilenen varsa bunlari oklu ktphanelerden hatta literatrden bulabilir.) Ayni Zamanda kocaman burunlu, gen vcutlu ve ellerini marimba'nin ritmine gre sallayan ,bana eski Amerikan bilim kurgu filmlerini hatirlatan Duke ' tan da (Java'nin maskotu) uzak duracagim. Java fenomeni de zamaninda geici poplerlik tanidi.Her seviyedeki bilgisayar magazini bunun hakk?nda yazd? , Java apletlerini geliitirmek zere rn satan birok yazilim firmasi var ve ok az web sitesi Java apleti iermiyor. Bu seriler aras?nda mmkn oldu?u kadar , aslinda temel isler iin basit fakat ustalikli kullanim iin hayli karisik ve zor olan bu programlama dilini derinlemesine incelemeye ve grenmeye alisacagim. Bu ilk birka makale ile amac?m?z genel olarak dile bir tanimlama saglamak bylece daha sonra apletler,a?- ili?kili planlar, JDBC,vb. gibi konular?n derinine inebiliriz. Sunu belirtmeliyim ki Java genel amali bir dildir,bunu yapmada olduka popler olmasina ragmen sadece web sayfalarina aplet yazmak iin kullanilmak zere yapilmistir.. Java'nin sadece grnsne takilamayz nk java apletlerinden ok daha ilgin bir ok alternatifi vardir.

zellikler
Java Sun Microsystem 1991'de James Gosling, Patrick Naughton, Chis Warth, Ed Frank ve Mike Sherindan tarafindan olusturuldu. 1992 ve 1995 arasinda Bill Joy, Arthur Van Hoff, Jonathan Payne, Frank Yellia, Tim Lindolm ilk prototipin olgunlasmasi zerine isbirligi yaptilar. Tarihler gsteriyorki Java WWW (We Want Womens J)'den nce ya da en azindan onunla eszamanli olusturulmustur . Java'nin yapisi C'ye olduka benzemektedir ve obje agirlikli karakteristikleri de ayni zamanda C++ 'a benzemektedir. Java uygun ve mantik erevesinde birbirini tutan bir programlama dilidir. C ve C++ arasindaki benzerlikler, Java'nin C++ '?n internet iin bir versiyonu oldu?u izlenimini verebilir, fakat nemli teorik ve pratik farkliliklar vardir. Java zellikle C++ ile karsilastirilan obje kkenli parametreleri dzeltir 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 tad fonksiyonellii, gc aynen tar fakat bunun yannda karmak bir yapya sahip deildir. Temel olarak son derece basit bir yaps vardr. BY Ahmet Tolga Tat Sayfa 5

Gnmzdeki C ve C++ dilleri temel alnarak dizayn edilen Java dili kolay ve hzl renilebilen ve kullanabilen bir programlama dilidir. Java dili objesel bir dildir, fakat C++ gibi dier objesel diller deki baz hata veya gereksizliklerden arnmtr. Dilin spesifikasyonu son derece kk tutulmu ve programcya kolaylklar salanmtr. Ve rnein Garabage Collection gibi ok yararl yeni zelliklerde eklemitir. Mesela C veya C++ daki karmak pointer kavram, gereksiz bir deiken olan struct, typedef, # dejine ve hafzay temizleme mant uygulanmamtr. Bunlarda zaten neredeyse programclkta olan buglarn yzde ellisinden kurtulmak demektir.

Nesneye Ynelik
Java dili C++ daki temel nesne yapsn korumaktadr hatta buna baz yenilikler getirmitir. Hatta basitlik kavram iin baz zelliklerde kaldrlmtr. Java dilinde veriler ve deikenler dahil her eye nesne olarak yaklalr.

Datk
Internet ve a ann bir art olarak Java dilinin kendi TCP/IP yetenekleri ve hazr fonksiyonlar vardr. Gnmzn popler protokolleri HTTP ve FTP rutinleri bile Javann ktphanelerinde hazrdr. Bunlarda bize a stnden bilgiye ularken sanki lokal bir dosyaya eriircesine rahat kodlama yapmamz salar.Javanin dagitik programlanmasi sayesinde Client/Server programlari gelistirilebilir.

Dzgn
Java dili gerek derleme gerekse de altrma srasnda bir ok hatay kontrol eder. Deiken tiplerini kontrol etme, hafzann temizlenmesi (Garbage Collection), Null Pointer ve Array (Dizi) uzunluu kontrol ve de Exceptions gibi.

Platform Bamsz
Yine Java dilini a yaplarnn vazgeilmez bir paras yapmak iin; Java derleyici programnz derledii zaman kaynak kodumuzu, yapdan bamsz nesnesel bir dosya formatna evirir. Buna Java bytecodes diyoruz. Java Runtime sistemini bulunduran makineler bu bytecodelar altrabilir. u an gnmzde bir ok sistem iin Java Runtime Environment (JRE) bulunmaktadr. Mimari-bamsz: Java programlar derlendikleri zaman byte-kod oluturduklar iin, Java'y destekleyen tm platformlarda alabilmektedirler. Bir Java programnn yeni bir makinaya tandnda tekrardan derlenmesine gerek yoktur. Java dili tm bilgisayar sistemlerinde ayndr. rnein basit veri tipleri adn verdiimiz integer bir say her zaman 32 bit, long ise 64 bit olarak gsterilmektedir. Dier dillerde ise bu durum byle deildir, derleyiciden derleyiciye bu veri tiplerinin gsterimi deiiktir. zetle Java kaynak kod derlenince bytecodelar oluur. Bytecodelar sanal bir makine olan Java Virtual Machinede (JVM) alt varsaylr ve ilemde makineye baml bir alma an hata ayklaycs yani bir tercmanla olur. Bu JVM mantyla hareket eden programa Java Interpreter diyoruz. JVM, yazlm ile gerek bir makinede emle edilen sanal bir makinedir. Bu sanal makine iin kullanlan kodlar ite .class dosyalarnda duran bytecodelardr. Her yazlan Java kaynak kodu derlenirken ite bu ortak sanal makine iin derlenir. Bu makinenin belirli komut setleri (tpk BY Ahmet Tolga Tat Sayfa 6

gerek bir CPUnun olduu gibi) hafza alanlar, stacki vardr. te bu mantk Javann platform bamszl yaratr. Ve ite hangi gerek makinede bir yazlm ile sanal bir JVM yaratlrsa o makinede Java ile yazlm program alabilir.

Gvenli
Java dili Pointerlarn kullancdan kullanmn almak, hafza adreslemeyi sadece altrma srasnda yapmak gibi kavramlarla gvenlii gelitirmitir. Bunun yan sra Java Interpreter da JVM kodlarnn yklenmesi ve yoklanmas srasnda ok eitli gvenlik unsurlar barndrmaktadr. Java Interpretern (tercman) ana grevi vardr. Kodu yklemek Kodu kontrol etmek Kodu altrmak

Kodu ykleme aamasn Class Loader yani snf ykleyici halleder. Bu aamada programn almas iin gerekli tm classlar (snflar) arlmaya balanr, fakat mutlaka yerel olarak m yoksa uzak utan yani a kaynaklarndan m aldn tutar. Buda ok nemli bir problem olan Truva At uygulamalarn nn keser nk her zaman nce lokal ykl ve hazr classlar ek edilir.Hafzada yer seimi Interpreter tarafndan yapld iin iletim sistemine kayma gibi sorunlar ortadan kalkar. Ayrca kodun kontrol srasnda Interpreter bir ok hatay kontrol eder. Genel olarak bytecodelarn JVM iin uygun olup olmadn kontrol eder.

Tanabilir
Temel tanabilirlik olan platform bamszl, tema olarak makinelerin ileyi tarz ve donanmnn farkl olduu ortamlarda da ayn kodu altrabilmektir. Fakat ek unsurlarda sz konusudur, her ayn ortam iin tm kavramlar ayndr. Hepsinde Int (integer) kavram ve boyutu ayndr. Hepsinde grafiksel kullanc arabirimi iin Javann kendi grafiksel arabirim kiti kullanlmaktadr. Bunun ad Abstract Windowing Toolkit (AWT)dir.

Performans
te belki de Java dilinin zorland tek nokta. Performans denince tabii ki sre kavram n plana kyor yani Java derleyicisinin ve Java Interpreterin hz. Derleyicinin zellikle C++a gre biraz daha yava olduu kesin fakat daha fazla grevi olduunu ve ek avantajlar getirdii iin kabul edilebilir. Java Interpreter ise yani esasnda bunu Java programlarnn alma hz eklinde de yorumlayabiliriz; C++a gre ilk zamanlar da baya yavat. Zaten bu beklenen bir olayd nk C ile yazlm program direkt CPU da almaya balarken, nce Java Interpreter yani tercman kendi alyor daha sonrada ald her kodu tercme edip CPUda gerekli ilemi yapyor. Fakat Java Interpreterinin son srm ilk versiyonundan yzde elli daha hzldr, bu da demektir ki Javay hzlandrma almalar devam ediyor. Hz iin bir zm de Java Runtime Compiler, yani Java kaynak kodumuzu derlediinizde onu bytecodea deil de direkt makine koduna eviriyor. Ama tabii byle bir seimde platform bamszlndan vazgemi bulunuyorsunuz. BY Ahmet Tolga Tat Sayfa 7

Kk
Bir programlama dili olarak Java dierlerine kyasla olduka kktr. 4 MBlk RAM'e sahip tm sistemlerde almaktadr. Java yorumlaycs 500-600 KBlk yer kaplamaktadr.

Salam
PClerde alan herkes, durup dururken sistemin nedensiz bir ekilde gtne ahit olmular ve bu yzden emek verilen bir sr almann boa gittiini grm lerdir. Java sistemi, bellee her eriim esnasnda bellein bu blgesini kontrol eder ve geerli bellek alan olup olmadn kontrol eder. Java programlarnda 'bug' lar olusa bile 'exception handler' larla problemin nerede olduunu bildirir dzeltmeye alr. Java bellekin yalnz kendisine izin verilen alannda alabilir.

Hizli!
Java programlama dili C'den daha yava bir dildir.Fakat Just- in-Time(JIT) Compiler sayesinde java C/C++ gibi dillerle es degerdedir. Bu derleyici ile Java artk yorumlanan bir dilin yavaln brakp al lagelmi derlenen dillerin hzna kavumas beklenmektedir.
Java C++ C Assembler Makine Dili(0ve1)

Hizlilik bakimindan bakildiginda Java en stte yani en yavas olan dillerden bir tanesidir.

Multi Threaded(Paralel kullanim)


Byk Ana programn alt paracklar olan ve ondan bamsz hareket eden ocuk programcklara thread diyoruz. Bunun destekleyen dile de Multi Threaded diyoruz. Java bu zellii desteklemesinin yan sra C ve C++a gre threadler ok daha dzgn, sade ve temiz bir yapya sahiptirler. Sonuta threadlerin kullanld bir program, ayn anda birden fazla aktiviteye izin verir. Mesel neredeyse tm chat (sohbet) programlar multi threadeddr. nk arkadanzdan mesaj gelirken sizi yaz yazabilirsiniz. Fakat unutmamak lazm bu zellik iletim sisteminize de baldr.

BY Ahmet Tolga Tat

Sayfa 8

Tek-kaltl
Java, tek-kaltl (single inheritence) snf yaplarn destekler. Baz diller oklu-kalt snflarn desteklemektedir, ancak bu yazlan programlarn ok karmak ve zlmesi zor olmalarna neden olmaktadr. Ayn zamanda arayzleri (interface) desteklemektedir. Bunlara abstract snf ad verilmektedir. Bu tip snflar, programclara, metotlarn nasl uygulanacann sonradan belirlenecei snflar yaratlmasna izin verir. Bir snf, birden fazla arayz oluturabilmektedir. Bylelikle gerek oklu-kalt ortamlar kolaylkla salanm olmaktadr.

Byte-Coded
Byte-kodlar dier makinalarn komut setlerine benzerler, yalnz tek bir makinaya tabi deildirler ve ilerinde kendi veri tiplerini onaylayan ek tip bilgilerini ierirler. Java uyumlu web tarayclar dier ortamlarda yaratlan form/grafik/resim gibi objelere nasl grrlerse, Java appletlerinide ayn ekilde grrler. Java byte-kodlarndan oluan byte-kodlar taraycnn kaynak kodu iine gmlrler. Bu aamadan sonra ilk nce onaylanrlar, sonra da altrlrlar.

Dinamik
Java dili nesne teknolojisinden elden geldiince yararlanr bu yzden derleme srasnda programmzda kullandmz modller onunla birlemeyecektir. Sadece alma srasnda dardan arlacaktr. Bu sayede yeni veya gelitirilen temel ktphanelere programmz hemen adapte olacaktr. Bu temel ktphanelere yani classlara API (Application Programming Interface) paketleri diyoruz. Bu dinamikliin bir yn de alma s rasnda dardan ihtiya duyduumuz bir paray hi zorlamadan a stnden alabilmedir.

Java ve Web
Bilindii gibi Web sayfalar ne kadar canl gzkrlerse gzksnler, ses veya animasyonlarda olsa sonu olarak aktif yani alan bir yapya sahip deildirler. te Javann zellikle Web iin tasarlanan Applet yaps buna bir alternatiftir. Bir web sayfas stnde bulunan ve tarayc tarafndan altrlp interaktif olan Java programlarna Applet diyoruz.

Gelitirme & Uygulama


Sun tarafndan gelitirilen ve Javann derlenmesini ve gelitirmesini salayan programlar grubuna veya ortamna JDK (Java Development Kit) denir. Bugn Sun d ndaki firmalar tarafndan retilen dier grafiksel derleyiciler bile en alt planda bu temel derleyiciyi kullanr. JDK text tabanl komutlar grubudur. Genelde JDKnn versiyonu Javann yani dilin kendisinin gelimiliini gsterir. lk zamanlarda JDK 1.0.x ler vard. Fakat 1.0 dnemi ok srmedi hemen sonra JDK 1.1.x ler kt. Bugn Javann yani JDKnn en son resmi srm JDK 1.1.6dr. Ama BY Ahmet Tolga Tat Sayfa 9

u anda JDK 1.2 beta 4 bile Sunn sitesinde bulunmaktadr. Btn bu sre Javaya verilen nemi gstermektedir. Sonu itibaryla Java ile yazlm programlar iki grupta toplayabiliriz. Bir yalnz bana alabilen uygulamalar.(Applicatons). Fakat bunlar iin biliyorsunuz ki mutlaka bir Java ortam bulunmak zorunda. te bu ortama JRE (JavaRuntime Environment) diyoruz. Esasnda JDK bulunan her makinede Java programlar alabilir. Ama JRE, JDKya gre daha kk ve ha fiftir ve kullanc amal makinelere sadece onu yklemek yeterli olacaktr. Her yeni JDK versiyonu ktnda onun birde ayn JRE versiyonu kmaktadr. kinci tip Java uygulamalar ise web sayfas zerinde alan Appletlerdir. Appletlerin alabilmesi iin arldklar taraycnn mutlaka Java destei olmak zorundadr. Hem kendi Javada yazlan hem de Applet kavramn anlatabilmek iin zorunlu olarak Sun tarafndan retilen Java destekleyen tarayc HotJavadr. Bugn son kullanc iin pek popler olmayan HotJava gelitiriciler iin nemlidir. nk ayn firma tarafndan yazld iin Javann son versiyonlarna ilk uyum salayan taraycdr.

Java ortaminin gelistirilmesi


Daha nce belirtildigi gibi gelisme aralari /bin dizininde yeralir : javac :Java kaynaklarini baytkodlarina eviren java derleyicisi. java :Java yorumlayicisi . Java baytkodlarini alistirir. jre : Java'ya benzer baska bir yorumlayici ,fakat kullanicilar iin oldugu dsnlmesine ragmen tm seeneklerin kullanilir olmasi istenmemektedir. appletviewer: apletleri test eder vealistirir. jdb: hata dzeltici javap: Java da derlenen baytkod dosyalarinin ayiricisi. javadoc : dkmantasyon jeneratr , genel ve korunmus siniflari, arayzleri , yapilari, methodlari ve alanlari tanimlayan HTML sayfalarini yarat?r.Ayni zamanda sinif hiyearasisini ve yelerin iinde bulundugu indeksi yapar. javah : Java programlarinin bilinen metodlarina eklenen ara ( C de ) jar: Java siniflarini ve kaynaklarini bir Jar arsiv dosyasinda saklar . javakey : Dijital imzalari koruyan ara. updateAWT : bir basvurudaki AWT1.02 metodu ile degistirilen isimleri gncellestirir. 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? iindeki Path degi?kenini kar??t?r?n.

Karakteristikler
Devam etmeden nce , kendimize Java nedir sorusunu sormamiz gerekir. Cevaplamak iin JDK'nin elkitabinda yazdigi gibi Java'n?n bir programlama dili ve ayni zamanda bir platform oldugunu gznnde bulundururuz. Bir programlama dili olarak Java asagidaki karakteristiklerle beraber yksek seviyeli bir dildir. (ayni noktada onlari detayli olarak inceleyebiliriz ): Dikkatimizi eken ilk sey Java'nin yorumlanmsi olmasidir.Java kaynaklarinin bir objeyi baytkodlar olarak yapmasi iin bir nceki daha dsk seviyede ki derleyiciye ihtiyaci olmasina ragmen , degisik platformlarda yorumlanabilir . BY Ahmet Tolga Tat Sayfa 10

" Birkez yazip herzaman alistirabildigimiz " Java baytkodlarina tesekkr ederiz. Java programlarini bir platformda derleyebilir ve JVM (Java Virtual Machine ) aracini ieren tamamen farkl? ba?ka bir yap?da al??t?rabiliriz. rne?in bir Java program? Windows NT platformunda derlenebilir ve bir Sun Ultra Solaris 'de veya bir Linux platformunda sorun olmadan alisabilir . Genel olarak bir platform uygulamanin alistigi bir donanim/yazilim ortamidir . Bununla beraber Java iin bir platform alistigi bir yazilim ortamidir . Her Java platformu bir donanim ortaminda alismak zorundadir. Bir Java platformunun iki blm vardir :

Java Virtual Machine (JVM)


JVM , Java ncelikli derlenen programlarin alistirildigi aik bir bilgisayardir.Kk ve basit olarak dizayn edilmistir nk d?nlen onu her yere indirmektir . Bu basitlik onu tm varolan platformlara ta??may? mmkn kiliyor , bylece hepsine ortak bir yazil?m sa?l?yor ve her kar???k a? sisteminde ( Internet gibi ) byk lde tasinabilirlik sorununu ortadan kaldirir.Hayal edilebildi?i gibi bu, durdurulamayan teknoloji iin yaklasik bir nedendir. Bununla beraber sanal makine bir yaz?l?m tabakas? olarak grlmemelidir, fakat isminin belirtti?i gibi, bu dolu bir bilgisayar sistemi olmaya alisiyor,yavas yavas gerek Java makinelerini , kredi kartlari ,TV dekoderlerini ve benzerlerini destekleyen Java iplerini marketlerde gryoruz .

Uygulamali Program Arayz (API)


API (Application Programmer's Interface), ksaca Uygulama Programcsnn (siz) kullanaca btn function'lar (ilevleri) ierir. Java'nin API 'si grafiker kullanici arayz (GUI ) gibi zellikleri destekleyen genis bir yazilim bile?enleri koleksiyonudur . Bunlar ktphanelerde gruplandirilmistir. ( Java terminolojisini kullanan Java paketleri ).Bu paketler sayesinde ok bilinen web Apletlerinin yanisira, Java'yi daha birok uygulamada kullanmak mmkndr.Web serverlarini dizayn etmek mmkndr, rnegin, vekiller, ileti serverlari, IRC serverlari, ve internet ile ilgili hayal edilebilecek herhangi birseyler...(JSPler gibi) API:paketlerini degisken gruplar ierisinde siniflandirabiliriz : Temel: objeler, matrisler, sayilar, girdi ve ikti , bilgi yapilari, sistemin zellikleri, tarih, zaman,vb. Appletler :Fonksiyon seti ve Java apleti yapmak iin kullan?lan zellikler. Ag alismasi:URL'ler, TCP, UDP, soketler, IP adresleme. Uluslararasilastirma : yerel tanimlamalara kolayca adapte olabilen kodlar yazmaya yardim eder ve yerel dilde grntle nir. Gvenlik:dsk ve yksek seviye,dijital imzayi ierir, genel ve zel anahtarlar,kontrol ve sertifikaya giris. Yazilim Blmleri: JavaBeans olarak bilinir. Veritabanlari: ok sayida iliskili veritabanina girisi saglar . Ve daha neler neler.......J BY Ahmet Tolga Tat Sayfa 11

Bu ,Java programlama dilini ve onun evresel gelisimini aiklayan bir dizi makale ile baslar.Birinci ama olarak ,dilin tarihi hakkinda yayimlardan, mikrodalgalar ve amasir makinelerinden... uzak duracagim.( Eger aranizda bunlardan herhangi biri ile ilgilenen varsa bunlar? oklu ktphanelerden hatta literatrden bulabilir.) Ayni Zamanda kocaman burunlu, gen vcutlu ve ellerini marimba'nin ritmine gre sallayan ,bana eski Amerikan bilim kurgu filmlerini hatirlatan Duke ' tan da (Java'nin maskotu) uzak duracagim. Java fenomeni de zaman?nda geici poplerlik tasidi.Her seviyedeki bilgisayar magazini bunun hakk?nda yazd? ,Java apletlerini geli?tirmek zere rn satan birok yaz?l?m firmas? var ve ok az web sitesi Java apleti iermiyor. Bu seriler arassnda mmkn oldugu kadar , aslinda temel isler iin basit fakat ustal?kl? kullan?m iin hayli karisik ve zor olan bu programlama dilini derinlemesine incelemeye ve grenmeye alisacagim. Bu ilk birka makale ile amacimiz genel olarak dile bir tanimlama saglamak bylece daha sonra apletler,a?- iliskili planlar, JDBC, vb. gibi konularin derinine inebiliriz. sunu belirtmeliyim ki Java genel amali bir dildir,bunu yapmada olduka popler olmasina ragmen sadece web sayfalarina aplet yazmak iin kullan? lmak zere yapilmistir. Java'nin sadece grnsne takilamayiz nk java apletlerinden ok daha ilgin bir ok alternatifi vardir. Cnk Java Appletler Javanin %5ni olusturur.

JDK Kurulumu
JDK nedir?
Java ile gelitirme (development) yapmak iin Java Development Kit'e (JDK) ihtiyacnz var. Bu paket Java ile gelistirme yapmak iin btn aralar ieriyor.. Bu tool'lara editor (dzenleyici) dahil deil. Piyasada bir ok GUI Java Editor' var. Bunlar genelde cretli. Ayrca olduka gl bir makinede bile olduka ar alrlar. Programn nasl altna zaman harcayp kafa patlatmanz gerekir; stelik, en nemlisi, kodun iine kendiliinden bir sr kod eklerler, bu da yazdnz kodu anlamamanza yol aar. Bence bu gibi aralar Java'ya yeni balam olanlar iin uygun deil .Bana 'hangi Java editor'u tavsiye edersin' diye sorarsanz,size aslnda gelimi bir text editor (metin dzenleyici) olan, fakat Java dahil bir ok dilde programlama yapmanzda kolaylk salayan EditPlus'u tavsiye ederim.

JRE nedir?
JRE (Java Runtime Enviroment) Java Virtual Machine, Java Platform ekirdek class'larn ve destekleyici dosyalar gibi paketleri ierir. Yani development yapmak iin gerekli olan derleyici (compiler), debugger gibi paketleri iermez. JRE zaten JDK'nn iinde vardr.Dolaysyla, JRE'yi indirmeniz GEREKMEZ. Byle bir paketin oluturulmasnn nedeni ise basit: Yazdnz ve derlediiniz (compile) Java class'larn herhangi baka bir makinede altrmak iin bu pakete ihtiyacnz olabilir.

1- Dosyalar Birletir.

BY Ahmet Tolga Tat

Sayfa 12

Eer dosyalar 1.44 MB'lk 15 dosya olarak indirdiyesniz, ncelikle dosyalar birletirmeniz gerekiyor. Eer tek bir dosya halinde indirdiyseniz 2. blme geiniz. Download ettiiniz dosyalarn isimleri:

jdk1_2_2-win-a.exe jdk1_2_2-win-b.exe jdk1_2_2-win-c.exe jdk1_2_2-win-d.exe jdk1_2_2-win-e.exe jdk1_2_2-win- f.exe jdk1_2_2-win- g.exe jdk1_2_2-win- h.exe jdk1_2_2-win- i.exe jdk1_2_2-win-j.exe jdk1_2_2-win-k.exe jdk1_2_2-win- l.exe jdk1_2_2-win- m.exe jdk1_2_2-win- n.exe jdk1_2_2-win-o.exe olmal. Daha sonra jdk.bat' dowload edip yukardaki dosyalar ile ayn klasre kopyalayp stne ift tklayn.Bylece tek, btn bir dosya olumu oldu. Bunda sonra 2. blme geebilirsiniz.

2 -Kuruluma bala
Kuruluma, aynen dier Windows uygulamalarnda olduu gibi, jdk1_2_2-win.exe adl dosyaya ift tklayarak balyoruz. lk gelen ekranda Next'e, daha sonraki ekranda ise Yes'e tklyoruz. Daha sonra gelen ekranda kurulum yapacamz klasr girmemizi istiyor. Bu deeri deitirebilirsiniz fakat daha ileride anlatacam baz ilemleri yapmada zorluklar yaayabilirsiniz, normali olan c:\jdk1.2.2 kalmas daha uygundur. Daha sonra gelen ekranda tm seenekleri setikten sonra Next'e tklay Bylece kurulum balam oldu. Birok dosyay kopyaladktan sonra JRE kurulumu iin tekrar bir ekran gelecek burada da Yes'e tklayn. Daha sonra gelen ekranda dizini yine normalinde brakp Next'e tklayn.Finish'e tklayn. 3 - PATH ve CLASSPATH deikenlerini ayarla Bunlar CLASSPATH ve PATH adn verdiimiz ortam deikenleridir. PATH bildiimiz alan dosyalar arama listesidir. Yazdmz Java komutlarnn herhangi bir yerde almas iin bulunduklar yerleri PATH olarak gsterilmesi lazmdr. CLASSPATH ise derleme srasnda gerekecek temel ktphanelerin, classlarn yani APIlerin bulunduu yeri gsterir. Autoexec.bat dosyasndaki u iki satr hereyi halledicektir. Bylece dosya kopyalama ilemi tamamlanm oldu. imdi bize baz kolaylklar salamas iin makinenizin evre deikenlerinde baz deiiklikler yapacaz. Bu ksmda olduka dikkatli olmak gerekiyor. nce sistem editrn (system editor) altryoruz. Start ondan sonra Run'a tklayp, gelen alana sysedit yazn, Enter'a basn. inde bir ok pencere olan System editor alm oldu. BY Ahmet Tolga Tat

Sayfa 13

Bu pencerelerden AUTOEXEC.BAT yazl olan sein. PATH ile balayan satr bulun. Bu satrn en sonuna ;C:\JDK1.2.2\BIN deerini ekleyin. rnek: PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\JDK1.2.2\BIN Not: Eer Windows 98 kullanyorsanz, PATH ile balayan satr olmayabilir. Bu durumda en alta aadaki satr ekleyin. PATH C:\JDK1.2.2\BIN Daha sonra ise en alta aadaki satr ekleyin SET CLASSPATH = .;c:\java Daha sonra File'dan Save'e tklayp System editor' kapatn. (NOT: Sistem editrnde baka herhangi bir deerle oynamak sistemin bir daha almamasna neden olabilir. PATH deikenini aktif hale getirmek iin Start | Run'a tklayp gelen alana c:\autoexec.bat yazp Enter'a basn. Bir DOS Pencresi alacak gerekli ilemleri yapacak. Yaptndan emin olmak iin bir DOS penceresi ap(Start | Run a tklayp gelen alana command yazp entera basn) path yazp Enter'a basn. Size path deikeninin deerlerini verecek. Bunlarn arasnda C:\JDK1.2.1\BIN'in olup olmadn ve doru yazlp yazlmadn kontrol edin. Bu ilem bize C:\JDK1.2.1\BIN dizini altndaki programlar(java, javac vb.) hangi dizinde olursak olalm altrabilme olanan erecek. Ayrca CLASSPATH deikeni ise yazacamz programlar altrmamzda yardmc olacak.Bylece kurulum tamamlanm oldu.

BY Ahmet Tolga Tat

Sayfa 14

Javaya giris
(Girelim bakalim...)

lk Java uygulamamiz
Daha nceden de bahsettiimiz gibi Java ile dier dillerde olduu gibi sradan uygulamalarda yazabiliyoruz. Aadaki ksack programn amac, ekrana Merhaba Dunya! karakter dizisini yazdrmaktr.

rnek: //Javaya hosgeldiniz // ilk rnek java uygulamas //Merheba Dunya class MerhebaDunya{ public static void main (String args [ ] ){ System.out.println (Merhaba Dunya); } }

Aklama:
lk u satr yorum (comment) tabir ettiimiz satrlardr.// iareti ile balayan satrlar dikkate alnmaz. Programcnn kendine veya grubuna hatrlatmalardr.Drdnc satr programn adnn verildii satrdr. Programn kendisine de bir nesne gzyle bakld iin oda bir class olarak tanmlanmtr. Programn kaynak kodunu kayt ederken, bu ada .java uzantsn ekleyip kayt etmelisiniz ve ayrca derlendikten sonra bu isim .class isimli Java uygulamas oluacaktr. En sondaki kme paranteziyle programn balad gryoruz. BY Ahmet Tolga Tat Sayfa 15

Beinci satrda Java Interpreternn altraca ilk ve ana metodu gryoruz. Dier dillerde olduu gibi burda da main fonksiyonuna bir dizi karakterler atanacaktr. Bu rnekte komut satrndan argman beklemiyoruz ama eer; Java MerhabaDunya arg1 arg2 gibi komut yazp ana fonksiyona arg1 arg2 gibi karakterler gnderseydik bunlar string (karakterler) dizisi olarak tanmlanm olan arg deikenine atanacaklard.

Public, main fonksiyonunun d kullanclara ak olduu ve buna Java InterPreter da dahil


herkes tarafndan eriebileceimiz belirtilir.

Static, main metodunun sadece bu uygulamaya ait olduu ve bu uygulama nesneye ynelik
tarzda baka bir uygulamaya arldnda deitirilemeyeceini gsterir. Hafzada ne kadar kullanlrsa kullanlsn hep tek kopya tutar.

Void, main metodun ekrana basma ilemi d nda hibir sonu geri dndrmediini gsterir.
Sondaki kme paranteziyle main metodunu balatm bulunuyoruz. System.out.println satiri ani zamanda System.out classindeki yani snfndaki bir metodun yani printlnin nasl kullanldn gsterir. Merheba Dunya yazsn standart ka yani ekrana yazdrr. Sondan bir nceki parantez main metodunu ve en sondakide class Merhaba Dunya yani program kapatr. Uygulamamz sradan bir text editrle yapabiliriz. nemli olan yazdktan sonra onu MerhabaDunya.java olarak kaydetmemizdir. imdi javac komutuyla kaynak kodumuzu derleyebiliriz.

javac MerhebaDunya.java
Eer bu ilem hibir sonu vermezse demek ki her ey sorunsuz ve de artk ayn dizinde MerhabaDunya.class isimli bytecode dosyanz bulunmaktadr. ok genel iki sorun kabilir. Javac komutunu yani dosyasn bulamayabilir ki bu PATH sorunudur. Veya en basit APIleri yani classlar bulamadn bildirir, bu da CLASSPATH sorunudur.

Uygulamamz altrmak iin komut satrna java komutuyla emir vermemiz yeterlidir.

java MerhebaDunya

BY Ahmet Tolga Tat

Sayfa 16

Bu komutta ekrana; Merhaba Dunya karakter dizisini yazdracaktr.

lk Java Appleti
imdiyse bir Web sayfas zerinde alabilecek bir Java program yani bir Applet yaza lm. Aada rnek appletimizi gryorsunuz. /***********Merheba Dunya Java Appleti***************************/

import java.awt.Graphics; import java.applet.Applet; public class MerhebaDunya extends Applet { public void paint (Graphics g) { g.drawString ("Merheba Dunya!",30,50); } }

Birinci satirda program icin aciklama yaziyoruz. BY Ahmet Tolga Tat Sayfa 17

Sonraki iki satrdaki import komutu sizin classnzda dardan kullanlan classlar mesela hazr olan baz APIleri almak veya armak iin kullanlr. rnein import edilen java.awt.Graphics class izim amal kullanlan bir snftr. Ve appletimizle tarayc ekranna yaz yazdrmak iin onu import edip daha sonra onun bir metodunu kullanyoruz. Yine ayn ekilde yeni bir applet yaratrken onun bir ok zelliini daha dorusu applet tarzn zaten hazr olan applet classndan alyoruz. nce ondan trememiz iin onu import ediyoruz. (import java.applet.Applet) Daha sonra da kendi classmz olan MerhabaDunya extends komutuyla applet olarak tretiyoruz. Burada kme paranteziyle appletin kendisi balyor. Dokuzuncu satrda appletin hazr bir fonksiyonu olan paint metoduna rastlyoruz. Bu metod ekran ktsyla ilgili olan ve az nce import ettiimiz Graphics snfnda kullanlan ve de ye diye tabir ettiimiz yani extends ettiimiz (trediimiz) applet classna ait olan temel bir metottur. Metot alrken yazm olayn azaltmak iin Graphics g olarak tanmlanyor.Graphics snfna ait drawString adl metotla ekrana MerhebaDunya! yazdryoruz. nce paint metodunu daha da sonra appletin kendisini parantezlerle kapatyoruz. Uygulamamz bir text editrle yazdktan sonra tpk uygulamalarda olduu gibi onu java uzantl ve classta tanmlanan isimle kaydediyoruz. Burada rneimizi MerhebaDunya.java olarak kayt edelim. Kayt ileminden sonra yine ayn ekilde kaynak kodumuzu derliyoruz.

javac

MerhebaDunya.java

Fakat imdi onu java komutu ile altramayz nk o bir uygulama deil. Bu appletimizi test iin rnek bir web sayfas yani HTML kodu retmemiz lazm. HTML dilinde, ya zdigimiz Java Appletini sayfaya armak iin <applet> komutunu kullanrz. Aada rnek web sayfamz grebiliriz.

<html> <head> <title> Merheba Dnya Appleti</title> </head> <body> <p> ilk java appletim <applet code=MerhebaDunya.class </applet> </body> </html> width=200 height=100>

Yine standart bir text editrle(NotePad gibi) yazdmz bu dosyay test.html olarak kayt edelim. Java destekleyen herhangi bir tarayc ile lokal olarak bu sayfay atmzda appletimizin sayfada altn greceksiniz. <applet> komutunda burada kullandmz code parametresi BY Ahmet Tolga Tat Sayfa 18

arlacak Java Applet classnn adn, width sayfadaki geniliini, height ise sayfadaki yksekliini verir. Yine JDKnn bir arac olan Appletviewer da applet imizi incelemek iin kullanlabilir. Komut satrndan

appletviewer test.html
Komutu verildiinde Appletviewer yukarida grdnz gibi alp web sayfanzn iindeki sadece ama sadece appleti gsterecektir. rnek: //Asagidaki java Appleti oval seklinde "canim Trkiyem" yazar import java.awt.*; import java.applet.*; public class ovalyazi extends Applet { static final String message="Canim Trkiyem!"; private Font font; public void init() { font=new Font("Impact",Font.BOLD,48); } public void paint(Graphics g) { g.setColor(Color.white); g.fillOval(10,10,300,100); g.setColor(Color.blue); g.drawOval(10,10,330,100); g.drawOval(9,9,332,102); g.drawOval(8,8,334,104); g.drawOval(7,7,336,106); //Text kismi g.setColor(Color.blue); g.setFont(font); g.drawString(message,40,75); } }

BY Ahmet Tolga Tat

Sayfa 19

Javada girdi ve Cikti islemleri(I/O)


Cikti islemleri(Input)
System.out akisina print ve println islevlerini kullanarak cikti gnderebiliriz. rnegin; System.out.println(Canim Trkiyem); Yazarsak bilgisayarin ekranindan veya konsoldan Canim Trkiyemciktisini aliriz. grrz.Eger ciktimizi ekrana yazdirdiktan sonra bir sonraki cikti icin alt satira gecmesini istemezsek print islevini kullaniriz. rnegin; System.out.printcanim ); System.out.print(Trkiyem); Yazisini ekrana ayni satirda Canim trkiyem olarak yazar. Cikit islemlerinin paremetleri yalnizca tek bir dizigi oldugu gibi ,bir deyimde olabilir.eger deyimin sonuncunun tr string degile,ikti islevi cagrilmadan sonuc stringe cevrilir. rnegin; system.out.print.ln(3); Komutu bir tamsayi olan 3 sayisini ilk nce bir dizgiye cevirir ve ekrana bu dizgi yazar.Ekranda 3 sayisini grrsnz.Bazen bir cikti paremetresi asagidaki gibi olabilir. System.out.println(Bu sayi drttr:+4); Bu komut 4 tamsayisini bir dizigiye cevirdikten sonra + birlestirme islemcisikullanarak,bu dizgiyi komuttaki dizgi ile birlestirir ve sunucu ekrana Bu sayi drttr:4 yazar.

Girdi islemleri(Output)
Klavyeden bilgi girmek iin BufferReader sinifi kullanilir..
BufferReader girdi=new BufferReader( new InputStreamReader(System.in));

Bu sinifin readLine() metodunu kullanarak bilgiyi aliyoruz : try { String giris=girdi.readLine(); } catch (IOException e ) { System.out.println(e); } try-catch blogu olasi bir hatayi yakalamak iin kullaniliyor. Eger bir hata olusursa hatayi ekrana yazacak. BY Ahmet Tolga Tat Sayfa 20

Java programlama dilinde girdi islemleri biraz karisik bir konudur.Javada klavyeden basit bir sekilde girdi alacak islevler yoktur. Asagidaki iki rnekte verilmis topla ve text programlari derlenip topla.class calistirildiginda islemi yapabilirsiniz. rnek:
import java.io.* ; import Text;

class topla { public static void main (String args[]) throws IOException { int sayi1,sayi2; int toplam=0; // Text m=new Text(); System.out.println("Bir tamsayi giriniz: "); sayi1=m.readInt(); System.out.println("Bir tamsayi daha giriniz"); sayi2=m.readInt(); toplam=sayi1+sayi2; System.out.println("Toplam "+toplam); } }

import java.io.*; class Text { static boolean iseof = false; static char c; static int i; static double d; static String s; static BufferedReader input = new BufferedReader ( new InputStreamReader(System.in)); public int readInt () { if (iseof) return 0; System.out.flush(); try { s = input.readLine(); } catch (IOException e) { System.exit(-1); } if (s==null) { iseof=true; return 0; }

BY Ahmet Tolga Tat

Sayfa 21

i = new Integer(s.trim()).intValue(); return i; } }

Javanin temel yapisi


Javann genel yapsnn ilk etapta C veya C++a ok benzedii fark edeceksiniz, ama zaten herhangi bir dilde programlama tecrbesi olanlara tm yaplar tandk gelecektir. Genel olarak dikkat edilmesi gereken hususlardan en nemlisi Java byk kk harfe duyarl bir dil olduudur.

Yorumlar
deiik ekilde yorumlar koyabiliriz. // tek satrda yorum /* tek veya daha fazla satrda yorum*/ /** dokmantasyon yorumu */ Dokmantasyon yorumlar bir deiken veya fonksiyon tanmndan hemen nce yerletirilmelidir; nk Javadoc yani otomatik dokman yaratc bu cmleleri hemen altta tanmlanan unsurun tanm olarak alacaktr.

Komutlar

Bunlar Java programndaki en kk altrlan komut paralardr, he rey olabilirler ve noktal virglle ( ; ) biterler. Int x; X= 5*100;

fadeler
fadelerden kast tm deikenlere, snflara, fonksiyonlara ve nesnelere verilen isimlerdir. Java dilinde bir ifade bir harfle, alt tireyle ( _ ) veya dolarla ( $ ) balayabilir. Devam eden karakterler rakam olabilir. Deikenler tm dilde de olduu gibi byk kk harfe duyarldrlar ve maksimum bir uzunluklar yoktur. Geerli ifadeler araba12 yas-toplam Yas-Toplam _toplam

$maa BY Ahmet Tolga Tat

Sayfa 22

Ve tabii ki Java diline ayrlm kelimeler ifade grevi alamazlar mesela bir deiken ad olamazlar. Bunlarn listesi aadadr. {PRIVATE}abstr act Boolean Break byte case catch char class const continue default do double else extends false final finally float for if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient True Try Void While

BY Ahmet Tolga Tat

Sayfa 23

Degiskenler ve Trler
Javada temel be tip deiken vardr. Ayrca deikenler bir class veya dizide olabilirler. Tamsayilar:byte,short,int ve long tam degerli sayilrdir. Virgll sayilar: float ve double virgll sayilardir. Karekterler:char sembolleri harfleri karakterlerle gsterir. Boolean degerler: boolean mantiksal degerleri gsteren zel trler.

Tamsayilar
Tam say dei kenlerdir ve kendi iinde drt gruba ayrlr.

byte
8 bitlik yer kaplar.-128 den 127 araliginda deger alabilir.

short
16 bitlik yer kaplar.-32768 ve 32767 araliginda deger alabilir.

int
32 bitlik yer kaplar. 2.147.483.648 ve 2,147,483,647 araliginda deger alabilir.

long
64 bitlik yer kaplar.cok byk bir aragliga sahiptir. {PRIVATE}Tip boolean char byte short int long Bit Bykl 1 16 8 16 32 64 Deerler true veya false \u0000 dan \uFFFF -128 dan +127 -32,768 dan +32,767 -2,147,483,648 dan +2,147,483,647 9,223,372,036,854,775,8 08 dan +9,223,372,036,854,775 ,807 -3,40292347E+38 dan +3,40292347E+38

float

32

BY Ahmet Tolga Tat

Sayfa 24

rnek: class ornek7 { public static void main(String args[]) { byte a=10*2; short b=50*20; int c=50000; long d=100*100; System.out.println("byte'in degeri="+ a); System.out.println("short'un(donun) degeri="+ b); System.out.println("int'in degeri="+ c); System.out.println("long'un degeri="+ d); } }

Karakterler(Characters)
char kelimesini bir karakter tanmlamak iin kullanrz. Karakter tek trnak iine alnmaldr. Bir charin araligi 0 ile 65536 arasindadir.Char tr isaretsiz 16 bitten olusur.Iki karekteri birlikte toplayabilirsiniz veya degiskenin degerini artirabilirsiniz. char a; char a1=a; char a2=\n;

class ornek4 { public static void main(String args[]) { char c='a'; System.out.println("char c="+ c); } }

Virgll sayilar(floating points)


float
32 bitlik yer kaplar.Tam sonuc istendiginde kullanilir.

Double
64 bitlik yer kaplar.Tm Trigonometrik degerlerin hesaplanmasinda double degeri kullanilir. BY Ahmet Tolga Tat Sayfa 25

class ornek8 { public static void main(String args[]) { float f=3.1444444f; double b=3.488888888888888; System.out.println("float'in degeri="+ f); System.out.println("double'in degeri="+b); } }

Mantiksal degerler(booleans)
Boolean kosullu isletmenler (if,else,while ve do)tarafindan gereksinim duyulurlar.Mantksal ifadeler iki tip deer alabilir. true veya false rnek: boolean a=true; rnek: class ornek5 { public static void main(String args[]) { boolean a=true; System.out.println("boolean a="+ a); } }

Strings islemleri
Karakter dizilerini String kelimesi ile tanmlarz. Ben bir stringim Stringdir.Re Re Re Ra Ra Ra Galatasaray Galatasaray Cim Bom Bom bir Stringdir.Fenerbahze Kyhizmetleri Fitbol idman culb bir Stringdir.String agzindan cikan kelimelerdir. Java Stringleri String sinifindan turetilmis objeler olarak implemente eder.Stringlerin nesne olarak yapisinda tutulup islenmesi Javaya ustun zellikler saglar.rnegin iki Stringin BY Ahmet Tolga Tat Sayfa 26

karsilastirilmasi,String icersinden bir supstringin cikarilmasi,byk kck harf cevrimi,iki sitringin birlestirilmesi gibi islemler kolayca gerceklestirilir. Ben bir stringim Stringdir.Re Re Re Ra Ra Ra Galatasaray Galatasaray Cim Bom Bom bir Stringdir.Fenerbahze Kyhizmetleri Fitbol idman culb bir Stringdir.String agzindan cikan kelimelerdir.

String Fonksiyonlari:
String s=new String() Bu ifade icinde karakter olmayan bir s String#i olusturur. String(char chars[])Bir Arrayi karaketer elemanlarini baslangic deger olarak alan bir String olusturabiliriz. Stiring Uzunlugu: Int Length() rnek: class deneme { public static void main(String args[]) { char uzun[]={'a','b','c'}; String s=new String(uzun); System.out.println(s.length( )); } } String Literalleri Asagidaki s1 ve s2 esit Stringlerdir. class deneme1 { public static void main(String args[]) { char uzun[]={'a','b','c'}; String s1=new String(uzun); String s2="klm"; System.out.println("klm".length()); } }

Stringleri Birlestirme: class gleich { public static void main(String args[]) { String slte="20"; String a="Ich bin " + 20 + " Jahre alt"; System.out.println(a); } BY Ahmet Tolga Tat Sayfa 27

} class solang { public static void main(String args[]) { String solang="Heyy baby "+"when I see you"+"my heart is jumping"+"uuuOOo Yeeeehhhh" +"this is a story " + "about me "+"hheheheh"; System.out.println(solang); } }

Stringlerin diger tipler ile birlestirilmesi


String s = "dort:" + 2 +2; System.out.println(s); // " dort: 22 " String s = "dort:" +( 2 +2 ); System.out.println(s); // " dort: 4 "

Karakter Cikaran Fonksiyonlar


CharAt( ) Char charAt( int where ) String icinde konumu belirtilen karakteri cikarir Char ch ; Ch = "abc".charAt( 1 ); // "b" degerini ch degiskenine atar. Getchars( ) Void getchars( int source start, int source end, char target[ ] , int target start ) Stringten verilen iki konum degeri arasinda bulunan substringi cikartir.

rnek: Class getcharornek { public static void main( ) { String s = "Bu gettchar fonksiyonuna ait bir ornektir."; int start=14; int end=27; Char buf[ ] = new char[end - start ]; s.getchars(start, end, buf, 0 ); System.out.println(buf); }} BY Ahmet Tolga Tat Sayfa 28

Stringlerin arastirilmasi
Indexof( ) karakter veya substring'in string icinde gecen ilk konumunu verir. Lastindexof( ) karakter veya substring'in string icinde gecen son konumunu verir. Arastirilmaya nereden hangi konumdan baslanacagi bilgisi su form ile verilebilir. Int indexof( string s, int baslangic_indeksi ) Int lastindexof( string s, int baslangic_indeksi ) rnek: class indexbak{ public static void main( ) { String s = "Korkma! Sonmez bu safaklarda yuzen al sancak " + "Sonmeden yurdumun ustunde tuten en son ocak."; System.out.println(s); System.out.println( "indexof(S) = " + s.indexof('S') ); System.out.println( "lastindexof(S) = " + s.lastindexof('S') ); System.out.println( "indexof(ak) = " + s.indexof("ak") ); System.out.println( "lastindexof(ak) = " + s.lastindexof("ak") ); System.out.println( "indexof(s,10) = " + s.indexof('s',10) ); System.out.println( "lastindexof(s,60) = " + s.lastindexof('s',60) ); System.out.println( "indexof(ak,10) = " + s.indexof("ak",10) ); System.out.println( "lastindexof(ak,60) = " + s.lastindexof("ak",60) ); } }

String Manipulasyonu
Concat( ) String concat( string s ) Iki stringi birlestirir. String s1 = "bir"; String s2 = s1.concat( "iki" ); // "biriki" stringini s2 degiskenine atar. Replase( ) string replase( char original, char replacement ) Stringteki bir karakteri baska bir karakter ile yerdegistirir. BY Ahmet Tolga Tat

Sayfa 29

String s = "bakla".replace( 'b' , ' t ' ); // "takla"stringini s' e atar.

valueof( ) fonksiyonu ile veri tipinin degistirilmesi valueof( ) metodu veriyi kendi formundan okunabilir bir forma donusturur. Static string valueof( double num ) Static string valueof( long num ) Static string valueof( object ob ) Static string valueof( char char[ ] )

String icindeki karakterlerin byk / kck harf cevrimi String toLowerCase( ) string icindeki buyuk hafleri kucuk harfe cevirir. String toLowerCase( ) string icindeki kucuk hafleri buyuk harfe cevirir. rnek: class degis { public static void main(){ String s="Test edelim!"; System.out.println("bak:"+s); String upper=s.toUpperCase(); String upper=s.LowerCase(); System.out.println("UpperCase:"+upper); System.out.println("LowerCase:"+lower); } }

StringBuffer Nesnesi
StringBuffer stringlere daha fonksiyonel islevler kazandiran string sinifidir. StringBuffer genisleyebilir ve yazilabilir karakter dizileri olusturabilmeyi saglar. StringBuffer Yapici Fonksiyonlari StringBuffer( ) StringBuffer(int size ) StringBuffer(string s )

rnek: class sitbuf{ public static void main( ) { Stringbuffer sb =new stringbuffer( "Hello"); BY Ahmet Tolga Tat Sayfa 30

System.out.println(" Buffer = " + sb ); System.out.println(" Length = " + sb.length( ) ); System.out.println(" capacity " + sb.capacity( ) ); }}

EnsureCapacity ( ) StringBuffer constructer ile olusturulduktan sonra sting icin yer allocate etmek icin kullanilir. Void ensureCapacity(int capacity) //capacity buffer'in genisligini ifade eder. Setlength( ) StringBuffer icindeki stringin uzunlugunu belirler. Void setlength(int len) //len buffer'in uzunlugunu ifade eder. GetChars( ) StringBuffer icinden bir substring cekerek array'e aktarir. Void GetChar(int sourceStart,int sourceEnd, char target[ ], int targetStart) Append( ) StringBuffer Append(string s) StringBuffer Append(int num) StringBuffer Append(Object obj) Append( ) metodu diger tipteki datalar ile StringBuffer' daki stringin birlestirilmesini saglar. Insert( ) StringBuffer insert(int index, string s) StringBuffer insert(int index, char ch) StringBuffer insert(int index, object obj) Bir stringin digeri icine insert edilmesini saglar. Reverse( ) Reverse metodu kullanilarak StringBuffer icindeki stringin sahip oldugu karakterlerin sirasi ters cevrilebilir. StringBuffer reverse( )

Dei kenlerin lk Deerleri


Java da hibir deiken veya nesne referans deersiz balamaz. Hepsi tanmladklar anda aadaki deerleri alrlar. byte 0 short 0 int 0 BY Ahmet Tolga Tat Sayfa 31

long float double char boolean Tm Referanslar

0l 0.0f 0.0d \u0000 false null

Tanmlama ve Deer atama


int x,y; // tam say tanmlama float z=5.12; // float tanmlama ve deer atama boolean tamam =true; // boolean tanmlama ve deer atama char c; // karakter tanmlama String str1; // string tanmlama String str2= Lay Lay; // string tanmlama ve deer atama c=b; // char deikenine deer atma str1=Uzaylyz; // String deer atama x=6; // int deikenine deer atama y=2000; // int deikenine deer atama

Diziler(Arrays)
Benzer tr degiskenlerin olusturdugu bir grublara dizi denir:Dizilerin Java da nemli bir yeri vardir Her tipin dizisi tanmlanabilir. char s[ ]; int x[ ]; int tablo [ ] [ ]; Dizi Yapma Javada tm diziler esasnda birer nesnedir. Bu yzden tanmlandktan sonra uzunluklar verilerek yaratlmaldr. (New yani nesne yapma komutu kullanlarak) int tablo [ ] [ ]= new int [4] [5]; veya int tablo [ ] [ ]; tablo=new int[4] [5]; Aadakiler dizi yapma hatalardr. Derleme srasnda derleyici hata verecektir. Hata 1 int liste [40]; // tanm srasnda statik bir // dizi yaratmaynz. Hata 2 int liste [ ] ; // bykl belirtmeden liste [2]= 23; // bir diziye deer atamayz. BY Ahmet Tolga Tat Sayfa 32

Not:Dizilerin uzunluklarn length metoduyla alabilirsiniz. int a [ ] [ ] = new int [8] [2]; a.length // deeri 8 dur a [0].length // deeri 2 tr.

Bazen tanm srasnda deer vererek de dizi uzunluu tespit edebiliriz. String meyveler [ ]= {ilek,kivi,kiraz}; Esasnda aadakinin aynsdr. String meyveler [ ]; Meyveler = new string [3]; Meyveler [0]=ilek; Meyveler [1]=kivi; Meyveler [2]=kiraz;

BY Ahmet Tolga Tat

Sayfa 33

Javada operatrler
Java da 5 Temel operatrler (islemciler) vardr. Java Operasyonu Toplama karma arpma Blme Mod Alma Aritmetik Operatr + * / % Matematiksel fadesi f+7 p-c bm x/y r mod s Java fadesi f+7 pc b*m x/y r%s

Artrma ve Eksiltme
Operatr ++ ++ --Tanm nce Arttr Sonra Arttr nce Azalt Sonra Azalt rnek fade ++a a++ --b b-Tanm a y 1 arttrp ilemde yle kullan a y ilemde kullan sonra 1 arttr b y 1 azaltp ilemde yle kullan b y ilemde kullan sonra 1 azalt

Karla trmalar
Standart Matematiksel Eitlik ve Kyaslama Operatrleri Eitlik Operatrleri = Kyaslama Operatrleri > < Java Eitlik Kyaslama Operatrleri == != ve rnek Java Durumu Java Durumunun Aklamas

x == y x != y

x eittir y x eit deildir y

> < >= <=

x>y x<y x >= y x <= y

x byktr y x kktr y x byk eittir y x kk eittir y Sayfa 34

BY Ahmet Tolga Tat

Deer Atamalar
Atama rnek Operatrleri fade int c = 3, d = 5, e = 4, f = 6, g = 12; += c += 7 -= d -= 4 *= e *= 5 /= f /= 3 %= g %= 9 Mantksal And (Ve) Or (Veya) && || Tanm Sonu

c=c+7 d=d4 e=e*5 f=f/3 g=g%9

10 to c 1 to d 20 to e 2 to f 3 to g Not (Deil) !

Operatr ncelik tablosu


{PRIVATE}Operatrler () ++ -- + - ( type ) */% +< <= > >= == != ?: = += -= /= %= ncelik left to right right to left left to right left to right left to right left to right right to left right to left Tip parantez Bir ilem arpan Toplam Karlatrma Eitlik Durumsal Atama

Stringler + ile birleir. System.out.println (Doktor +isim) Ekranca Doktor ve hemen yanna ismin ieriini basar.

zel Karakterler
{PRIVATE}z Tanmlar el Karakterler \n Yeni Satr Bir sonraki satrn bana ge \t Bir sonraki yatay Tab a ge BY Ahmet Tolga Tat

Sayfa 35

\r \\ \ \

Bulunduun satrn bana ge Backslash basmak iin kullanlr Tek trnak basmak iin kullanlr ift trnak basmak iin kullanlr

Bit lemleri
{PRIVA AND TE}NO T ~ & OR XOR Sola Kaydr Saa Kaydr Sfrla Saa Kaydr

<<

>>

>>>

BY Ahmet Tolga Tat

Sayfa 36

Javada kontrol yapilari


Hayatta karlatmz tm problemlerin zmnde de olduu gibi, bilgisayar programn yazacamz bir problemini de nce en iyi ekilde idrak edip, sonra iyi tasarlanm bir zm oluturulmalyz. Tm bilgisayar programla ma dillerinde olduu gibi, iyi tasarlanm bir zme ulamak iin, nce o bilgisayar programndaki kontrol yaplar en iyi ekilde al lp, anlalmaldr. Bu blmde kontrol yaps mant ve Java programlama dilinde bulunan kontrol yaplarna alacaz.

If,else kaliplari
if (boolean) { Komutlar; } else { Komutlar; }

rnek int say ; say = sayAl () ; // programdaki bir metot if (say < 0) { System.out.println (Hata: say deeri negatif!): } else { System.out.println (blabla +say+ bla) ; } BY Ahmet Tolga Tat Sayfa 37

rnek: class eger { public static void main(String args[]) { int x; x=20; if(x<15) { System.out.println("islem dogru"); } else { System.out.println("Hata:Girdiginiz sayi " +x); } } }

Koul kalibi
Bazen ok ksa koullar iin if else yerine kullanlr. koul ? doruysa : yanlsa; rnek: int cevap; cevap=x < y ? x : y; Ayn ilemin if else ekli: int cevap; if x < y (eger x yden kckse ) cevap=x; (cevap x olur ) else (yok hayir yle degilse ) cevap=y; (cevap dogal olarak y olur )

Switch kalibi
Bir nceki blmde if ve if/else tekli ve ikili seim kontrol yaplarna almtk. Bu yaplar her programda ok kullanld gibi ou zamanda tek bir deikenin alabilecei bir ok deer iin bir programn yapmas gereken farkl ilemler olacaktr. E er elimizde sadece if/else yaps bulunsayd, bu birden ok fazla deerin her birini kontrol etmek iin bir if/else kontrol yazmak zorunda kalacaktk. Bu ok sayda if/else, hem programn okunurluunu azaltacak hemde BY Ahmet Tolga Tat Sayfa 38

program izlemeyi zorlatracaktr. te bu olumsuzluklar engelleyip daha verimli bir yap oluturabilmek iin java proglama dilinde SWTCH oklu seim kontrol yaps bulunmaktadr. Bu switch deyimi bir deikenin alabilecei bir ok deerin her biri iin yaplmas gerekli kod blokla rn ierir. Switch yaps ilk olarak SWTCH deyimi ile balar, sonra deerlerine gre ilem yaplacak deikenin belirlenmesiyle devam eder. Deikenin her deeri iin yazlacak kod paralar CASE deyiminlerinden sonra yazlr ve Her CASE deyimin bittii yeri gsteren BREAK deyimi ile case sonlandrlp, SWITCH komut bloundan klr. Switch yapsnn son eleman ise seimlik olarak DEFAULT deyimi olup eer hi bir CASE koulu salanmazsa yaplacak ilemleri i erir.

switch (expr1) { case expr2: Komutlar; break; case expr3: Komutlar; break; default: Komutlar; break; }

rnek:
import java.awt.*; import java.applet.*; public class caseornek01 extends Applet { Label prompt1; TextField input1; int sayi=0; public void init() { prompt1 = new Label( "1 LE 10 ARASI BR SAYI GRNZ " ); input1 = new TextField( 5 ); add( prompt1 ); add( input1 ); } public void paint( Graphics g ) { g.drawString("Sonuc",50,125); switch (sayi) { case 1: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break;

BY Ahmet Tolga Tat

Sayfa 39

case 2: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 3:
g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 4: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 5: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 6: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 7: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 8: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 9: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; case 10: g.drawString( " Girdiginiz sayi= "+sayi, 50, 150 ); break; default: g.drawString("Farkl Bir Say Girdiniz",50,150); break; } }

public boolean action( Event event, Object o ) { if ( event.target == input1 ) { sayi = Integer.parseInt ( input1.getText() ); repaint(); } return true; } }

Bu rnekte dardan girilen saynn 1 ile 10 arasnda olanni applet'e yazdryoruz. Eer farkl bir say girilirse say iin Farkl Bir Say Girdiniz mesaj dar verilir. Bu algoritma gerekletirilirken sayi isimli deiken kullan lm olup, bu sayi is imli deikenin 10 deeri CASE kullanlarak kontrol edilmitir. Eer bu 10 CASE durumundan hi biri olmazsa DEFAULT deyiminin kullanld komut blou ilenilmitir. imdi bu rnei birde aadaki gibi yazalm.
import java.awt.*; import java.applet.*; public class caseornek02 extends Applet {

BY Ahmet Tolga Tat

Sayfa 40

Label prompt1; TextField input1; int sayi=0; public void init() { prompt1 = new Label( "1 LE 10 ARASI BR SAYI GRNZ " );

input1 = new TextField( 5 );


add( prompt1 ); add( input1 ); } public void paint( Graphics g ) { g.drawString("SONUCUMUZ",50,125); switch (sayi) { case 1: case 2: case 3: case 4: // CASE DEYMLER BREAK case 5: case 6: case 7: case 8: // KULLANILMADAN OLUTURULMUTUR. case 9: g.drawString( "GRDNZ SAYI = "+sayi, 50, 150 ); break; case 10: g.drawString( "GRDNZ SAYI = "+sayi, 50, 150 ); break; default: g.drawString("10'dan Byk Bir Say Girdiniz",50,150); break; } } public boolean action( Event event, Object o ) { if ( event.target == input1 ) { sayi = Integer.parseInt ( input1.getText() ); repaint(); } return true; } }

rnek // farz edin saym pozitif // deeri olan bir rakam switch (saym % 3) { case 0: BY Ahmet Tolga Tat Sayfa 41

System.out.println (Renk krmz.); renkAta (0); break; case 1: System.out.println (Renk sar); renkAta(1); break; case 2: System.out.println (Renk mavi) ; renkAta (2) ; break; } // programn renkAta( ) adl bir fonksiyona sahip olduunu kabul ediyoruz

Break ve Continue komutlar


BREAK ve CONTINUE komutlar ile bir dngnn ak deitirilir. BREAK komutu while, for, do/while, veya switch dng yaplarndan koulsuz k salar.BREAK komutunun asl kullanm amac bir dngden dngnn sonunun gelmesini beklemeden k iin ve ya SWICTH oklu seim komut blounda BREAK komutunun altnda kalan komutlar atlamak iin kullanlr. Aadaki basit bir rnekle bunu gzlemleyelim.
//rnek: import java.awt.*; import java.applet.*; public class breakornek0 extends Applet { public void paint (Graphics g) { int y=25; for (int i=1;i<=20;i++) { g.drawString("Dng degiskenini ndegeri = "+i,15,y); y=y+25; if (i==8) { g.drawString("Bu Dngden kyorum",15,y);

BY Ahmet Tolga Tat

Sayfa 42

break; } } } }

Grld zere eer FOR dngs normal ekilde sonlanacak olsayd, aplet zerine i dng kontrol deikeninin almas gereken tm deerler yazlacakt. Fakak i deikeni 8 deerine ulanca BREAK komutu altrlyor ve FOR dngsnden kou lsuz klyor ve i nin sadece ilk 8 deeri aplete yazdrlyor.

break komutu i ie oluturulmu dnglerde, hangi dngde kullanlmsa o dngden


kmay salar ve dier d dngler ilemlerine devam eder. Aagdaki kod blou iletilince, apletten ilk olarak i WH LE dngsnn kld anlalyor. Fakat d WHLE dngsnne devam edildii, d WHLE dngsnden ise bir sonraki BREAK komutu ile kld grlyor.

/******************************** *rnek * *********************************/ import java.awt.*; import java.applet.* public class breakornek extends Applet { public void paint (Graphics g) { int y=25; int i=0; int j=0; while (++i<=3) { g.drawString(" Dis while dng degiskeni degeri I = "+i,15,y); y=y+25; while(++j<=10) { g.drawString(" ic while dng degiskeni degeri J= "+i,15,y); y=y+25; if (j==3){g.drawString("ic while dngsnden cikiliyor",15,y); break; } } } } }

Continue komutu ise, dng ierisinde sadece dngnn o seferki dnnde, bu


komutun altnda kalan komutlar atlamaya yarar. Dng sonraki deerleri iin BY Ahmet Tolga Tat Sayfa 43

dnmeye devam eder. Ama CONTNUE komutunda dikkat etmemiz gereken husus bu komutun DO/WHLE v e FOR dng yaplarnda kullanlnca farkllklar iermesidir. DO/WHLE dnglerinde kontrol deikenine uygulanmas gereken arttrma veya azaltma ilemi gerekletirilmeden,dng kontorol yaplr ve ilemlere devam edilir.Fakat FOR dnglerinde ise, CONTINUE komutu ilenince dng kontrol deikeni iin yaplmas gereken artrma ve ya azaltma ilemi yaplr, sonra dng kontrol yaplr. BU dikkat edilmesi gereken nemli bir durumdur.
//rnek //Yukaridaki programlam bu program arasindaki farka dikkta edin!!

import java.awt.*; import java.applet.*;

public class breakornek2 extends Applet { public void paint (Graphics g) { int y=25; int i=0; int j=0; while (++i<=3) { g.drawString(" DI WHLE DNG DEKEN DEER = "+i,15,y); y=y+25; while(++j<=10) { g.drawString(" WHLE DNG DEKEN DEER J = "+i,15,y); y=y+25; if (j==3){g.drawString(" WHLE DNGSNDEN IKILIYOR",15,y); y=y+25; break; } } if (i==1){g.drawString("DI WHLE DNGSNDEN IKILIYOR",15,y); y=y+25; break; } } }

BY Ahmet Tolga Tat

Sayfa 44

Dng kaliplari for dngleri


for (ilk_deeri1; test_deeri2; arttrma_deeri3) { Komutlar; }

rnek
class don{ public static void main(String args[]) { int x; System.out.println("Cuneyt 10 defa sorar:"); for(x=0;x<=10;x++){ System.out.println("(: Bitmedimi bu askimiz hala Nalan "); } System.out.println("Nalan cevap verir:"); System.out.println("THE SON :)"); } }

imdi bir rnekle bu anlatlanlar daha iyi aklyalm. rnek import java.awt.Graphics; import java.applet.Applet; public class forornek extends Applet { public void paint(Graphics g) { int y=25; for (int sayac=1;sayac<=20;sayac++){ g.drawString("SAYA DEER : "+sayac,25,y); y=y+25; } } } Program altrdmzda, kt olarak elde ettiimiz applet'i incelersek, sayac kontrol deikenin ilk olarak 1 deerini aln grrz. Daha sonra dng ierisinde birer birer artn ve 20 deerine ulanca dngnn son bulduunu gzlemleriz . Bylece : BY Ahmet Tolga Tat Sayfa 45

1.ifade diye tanmladmz sayac=1; komutu ile kontrol deikenine ilk deeri atadmz, 2.ifade diye tanmladmz sayac<=20; komutu ile dng uzunluunu belirlediimiz, 3.ifade diye tanmladmz sayac++; komutu ile kontrol deikeninin her dn iin deiim miktarn belirlediimiz grlr.

Java programlama dilinde for dng yaplar iin gerekli dediimiz 3 ifadenin hepsi istee bal ifadelerdir. Yani istenirse yazlmayabilirler. Bu durumda dahi for dngs alr. Ama eer 1.ifade verilmezse bu, kontrol deikeninin daha nceki komutlard a tanmlanm ve deer atanm olmasn gerektirir. 2.ifade verilmezse bu ise for dngsnn sonsuz bir dng olaca anlamna gelir. 3.ifade verilmezse bu ise, dng deikeninin dng ierisinde arttrlp, azaltlaca anlalr. Son olarak dng deeri azalarak oluturulmu bir for dngs rnei inceleyelim. Programmz 20 den 1' e kadar i kontrol deikeninin dng ierisinde ald deerlerini applet'e yazp, dng deikenin ald deerlerin toplamn k olarak veriyor.

//rnek*************************** import java.awt.Graphics; import java.applet.Applet; public class forornek02 extends Applet { public void paint(Graphics g) { int toplam=0; int y=25; for (int i=20;i>=1;i--){ g.drawString("'nin DEER : "+i,25,y); y=y+25; toplam=toplam+i; } g.drawString("toplam : "+toplam,50,y+25); } }

Bu rnek ile azalarak giden dng kontrol deikenini grm olduk. i deikeni ilk deeri olan 20 deerinden sonra, dng her dnnde bu ilk deerinden birer BY Ahmet Tolga Tat Sayfa 46

birer azalarak 1 deerine ular. 1 deerine ulanca dng son bulur ve deerlerin to plam applet'e yazlp, program sonlandrlr.

//rnek: class kare { public static void main (String args[]) { int l ,a; if (args.length == 2) { l = Integer.valueOf(args[0]).intValue(); a = Integer.valueOf(args[1]).intValue(); } else { l= 20; a= 15; } for (int i=l; i>0; i--){ System.out.print("J"); } System.out.print("\n"); for (int i= a-2; i>0; i--){ System.out.print("A"); for(int j=l-2; j>0; j--) { System.out.print(" "); } System.out.print("V\n"); } for (int i=l; i>0; i--){ System.out.print("A"); } System.out.print("\n"); } }

while dngleri
While cok kullanilan tekrarlama yapilarindan biridir.( ) icindeki boolean terim true(dogru)oldugu srece yeniden islemi dndrr.Eger programda boolean islemi sonuclandiracak bir ifade yoksa bu dng sonsuza kadar devam edebilir.

while (boolean degisken) { Komutlar; }

BY Ahmet Tolga Tat

Sayfa 47

while(true) { System.out.println(Bu dng sonsuze gider); } Yukaridaki program sonsuza kadar gider.
//while rnegi import java.lang.*; class whileornek { public static void main(String args[]) { int num=1; while(num <=10){ num +=1;//veya ++ System.out.println("nummmer="+num); } } }

Yukaridaki programdan syle bir cikti alirsiniz: C:\Java\jdk1.3\bin>java whileornek nummmer=2 nummmer=3 nummmer=4 nummmer=5 nummmer=6 nummmer=7 nummmer=8 nummmer=9 nummmer=10 nummmer=11

do-while dngleri
Komutlar; DO/WHLE dng yaps ile WHLE dng yaps birbirine ok benzer. Tek ve nemli fark, DO/WHLE yapsnda dng en az bir kere tekrarlanr. Bunun nedeni dng kontrolnn dngnn sonunda yaplmasdr. Ama WH LE dng yapsnda kontrol en bata olduu ii n, dng hi dnmeyebilir. Bu yzden DO/WHLE yaps kullanlrken dngnn en az bir kere dnecei unutulmamaldr. Bu anlattmz ufak bir rnekte inceleyelim. DO/WLE ile yazlan program import java.awt.*; import java.applet.*; public class dowhileornek02 extends Applet { BY Ahmet Tolga Tat Sayfa 48

public void paint( Graphics g ) { int i=1; while(i!=1){ g.drawString("BEN WHLE ' IM",25,25); } } }

Ayn program WHLE ile yazlm import java.awt.*; import java.applet.*; public class dowhileornek01 extends Applet { public void paint( Graphics g ) { int i=1; do{ g.drawString("BEN DO/WHLE ' IM",25,25); }while(i!=1); } }

Aadaki rnekte ise 5 tane rencinin notu dardan okunup bir dizine atlyor (dizinler ileriki blmlerde aklanacaktr). Bu 5 renc i notu aplet'e bir WHLE dmgs ile yazdrlyor ve not ortalamas bulunarak oda aplet'e yazdrlyor.

rnek: import java.awt.*; import java.applet.*; public class whileornek extends Applet { int n[]; int c=0; int num; int y=25; int toplam=0; Label prompt1; TextField input1; public void init(){ BY Ahmet Tolga Tat Sayfa 49

prompt1= new Label("NOTLARI GRNZ"); input1= new TextField(5); add(prompt1); add(input1); n= new int[10]; } public void paint(Graphics g) { if (c==5) {for (int i=1;i<=5;i++){y=y+25; g.drawString(" "+i+" renci notu = " + n[i],25,y); toplam=toplam+n[i]; }g.drawString(" renci Not Ortalams = " + toplam/5,25,y+25); } } public boolean action (Event e, Object o){ if (e.target==input1){ c++; num=(Integer.parseInt(input1.getText())); n[c]=num; repaint(); } return true; } } Ayrca aadaki komutlar da kullanabiliriz. break (etiket); //dngden tamamen kar veya etikete geer continue (etiket); //dngnn bir sonraki tekrarna veya etikete geer return deer; //deer geri evirir (metotlar iin) label; komut; // for, while veya do kalplar iin etiket

BY Ahmet Tolga Tat

Sayfa 50

Nesneye ynelik
Programlama
Object Oriented Programlama
Object oriented programlamann (OOP), 60l yllarda Simula dilinin tasarlanmas ile balad kabul edilmektedir. Simula, bir simulasyon dili olarak tasarlanmtr, kullancya sistem iersindeki mevcut nesnelerin ve bunlarn deiik durumlardaki davranlarnn modellenmesi ynnde bir yaklamla program yapma imkan salanmtr. Gnmzde eer bir dil programcya sorunu paralar ayrma hakk tanyorsa, ve program paralara ayrldnda her bir parann ayr ve zgn davranlar tanmlanabiliyor ve hatta kendi durumlar sz konusu olabiliyorsa o zaman programlama dilinin obje tanml bir dil olduunu syleyebiliriz. Object oriented bir program birbiriyle ilikili bamsz modllerden oluur. Fakat bir programlama dilinin gerekten object oriented olmas iin aadaki zellikleri desteklemek zorundadr Encapsulation (Veri soyutlama ve saklama prensibi): Tek bir obje tanm baz ilemlerde deiik durumlara ramen doru tepkileri verebilmeli ve btn bu detaylar objenin iinde zel ve gizli kalabilmelidir. Inheritance (Kaltm,Miras): Yeni snflar daha nceden var olan snflardan treyebilmeli, hem kod tekrar kullanm hem de gelitirilebilirlik salar. PolyMorphism (ok biimlilik): Bir fonksiyon yada metodun deiik snflardaki objelere uygulanmasyla ayn mantksal sonucu vermesi. Veya baka bir deyile, ayn isimdeki operasyonlarn deiik objeler iin farkl biimlerde alglanmas olarak tanmlanabilir. Dynamic Loading (Dinamik Ykleme): Objelerin her yerden arlmas ki buna a da dahildir ve hatta arlan objenin tipi dikkate alnmadan ona mesaj geilebilmesidir.

Class(sinif) nedir?
Snf Tanm
Class bir ablon tarzdr. Bir snflama mant sz konusudur. Programmzda kullanacamz belli nesneleri (objectleri) ortak bir tarzdan tretmeye alrz. Gncel hayat da byledir. eitlerce araba vardr, spor, cabrio, tek kap ama biz araba adl genel bir tanm verdiimizde hepsini ele alrz, ama her birini tanmlamak iin genel araba tanmna detaylar ekler durumlar BY Ahmet Tolga Tat Sayfa 51

veririz. Bunda deer gruplarn ikiye ayryoruz. Bir snf iin durumlar yani deikenler ve de davranlar yeni metotlar vardr. Bunu ekirdek bir yapyla gsterebiliriz.
rnek: public class Araba { public String name; public int erstzulassung; public int leistung; }

Araba Class class Araba { private int hz; private float depo, ortalama_hz; private int yon; String renk; // class metotlar public Araba (String renk) {/ / constructor this.renk = renk; }

public void sur (int yeni_hz) { depo -= ( float) hz/ortalama_hz; if (depo< = 0.0) dur ( ); else hz=yeni_hz; } public void dur ( ) { frenYap ( ); hz = 0.0 } } .

Snf Olusturma
Burda snflarn nesnelerden nasl meydana getirildiklerini aklyacaz.. Aaidaki ifade ile bir snf yaps gsterilmitir rahatlkla bu yapy kullanarak bir snf oluturabiliriz. ki karakteristie sahiptir snf tanmlanmas ve snf yaps BY Ahmet Tolga Tat Sayfa 52

classDeclaration { classBody }

rnek: import java.awt.*;


class selam { static String name; public void setYourName(String n) { name=n; } public void sayHello(Graphics g) { g.drawString("Selam " + name + " Bey !",25,60); } }

Snf Tanmlanmas
Bir snf tanmlanmasda snflar isimleriyle birlikte ifade edilebilirler. Ve bunun yansra snf tanmlanmasnda dier zelliklerde belirtilmek gerekir. Mesela snfn nasl bir zellik arz etmesi gerektii bir supersnf m ypksa bir alt snf m?. veya bunlarn yansra snfn ulalabilirliide burada belirtirlir public, final veya abstract olmas. Bir snf yaps snf tanmlanmasndan sonraki gelen ksmdr bu ksm ayrca keli parentez ile snrlandrlmtr.Bir snf yaps aralk deikenlerinin tanmlar ve method tanmlamalar ve bu methodlarn ierikleri bu keli parantezler ierisinde yazlmaldr. Bir snf durumu onun snf deikenleri tarafndan tasvir edilir.Biz snf yeleri deikenlerini tanmlarn snf yaps ierisinde tanmlanr.Tipik olarak, biz deikenleri methodlarn tanmlanmasndan hemen nce yaparz. Bu gerekli olmasa bile
classDeclaration { member variable declarations method declarations }

BY Ahmet Tolga Tat

Sayfa 53

//Enteresan bir Java Applet import java.awt.*; import java.applet.*; import java.lang.*; public class resimler extends Applet {

private int Al =50; Scrollbar sliderAl; String sliderAlText = "Al (1-40000): "; Label sliderAlLabel; Panel controlPanel; Font font; public void init(){ setForeground(Color.white); font = new Font("Helvetica", Font.BOLD, 12); setLayout(new BorderLayout()); controlPanel = new Panel(); controlPanel.setLayout(new GridLayout(15,1)); add("East", controlPanel); sliderAlLabel = new Label(sliderAlText + "50"); controlPanel.add(sliderAlLabel); sliderAl = new Scrollbar(Scrollbar.HORIZONTAL, Al, 1, 1, 40000); controlPanel.add(sliderAl); controlPanel.add(new Button("Random")); } public boolean handleEvent(Event e) { if (e.target instanceof Scrollbar) { int value = ((Scrollbar)e.target).getValue(); if (e.target == sliderAl) { sliderAlLabel.setText(sliderAlText + Integer.toString(value)); Al = value; } repaint(); return true; } return super.handleEvent(e); } public boolean action(Event e, Object arg) { if("Random".equals(arg)){ Al = (int)(Math.random()*40000+1); sliderAlLabel.setText(sliderAlText + Integer.toString(Al)); sliderAl.setValue(Al); repaint(); return true; } return true; }

BY Ahmet Tolga Tat

Sayfa 54

public void paint(Graphics g) { float x = 0; float y = 0; float prevx = 512; float prevy = 512; int x1,y1; int x0 = 150; int y0 = 150; int redBits, blueBits, greenBits; int i; int max=1000; int in = 5; int dis = 10; int an = 0; g.setFont(font); g.clipRect(0,0,300,300); redBits = (int)(Math.random()*255); blueBits = (int)(Math.random()*255); greenBits = (int)(Math.random()*255); g.setColor(new Color(redBits, greenBits, blueBits)); for (i=0; i<=max; i++) { x = (float)( prevx + dis * Math.sin((double)an)) ; y = (float)( prevy + dis * Math.cos((double)an)); if(x > 1024) break; if(x < 1) break; if(y > 1024) break; if(y < 1) break; x1 = (int)(x/1024.*300.); y1 = (int)(y/1024.*300.); g.drawLine(x0,y0,x1,y1); prevx = x; prevy = y; x0 = x1; y0 = y1; dis = dis + in; an = an + Al; } } }

BY Ahmet Tolga Tat

Sayfa 55

ye degiskenlerinin tanimlanmasi
Az olarak,bir ye degiskeni tanimi iki unsura sahiptir: veri degiskenin tr ve onun ismi.
type variableName; // minimal member variable declaration

Kk degisken tanimi diger degisken tanimlari gibidir, bizim yazdigimiz diger Java programlarinda oldugundaki gibi rnegin yerel degiskenler veye method parametreleri gibi.Asagidaki rnek kodda grlgg zere dogal ye degiskeni Integer olarak isimlendirilmistir sinif IntegerClass ile birlikte.
class IntegerClass { int anInteger; . . . // Burda methodlari Tanimla . . . }

Burdan anlasilacagi gibi ye degiskbe tanimlamalari sinif yapisi ierisinde gsterilir. methodla birlikte gsterilmez.. Bu pozisyon sinif yapisi ile birlikte bulunur degisken ye degiskenidir. ye degiskenlerinin ismi uygun bir java belirtgei veya ve anlasma kk harf ile baslar (sinif isimleri genellikle byk harf ile baslar.).Biz birden fazla ye degiskeni tanimlayamayiz ayni isim altinda ayni sinif yapisi iinde.Fakat ye degiskenleri ve methodlar ayniisimde olababilirler.rnegin Asagidaki kod hatasiz olarak alisir.
class IntegerClass { int anInteger; int anInteger() { member variable . . . } } // a method with the same name as a

Kisaca tanim protosu asagidaki gibidir.: [accessSpecifier] [static] [final] [transient] [volatile] type variableName ye degiskenleri tanimlari asagidaki gibi tanimlanir : Ulasim belirteci tanimlar hangi diger siniflar ulasabilir bu degiskene.Biz ulasimi kontrol edebiliriz ayni belirtgeler, kullanarak.,bu yzden ulasim kontrolu sinifin ye degiskenlerine kapsar bizim nasil btn ye degiskenlerine ve methodlarina ulasacagimizi. Sayfa 56

BY Ahmet Tolga Tat

ierir bu degisken bir siin degiskenidir aralik ye degikenin tam tersi gibi. Biz sinif methodlarini static to anahtar kelimesiylede tanimlayabiliriz.
static final

degiskenin sabit oldugunu gsterir. degiskeneleri nesne durum kisminin parasi degildir. tanimlanir zamana bagli olmayarak.

transient volatile

Bir sinif icinde tanimlanan degiskenler ulasilma tekniklerine gore ve ozelliklerine gore bir cok kisma ayrilir.

Static :
Bu tip degiskene sinif degiskeni de denir. Olusturulan butun nesnelerin icin bir kopya vardir ve degisiklige ugradigi zaman hepsi icin ayni degisiklik soz konusudur.

Sabitler :
Final anahtar sozcuguyle belirtilirler. Program calisma esnasinda kesinlikle degistirilmelerine izin verilmez.

rnek: import java.awt.* ; import java.applet.* ; public class selamla extends Applet{ Label prompt; TextField input; String adsoy,args; // prompt user to input // input values here // store input value

selam greeter1 = new selam(); public void init() { prompt = new Label( "Enter your name and press Enter:" ); input = new TextField( 10 ); add( prompt ); // put prompt on applet add( input ); // put input on applet } public void paint(Graphics d) { greeter1.setYourName(adsoy); greeter1.sayHello(d); } public boolean action( Event e, Object o ) { adsoy = input.getText(); input.setText( "" ); // clear data entry field repaint(); return true; } BY Ahmet Tolga Tat Sayfa 57

Method Tanimlanmalari
Bir method tanimi derleme esnasinda bir ok bilgiler tedarik eder ve alisma sirasinda ve diger nesne ve siniflar hakkinda da bir ok bilgiyi alabiliriz.Bunun yanisira, methodun ismi ve tanimlanmasibilgi tasi rnegin, methodun ve ka tane parametre dndrlmesi gerektigi method tarafindan ve ayni zamanda diger siniflarin ve nesnelerin agrilacagini belirtir.
class Stack { . . . boolean isEmpty() { . . . } }

Methodtan Deger Dndrmek


Javanin dnecek degerinin tipinin belirtilmesine ihtiyaci vardir.Eger bir method herhangi bir deger dndrmyorsa, o void anahtar scg ile tanimlanmalidir..
class Stack { static final int STACK_EMPTY = -1; Object[] stackelements; int topelement = STACK_EMPTY; . . . boolean isEmpty() { if (topelement == STACK_EMPTY) return true; else return false; } }

Fakat, pop() methodu referans bir veri tipi dndryorsa buna nesne denir..
class Stack {

BY Ahmet Tolga Tat

Sayfa 58

static final int STACK_EMPTY = -1; Object[] stackelements; int topelement = STACK_EMPTY; . . . Object pop() { if (topelement == STACK_EMPTY) return null; else { return stackelements[topelement--]; } } }

Methodlar return anahtar szcgn kullanilirlar .ve herhangi bir method return yapisi tasiyorsa void ile tanimlanmamalidir. . Methodun Ismi Bir method ismi herhangi bir Java tanimlayicisi olabilir. There are three special cases to consider in regards to Java method names:
class DataRenderer { void draw(String s) { . . . } void draw(int i) { . . . } void draw(float f) { . . . } }

Note: The information within the parenthesis in the method declaration are arguments to the method. 1.Herhangi bir method sinif ismi ile ayni ise bu metoda biz baslandirici BY Ahmet Tolga Tat

Sayfa 59

diyoruz.Bu metodun zel bir grevi vardir.Baslandiricilar sinif tarafindan retilen nesnenin baslangi degerleri verilmesi iin kullanilir. Constructors sadece Java new operator ile agrilirlar. Bir sinif methodu yeniden yazabilir supersinif da tanimlanmis bir methodu. Tekrar ile yklenecek method atni isimden olmak zorundadir. Bunlarin yaninda method tanimlanmasinda iki elemana ihtiya duyar.Bir methos tanimlamasi baska elemanlarida ierir.Btn bu elemanlar method tarafindan kabul edilen argumanlari aiklarlar. Asagidaki yapida methodun tanimlanmsi aiklanmistir.
[accessSpecifier] [static] [abstract] [final] [native] [synchronized] returnType methodName ([paramlist]) [throws exceptionsList] Method tanimlamalari normal bilinen yapisal programlamaya cok benzer. Methodlarda eger bir degisken dondurulmek isteniyorsa o degiskenin degerine uygun method tanimlamasi yapilmalidir. Ornegin Eger bir dogrui yanlis gibi flag degerleri dondurulmek isteniyorsa Boolean anahtar sozcugu kullanilir. Eger hic bir sey dondurulmek isteniyorsa void tanimlamasi yapilir

rnek: import java.awt.* ; import java.applet.* ; public class numara extends Applet{ Label prompt; TextField input; int num,ypos; Graphics d; // prompt user to input // input values here // store input value

public void init() { prompt = new Label( "Enter your number and press Enter:" ); input = new TextField( 10 ); add( prompt ); // put prompt on applet add( input ); // put input on applet } public void swap1(Stupid a, Stupid b) { Stupid temp; temp=a; a=b; b=temp; d.drawString("======= during swap1 ========",10,130); a.sayHello(d,145); b.sayHello(d,160); } BY Ahmet Tolga Tat Sayfa 60

public void swap2(Stupid a, Stupid b) { int temp=a.getNum(); a.changeNum(b.getNum()); b.changeNum(temp); d.drawString("======= during swap2 ========",10,230); a.sayHello(d,245); b.sayHello(d,260); }

public void paint(Graphics g) { Stupid One=new Stupid(num); Stupid Two=new Stupid(2); g.drawString("======= before swap ========",10,80); One.sayHello(g,95); Two.sayHello(g,110); swap1(One,Two); g.drawString("======= after swap1 ========",10,180); One.sayHello(g,195); Two.sayHello(g,210); swap2(One,Two); g.drawString("======= after swap2 ========",10,280); One.sayHello(g,295); Two.sayHello(g,310); }

public boolean action( Event e, Object o ) { num = Integer.parseInt (input.getText()); input.setText( "" ); // clear data entry field repaint(); return true; } }

import java.awt.*; // import the Java.awt package import java.applet.*; // import Applet class class Stupid { int myNum; Stupid(int n) { myNum = n; } public void sayHello(Graphics g,int yp) { g.drawString("Numaram : "+ myNum,10,yp); } BY Ahmet Tolga Tat

Sayfa 61

public void changeNum(int n) { myNum=n; } public int getNum() { return myNum; } }

Sinif kurucusu
Btn Java siniflari zel bazi methodlara sahiptirler bunlara kurucu denir ve siniflardan olusturulan yeni nesnelere baslangi degerleri vermek iin kullanilir.Kurucular sinif ile yani ismi tasimak zorundadir.Mesela Rectangle sinifinin kurucusunun ismi da Rectangle olmak zorundadir. Java method isminin yeniden yklenmesini destekler ve bu yzden bir sinif birden fazla kurucusu olabilir ayni isimda olan. Diger tekrar yklenen methodlar gibi kurucular birbirlerinden farkli olmak zorundadir tipinin farkli olmasi veya parametre sayilarin farkli olmasi gibi rnek olarak Rectangle sinifin java.awt paketinde bulunan ok farkli kurucular tedarik edebilir hepsi Rectangle(),isminde fakat herbir farkli sayida elemanlar veya farkli tipte bulunan elemanlar ile birlikte kurucular olusturulabilinir.:
public Rectangle() public Rectangle(int width, int height) public Rectangle(int x, int y, int width, int height) public Rectangle(Dimension size) public Rectangle(Point location) public Rectangle(Point location, Dimension size)

Birinci Rectangle kurucusu yeni Rectangle nesnesine baslangi degerlerini atar, ikinci kurucu ise belirtilen width ve height ile yeni nesnesi olusturulur. nc rnekte ise yeni dimension size ile nesne baslangi degeri atanir. Genel olarak kurucular kendi elemanlarinin kullanilir yeni nesne durumunu atamak iin kullanilir.Bu yzden yeni bir nesne olusturmak bizim en iyi tepki verecek argmanlari semekte ve onla atama islerini yapilmasi iin bir kurucu tr seilebilinir. Bunun yaninda elemanlarin tip sayisi biz kurucu methoduna geebiliriz. ve derleyici hangi kurucuyu kullanacagina karar verir. Sonu olarak derleyici bizim yazdigimiz seyi bilir.
new Rectangle(0, 0, 100, 200);

Eger integer bir argman gerekiyorsa onunla belirtilen bir kurucu seilmelidir.asgida yazildigi gibi.
new Rectangle(myPointObj, myDimensionObj);

BY Ahmet Tolga Tat

Sayfa 62

Biz kendi sinifimizi yazdigimiz zaman, onun iin bir kurucu olusturmamiza gerek yoktur. nce belirli olan kurucu herhangi bir argman almaz o tamamem otomatik olrak alisma sirasi esnasinda meydana gelir btn siniflar iin. Fakat biz kendi sinifimiz iin bir kurucu isteyebiliriz veya gerekli olabilir Bir kurucu thread in alt sinifi olan, thread bir animasyon gereklestirebilir. ve yeni degerler kurabilir. mesela ereve hizi, grnt sayisi...yeni degerlerin yklenmesi.
class AnimationThread extends Thread { int framesPerSecond; int numImages; Image[] images;

AnimationThread(int fps, int num) {

super("AnimationThread"); this.framesPerSecond = fps; this.numImages = num;

this.images = new Image[numImages]; for (int i = 0; i <= numImages; i++) { . . . // Load all the images. . . . } } }

Yukaridaki rnekte kisaca bir kurucunun nasil sinifin iine gmldg gsterilmistir.
super("AnimationThread");

Kendi kurucumuz biz normal ulasim belirtelerini kullanabiliriz . private Hi bir sinif bizim sinifimizi nesne olarak kullanamaz. Eger bizim sinifimiz halka aik methodlar var iseda bunlara erisim de kisitlidir.. protected Sadece altsiniflar aralik olusturabilir.. BY Ahmet Tolga Tat Sayfa 63

public Herhangi biri sinifin araligini olusturabilir. package-access PAket disindan olan hi kimse sinifa ulasip onun degerlerini kullanilr.Bu gayet kullanisli bir yntem olabilir. Java oklu kurucuyu destekler. Bu yordam sinif ilk degerler atanmasi icin gerekli olan bir yapidir. Bu yordam degiskende alabilir. Birden fazla constructor yapisi olabilir aldiklari degiskenlerin degerlerine gore veye typelarina gore.

Kalitim Nedir?
Genellikle nesneler sinif olarak tanimlanirlar.Biz nesneler hakkinda siniflar hakkinda oldugundan daha fazla bilgiye sahibiz. Nesne tabanli sistemlerde siniflarin daha farkli sekillerde tanimlanacagi gibi ve kk bir adim atnak iin bir giris yapilacaktir.rnegin Dag bisikleti, yaris bisikleti veya iki kisilik bisiklet hepsi birbirinden farkli bisiklet tipleridir. Nesne Tabanli teminolijide btn bu sayilan bisikletler bisiklet sinifinin bir alt sinifidir.Buna benzer olarak bisiklet sinfi dag bisikletinin yaris bisikletinin super sinifidir.

Herbir alt sinif supersinifin zelliklerini kalitir.( degisken tanimi ierisinde). Dag bisikleti, yaris bisikleti, ve iki kisilik bisiklet ayni durumlari paylasirlar: ayar, hiz, ve bunun gibi ve herbit altsinif super sinifin methodlarini kalitirlar.Dag bisikleti, yaris bisikleti, ve iki kisilik bisiklet ayni zamanda bazi hareketleride paylasirlar: fren sikma pedal hizini degistirme Alt siniflar kalitilan methodlari yeniden biimlendirebilir ve daha zel biimlerde genisletebilir. Alt siniflar kalitilan methodlari yeniden ykleyebilir ve daha zel methodlari tedarik edebilir.rnegin, eger bizim bir dag bisikletimiz varsa extra viteslere sahip, biz daha farkli vites degistir diye bir method yazabiliriz.Bisiklet sren bu methodu kullanarak viteslerde degisiklik yapabilir. Biz hi bir sekilde kalitim katmani ile sinirlandirilmayiz. Kalitim agaci veya sinif hiyerarsisi gerektigi kadar derin olabilir. Methodlar ve degiskenler seviyeler arasindadir . Kalitimin Yararlari Altsiniflar daha zel hareketleri tedarik edilir super sinif tarafindan saglanan temel elemanlardan olus turulan. Kalitim kullanim boyunca, programcilar supersinif ierisinde program kodlarini tekrar kullanabilir. Programcilar supersiniflari soyut olarak ifade edebilirler.Soyut supersiniflar tanumlar ve kismen hareketleri sunabilir. Diger programcilar detaylari zel alt siniflarla doldurabilirler.. Sayfa 64

BY Ahmet Tolga Tat

Kalitim nesnesel programlamada cok onemli bir yer teskil etmektedir. Boylelikle siniflari bir birleri icindeki yordamlari kullanmasini saglayabiliriz. Mesela bir aga sinifinda bir cok ozellikleri farkli kisma ayirabiliriz. (am agaci,elma agaci...) Ama bu farkli turdeki aalar temel olarak aga ozellikleri tasirlar ve nesnesel programlama bu extends anahtar sozcugunu kullanarak izin verir

.Fakat Java Coklu kalitimi desteklemez.

Alt Snf Oluturma


Biz bir sn f baka bir snfn alt snf olarak tanmlayabiliriz class tanmlama ierisinde olmak zere....rnegin Eer biz bir SubClass isminde alt snf oluturmak istersek SubClass dier snfn alt snf olarak ifade edebiliriz dier snf ise super snftr.
class SubClass extends SuperClass { . . . }

Yeni bir alt snf olutururken extends anahtar kelimesi ile kolaylkla alt snf oluturulabilir.. Fakat biz genelikle dier artlar tedarik etmeliyiz bir snf alt snf oluturulduu zaman rnein methodlar yeniden yklemek. ye Deikenleri Nasl Alt Snfllara Kaltlr? Kural: Bir alt snf btn ye deiknelerini kaltabilir super snf ile birlikte eer super snfn ulalabilir tipleri buna msade ediyorsa. Eer alt snfa snrlanmsa ye deikenlerine ulalamaz. Bir alt Snf, btn ye deikenleri kaltlr eer public veya protected
tanmlanmsa.. private

ye deikenleri kaltlamaz.

ye Deikenlerinin Saklanmas Daha nceki blmlerde bahsedildii zere, alt snfta tanmlanan ye deikenleri ayn isimdeki ye deikenlerini saklayabilirler Bu zellik Java daha gl ve daha geleneksel yapar. ayn zamanda hata ayklamada daha verimli olmasna yardmc olur. Bir ye deiikenini kazayla veya istemeyerek saklamayabiliriz buda bize istenmeyen mantksal hatalarn olumasna neden olur. Bu yzden ye deikenlerini ismlendiriken daha dikkatli olunmas gerekmektedi yanllkla saklanmamas iin.
class Super { Number aNumber; } class Sub extends Super { Float aNumber; } super.aNumber

BY Ahmet Tolga Tat

Sayfa 65

Java dilinde bulunan bir anahtar kelimedir anlam ise super snf ifade etmesidir.
super

Alt snf bir zellii ise super snftaki methodlar yenilendirmek yani yeni anlamlar yklemektir.
Alt sinif olmak isteyen bir sinif alt sinifi extends anahtar sozcuguyle kalitimi saglar. Degiskenler private yapilarak istenirse alt sinifdan saklanabilir. Ayni zamanda private methodlarda kalitilamaz.Bir ust sinifa super anahtar sozcuguyle ulasabiliriz.

Methodlar Yenilendirmek
Bir alt snf tamamen yenilendirilebilinir kaltlm method iin veya alt snf yani methodlar ekleyerek methodu geniletme eklinde olabilir methodlar da yenilendirme ilemi. Methodlar yenilemek kaltmn en nemli zzelliklerinden biridir Super Snf Method Yazmn Yenilendirmek Bazen bir alt snf super snf bir methodunu tamamen yenilendimek isteyebilir. Gerekten de bir ok super snflarda ki methodlarn ileri botur. stenilenlere gre bu yap ekillendirilir.. Tamamen yeni yerletirilmi bir super snfn sunumu, kolayca ayn isimdeki bir method tedarik edebilir.
class BackgroundThread extends Thread { void run() { . . . } }

BackgroundThread snf run () isimli bir methodu yenilendirir. Super Snfn Method Sunumuna Eklemeler Eer sen yeni bir Window alt snf oluturmak istiyorsan java.awt package iinde bulunan. Window snf bir tane yaplandrcya sahiptir. Bu method Frame argmanna ihtiya duyar
public Window(Frame parent) class RoundWindow extends Window { public RoundWindow(Frame parent) { super(parent); . . . // RoundWindow specific initialization here . . . } }

Alt Snfn Methodlar kesinlikle Yenilendirilmez Eer bir snf final anahtar kelimesi ile retilmise kesinlikle bu snftan bir alt snf oluturulmaz.Eer alt snf oluturulmak istenirse aada grlen hata mesaj verilir.
FinalTest.java:7: Final methods can't be

BY Ahmet Tolga Tat

Sayfa 66

overriden. Method void iamfinal() is final in class ClassWithFinalMethod. void iamfinal() { ^ 1 error

Bunun yansra static anahtar kelimesi ile retilen alt snflarda da hata mesaj oluur.

Methodlari bir alt sinifta yeniden sekillendirmek mumkundur. Bunu bir sinifta ayni isimli yordami kullanarak farkli isler yaptirmak. Bu ozellik kalitimin en onemli ozelligidir. Her zaman ust sinifin ifade ettigi seyleri yapmak zorunda kalmayiz bu ozellik sayesinde istedigim seyleri daha kolay bir bicimde yapabiliriz.

Nesne(Object) Nedir ve Ne ise yarar?


Nesne tabanli dilin ierisine aldigi gibi, nesnesel tabanli teknolojiyi anlamak iin nesneler birer anahtar hkmndedir. Biz etrafimiza baktigimizda gerek dnyada bir ok nesneyi grebiliriz. mesela kpek, sira, televizyon,bisiklet. Bu gerek dnya nesneleri iki karakteristik zelligi paylasirlar. Onlarin hepsinin birer durumu ve hareketleri vardir.rnegin, kpekler durumlari (ismi, rengi,soyu,a veya tok olmasi)ve kpekler belirli hareketleri vardir. (havlamasi, isirmasi gibi).Bisikletlerin durumlarina rnek olarak ta (o anki vitesi, pedal ayari,iki tekerlekli olmasi,vites saysi) ve yapabilecegi hareketler(fren sikma,hizlanma,yavaslama,vitesleri degistirme). Yazilim nesne modellemede ayni yukarida ifade edilen nesneler iki karakteristil bulunur.durumu ve hereketleri.Yazilim nesneleri muhafaza eder onun durumu degiskenler olarak ve hareketler ise methodlar olarak gsterilirler. Tanim: Nesne bir degiskenlerin yazilim paketleri be onlarla ilgili olan methodlardir. Biz gerek dnyadaki nesneleri yazilim kullanarak tasvirleyebiliriz..Biz gerek dnyadaki bir kpegin bir animasyon programi olarak veya gercek dnyadaki bir bisiklatin elektronik bir alistirma bisikleti olarak tasvirlenmesini isteyebiliriz.. Fekat, biz yazilim nesnesini bir soyut model olarak kullaniriz. rnegin,bir olay ortak nesnesi GUI iinde kullanimi fare ye tiklamak seklinde olusma seklindedir. veya bir butona basilmasi Yazilim nesnesinin bildigi hersey durumlar ve hareketler degiskenler ve methodlar olarak ifade edilir. Modellenen bir yazilim nesnesinde ornegin bir bisiklette degiskenlere sahiptir ve bunlar bisikletin o anki durumu ierir.Onun hizi 10 mphtir,ve onun pedal ayari 90 rpmtir, ve onun o anki vites 5inci vites. Btn bu degiskenler ve methodlar normal olarak aralik degiskenleri ve aralik methodlari olarak bilinirler. Yazilim bisikleti ayni zamanda belirli methodlara sahiptir. Mesela, frene basilmasi pedal ayarinin degistirilmesi veya vites attirilmasi. (Bir bisiklet hizin degistirilmesi iin gerekli methoda sahip olmayabilir. Biskletin hizi gerekten ksesel etkileme olarak hangi vites BY Ahmet Tolga Tat Sayfa 67

ise.ve nasil hizla pedal evriliyor ise veya nerde frene basiliyorsa.) Nesne degiskenleri merkezi tamamlar veya nesnenin ekirdegini..Methodlar ereveler ve saklar nesnein ekirdegini digier nesnelerin degiskenlerinden retici method denir yani gruplama.Tipil olarak gruplama nemsiz detaylari saklamak iin kullanilir. Biz istedigimiz zaman kendi bisikletimizin vitesini degistirebiliriz.,nasil bir mekanizam kullandigini bilmemize gerek yoktur.Benzer olarak yazilim programlarinda sinifin nasik ifade edildigini bilmemize gerek yoktur.Biz sadece istenilen metodu agiririz.. Sonu olarak bu ifade detaylari herhangi bir zamanda degistirilebilinir

Gruplamanin Ehemmiyeti
Modulleme--nesnenin kaynak programinin bir nesne iin yazilip gelistirilmesi tamamen kaynak koddon bagimsiz olarak genisletilebilinir.Ve, Nesne kolayca sistemin etrafinda dolastirilabilinir. Biz herhangi bir bisikleti degistirebiliriz bir baskasi iin ve o hala alisir.

Bilgi saklama--bir nesne genel bir arabirime sahip olabilir ve diger nesneler o arabirimi kullanirlar.Fekat bu nesne kendi zel ve tzel degiskenlerini ve methodlarini dgerlerinden saklayabilir.. Bizim bisiklet zerindeki mekanimayi anlamamiza gerek yoktur.

Mesajlar
Objectmiz yaratldktan sonra artk bir baka snftan ona mesajlar gnderilebiliriz. znimiz olan metotlar altrabilir, deikenleri deitirebiliriz. honda.sur(100); honda.dur() honda.renk=mavi; honda.depo++; //derleyici hatas nk // depo privated. class Motor{ public void ayarlaMotorHz (int pedalPoz){ //gaz pedalna gre motor hzn ayarla } }

class Araba { private Motor arabaMot; private int pedalPoz; BY Ahmet Tolga Tat Sayfa 68

public Araba (String renk) { arabaMot = new Motor( ); } public void sur (int yeni_hz) { ayarlaVites ( ) ; basPedal ( ); ... } public void basPedal ( ) { pedal Poz++; arabaMot.ayarlaMotorHz ( ) ; } ... }

Javada p toplama(Garbaje Collection)


Objectler yaratlr fakat bazen artk programla ilikileri kalmaz, byle durumlarda eski object oriented diller de, mesela C++ ta kendimiz buna dikkat edip objectti hafzadan temizlemeliydik. Ama Java bunu otomatik kendi kontrol ediyor.

Car murat; //hafzada yer kaplama yok murat= new Araba (krmz) // hafzada bir murat objectti murat =new Araba (mavi) // hafzada bir murat objectti daha da olutu.

Fakat eski muratnn programla ilgisi kalmad ve Garbage Collector tarafndan hafzadan otomatik olarak silindi.

Javada alt sinif ve miras(Inheritance)


BY Ahmet Tolga Tat Sayfa 69

Bazen elimizdeki snflar daha geni bir snftan trer hale evirmek isteriz. Veya elimizdeki snftan (class) object deil ama belli baz detaylar farkl daha dorusu eklenmi olan daha zel snflara tretebiliriz. Bunlara alt snf diyoruz. Alt snf olutuktan sonra st snfn tm zelliklerine sahip olur. Buna miras diyoruz. nce genel bir snf varsayalm. class Tasima { public boolean varTekerlek; public int sayTekerlek; private int hz; private float depo; public float okuDepo ( ) { ....... return depo; } public int okuHz ( ) { .............. return hz; } } imdi bu snftan bir alt snf tretelim. Alt snf ve miras iin Java extend komutu kullanlr. class Bot extends Tasima{ public Bot ( ) { varTekerlek = false; sayTekerlek = 0; } // Bota zel metotlar public void atDemir( ) { ... } //ayn zamanda tasima snfna ait dier metotlar da kullanabilir BY Ahmet Tolga Tat Sayfa 70

Javada ne geme ve airi ykleme


Bir inheritance yada tretme daha yapalm. Class SporAraba extends Araba {...}

Method Overriding
Bazen inherit ettiimiz classlardaki baz metotlar kullanma yerine nne geebilirsiniz. class SporAraba extends Araba { public void dur ( ) { //extend ettiimiz araba snfnda da dur adl bir metot olduunu uygulaABS( ) ; //kabul ediyoruz fakat alt snfta onun nne geiyoruz. hz = 0.0; } ... }

Method Overloading
Bazende kendi iinizde ayn isimde fakat farkl deikenler grubu alan metotlar yaratabilirsiniz. class SporAraba extends Araba { / / ki constructor public SporAraba (String renk) { ....... } public SportsAraba (String renk, String model) { ...... } ...}

This & Super


Bazen nesnenin direkt kendisine veya bazen de extend ettii classa ulamas gerekebilir. Kendisine ulamak iin this kelimesini kullanabilir. public Araba (String renk ) {/ / constructor BY Ahmet Tolga Tat

Sayfa 71

this.renk = renk; } Bir st snfa ulamak iin super kelimesini kullannz. Class Myclass extends Frame { public Myclass ( ) { super (Frame Bal); super.boyut( ) ; } public boyut( ) {... } } Genelde override ettiimiz metotla geri dnmek iin kullanlr.

Tanimsiz siniflar(Abstract Classes)


Baz snflardaki metotlarn iine hibir ey yazmazsnz fakat tm alt snflarda override edilmesini istersiniz. Abstract metotlar olan classn kendiside abstracttr ve asla yaratlamaz. abstract class Tasima { public boolean varTekerlek; public int sayTekerlek ; private int hz; private float depo; public abstract void sur (int hz); public abstract void dur ( ) ; public float okuDepo ( ){ ...... return depo; } public int okuHz( ){ ......... BY Ahmet Tolga Tat Sayfa 72

return hz; } }

Sr ve dur snflarnn iine hibir ey yazmyoruz nk tatn ne olaca belli deil Fakat aada iki ayr treyen class var bu classtan ikisininde inherit ettii sr ve dur metotlarnn i detaylar farkl fakat mantksal sonular ayn ite buna polymorphism diyorduk. class Araba extends Tasima{ ... public void sur (int yeni_hz) { ayarlaVites( ); basPedal ( ) ; ... } public void dur( ) { pedalPoz = 0; frenYap( ) ; hz = 0.0; } ... } class Bot extends Tasima{ ... public void sur ( int yeni_hz) { demirAl ( ) ; / / veya ipiCoz ( ) ; yolVer ( ) ; ... BY Ahmet Tolga Tat Sayfa 73

} public void dur( ) { yolPoz= 0; atDemir ( ) ; ... } }

Javada ulaim kontrol


Javada yeni bir class yani snf yarattmz da, onun metotlarnn ve deikenlerinin ve hatta kendisinin ulalabilirlik detayn ayarlayabiliriz. public Her yerden her ekilde ulalabilir. public void HerkeseAcgm ( ) { } protected Sadece snf yelerine uygulanabilir. Class yeleri, altsnflar ve ayn pakettekiler ve hatta baka pakete dahil alt snflar tarafndan ulalabilir. protected void SadeceTandklara ( ) { } private protected- Sadece snf yelerine uygulanabilir. Sadece snf yeleri ve ayn paketteki alt snflara aktr.private Sadece snf yelerine uygulanabilir. Sadece ayn class iindeki dier metotlara aktr. private string ifre;(hibirey yoksa en bata) paketin dier tm yelerine aktr. void PaketMetoduyum ( ) { } final Final yani sabit deer olarak tanmlanan deikenler tanm srasnda deer almak zorundadr. Ve hibir zaman bir daha deitirilemez ve ne geilemezler ( overridden) ve de final olarak tanmlanan snflarn alt snflar olamaz. final int i=0; BY Ahmet Tolga Tat Sayfa 74

final void no_overide ( ) { }

Static degiskenler ve Metodlar


Snfta bir deiken static olarak tanmlandnda ondan treyen tm alt snflarda bu deikenin deeri hep ayn olacaktr, birinin yapt deiiklikten hepsi etkilenecektir. class Takvim extends Baski{ static string Yl = 2003; } Tm trevlerde Yln deeri 1998dir. Fakat eer bir i deitirirse hepsinde deiir. Metotlarda ise nemli nokta static tanml metotlarda ulalan tm deikenler de static olmaldr.

class Dokuman extends Sayfa { static int versiyon = 10; int bolum_says; static void bolum_ekle ( ) { bolum_says++; / / bu calmaz } static void versiyon_duzelt (int ver) { versiyon=ver; / / bu alr }}

Javada paketler(Packages)
Packages kelimesi, classlarn ve arabirimlerin gruplandrlmasna yardmc olur. Paket isimleri ( . ) ile ayrlm kelimelerden oluur ve bu kelimeler ayn zamanda klasr isimleridir. rnein; Applet package 4 snftan oluur.

Applet.class Appletstub.class BY Ahmet Tolga Tat Sayfa 75

Applet Conntext.class AudioClip.Class

Ve bu drt snfn kaynak kodlarn jdk1.1.6\src\java\applet dizini altnda bulabilirsiniz ve eer hepsinin iine bakarsanz ilk satrlarnda Package java.applet; Komutunu grebilirsiniz. Bu komutla bu drt ayr class ta java klasrnn altndaki applet klasrne kaytl olacak demektir. Eer sizde kendi paketlerinizi yaratmak isterseniz dosyanz d opsiyonuyla derlemeniz gereklidir. javac -d /Snflarm dosyam.java //burada Snflarm derlenince paket kabul edilen //dosyalarn kayt olaca dizindir.

import komutunun kullanilisi:


import paketismi.sinif; import paket ismi.*; rnek: Import java.util.Hashtable; Import java.awt.*;

Paketleri almak iin import komutu kullanlr. import java.util.Date; veya * kullanarak btn paketi alabilirsiniz import java.awt.*; Java 1.1de standart olarak bulunan paketler. java.lang java.lang.reflect java.awt java.image java.awt.event java.awt.peer java.awt.datatransfer java.applet java.io java.net java.math java.beans java.rmi java.rmi.dgc java.rmi.registry java.rmi.server BY Ahmet Tolga Tat Sayfa 76

java.security java.security.acl java.security.interfaces java.sql java.text java.ut il java.util.zip

Arayzler(Interfaces)
Bazen snfnz bir st snftan tremesine ramen baka bir snfn avantajlarn yani metotlarn da kullanmak isteyebilir. Byle durumda interface dediimiz ara iletiim kabuklarna ihtiya duyarsnz. Bu ara katmanlar snfnza almak iin implements kelimesi kullanlr. rnek: public class Client extends Thread{...} //Thread snfndan tremi bir snf. Fakat, eer baka snftan tremek ve de Thread snfnn zelliklerini kullanmak isterseniz Thread iin yazlm Runnable Interfaceini kullanrz

Exceptions
Java dili tpk C de olduu gibi belli hatal durumlarda bu hatalarnz yakalayp size bildirebilir ve hatta onlardan kaabilir.Bilinen baz hata durumlar: ArithmeticException 0 a blnme hatas NullPointerException Bir objecte veya metoda yapilmadan nce ulamaya alma. ClassCastException Farkl snftan bir objeyi baka bir snfa atamak. NegativeArraySizeException Negatif uzunlukta bir dizi yaratma hatas OutOfMemoryException Yeni obje yaparken hafzaya smama hatas ArrayIndexOutofBoundsException Dizinin uzunluundan daha fazla olan bir elemana ulamaya alma.

Javada hata idaresi


Hatalar idare edebilmek iin Javann bize verdii iki komut vardr. BY Ahmet Tolga Tat Sayfa 77

try { //tehlikeli kod }catch (exceptionTipi e){ //hata annda yaplacak olan ilem }

rnek:
public void paint (Graphics g) {

try {
g.drawString (Kelimeler [ i ] , 25 , 25) ; } catch (ArrayIndexOutOfBoundsException e) { g.drawString (kelimeler snr d ,25,25) ; i=-1; } i++; }

Kendi Exceptionlarmz Yapma Class BenimHatam extends Exception{} Exceptionmz Atma throw new BenimHatam(); rnek: public void baglaBeni (String serverAdi) throws ServerCevapsizException{ int tamam; int portServer = 80; tamam = open (serverAdi, portServer) ; if (tamam = = -1) { throw new ServerCevapsizException ( ) ; } } veya

public void findServer ( ) { . . ..... try { BY Ahmet Tolga Tat Sayfa 78

baglaBeni (server) ; } catch (ServerCevapsizException e) { g. drawString ( server cevapsz baska deniyorum, 5, 5); try { baglaBeni(baskaServer) ; } catch (ServerCevapsizException e) { g.drawString (serverlarn hibiri cevap vermiyor , 5,5); } } ....}

BY Ahmet Tolga Tat

Sayfa 79

Multithreading
Paralel Kullanim

Multitasking ile Multithreading Arasinda Ne Fark Vardir?


Ilk zamanlarda bilgisayarlar belirli bir anda sadece bir isi yapabilir yetenekteydi. Ornegin, bir labaratuvardaki bilgisayar once fizikci icin dalgalarin gecikme suresiyle ilgili hesabi yapacak, daha sonra kimyaci icin karisim oranlarini hesaplayabilecekti. Tum programlar, belirli bir sira dahilinde ve belirli bir anda bilgisayarin sadece birinin hizmetine verilmesi seklinde calistiriliyordu. Ayni anda birden fazla programin icrasi soz konusu degildi. Bu teknige batch processing denir ve pahali bir bilgisayarin max faydada kullanimi adina oldukca etkili bir yontemdir. Cunku bu yontemde bilgisayarin tum kaynaklari islem yapmak icin kullanilmakta, birden cok is arasinda gelgitler yapilmasindan dolayi gelecek zaman ve performans kaybi engellenmis olacaktir. Fakat batch processing bir sistemin negatif bir yonu de vardir. Ornegin nkleer 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 nkleer modelleme programi ayni anda calistirilabilir. Belki bu nukleer modelleme programi 3gunde degil de 2 haftada tamamlanir ancak her iki iste de yavas ama tatminkar sonuclar elde etmek mumkun olur. Buna karsilik sistemi ayni anda kullanma istegi sadece kullanicilardan gelmez. Ayni zamanda bircok programda birden cok isi bir arada yapma gereksinimi duyabilir. Mesela web gezgininde geri planda bir sayfa yazdirilirken bir pencerede de sayfa yuklenirken formatlanabilir. Iste tek basina bir programin birden fazla isi ayni anda yapabilmesi thread kullanimi sayesinde gerceklesir.

Giris
Java programlama dilininin en onemli ozelliklerinden biri de Multithreaded Mimariyi destekliyor olmasidir. Bu mimari, bir bilgisayar programinin komutlarinin icrasinin kontrolunu ve BY Ahmet Tolga Tat Sayfa 80

iyilestirilmesini sagladigi icin bilgisayar bilimleri acisindan cok guclu ve hatiri sayilir bir gerceklestirim olarak degerlendirilmelidir. Java da bu mimariyi icerisinde barindirma zelligi ile benzerlerinden ayrilan, en cok kullanilan, genel amacli programlama dillerinden biridir. Diger programlama dillerinde olmayan (ancak isletim sisteminin destekledigi) eszamanli calisma prensipleri (concurrency primitives) bu dilin yapisi icerisinde PC uygulama gelistiricisine sunulmaktadir. Uygulama gelistiricinin gorevi, uygulamalari icra bloklarina(threads of execution) ayirmaktir. Burada her blok diger bloklarla es zamanli olacak sekilde kendi basina icra edilir. Iste bu mekanizma multithreading mekanizmasi olarak adlandirilir. Java programlama dilini benzerleri olan C and C++ a gre daha guclu kilacak olan mekanizmada budur. Bu diller, belli bir zamanda ancak bir blogun icra edilmesini desteklemektedir. Es zamanli uygulama gereksinimi duyulabilecek alanlara ornek verelim : Ornegin bir program WWW uzerinden, cok buyuk bir video clip ya da ses clip dosyasini indirirken, dosyanin iceriginin gorulebilmesi icin tamaminin yuklenmesini beklemek kullanici acisindan hic de iyi bir durum degildir. Iste bu durumda coklu icra bloklarina basvurulabilir. Bir icra blogu dosyanin indirilmesi(yuklenmesi) ile mesgul olurken, es zamanli calisan bir baska icra blogu dosyayinin iceriginin goruntulenmesi ile mesgul olabilir. Burada yuklenmis olan dosya parcasinin iceriginin duzgun olarak goruntulenmesi icin icra bloklari arasinda bir koordinasyondan bahsetmek gerekir. Bir baska ornek de; Java ile birlikte gelen otamatik automatic garbage collection yapisidir. Bir garbage collector thread araciligiyla icra edilen programin dinamik olarak bellekte isgal ettigi sahalar yine dinamik olarak kullanilmadigi zaman bir baska is icin kullanilmak uzere serbest birakilir. Bu thread dusuk-oncelikli olarak calismaktadir. Java, dunyanin en populer tasinabilir programlama dillerinden birisi olmasina ragmen bazi belirli kisimlari platform bagimli olarak calismaktadir. Dolayisiyla, coklu thread uygulamalari farki Java implemantasyonlarinda farkliliklar gosterebilir. 32-bit olarak gelistirilen ve Windows 95 ve Windows NT uzerinde calisan Java uygulamalari zaman paylasimli olarak calismaktadir(timesliced). Round-Robin algoritmasinin kullanilmasi ile, her icra blogunun her seferinde bir zaman araligi boyunca icra gormesi saglanmaktadir.

Thread Nedir?
Thread birbirinden ayrik ayni anda meydana gelmekte olan diger olaylardan bagimsiz olarak icra edilebilen kod topluluklaridir. Bir thread, A noktasinda calistirilmaya baslanan ve B noktasina kadar calismaya devam eden klasik bir program olarak nitelendirilebilir. Fakat thread in farkli olabilecek olan yani, yapisinda bir olay dongusune yer vermeyecek olusudur. Bir thread,sistemde meydana gelen diger olaylardan bagimsiz olarak calisir.

Basit bir thread uygulamasi


Thread leri kullandiginiz bir program yazarken herbiri kendi run() metoduna sahip olan farkli farkli programlar yaziyormus gibi dusunebilirsiniz. Kullanacaginiz her thread java.lang.Thread sinifinin bir alt sinifi olacaktir. Asagidaki program threadlerden olusmustur ve -128 ile 127 arasindaki sayilari ekrana yazdirmaktadir. public class BytePrinter extends Thread { BY Ahmet Tolga Tat Sayfa 81

public void run() { for (int b = -128; b < 128; b++) { System.out.println(b); } } } Asagidaki program da tek bir BytePrinter thread inin icrasini saglamak uzere tasarlanmistir : public class ThreadTest { public static void main(String args[]) { BytePrinter bp = new BytePrinter(); bp.start(); } }

Coklu Thread uygulamasi


Asagidaki program da 3 tane BytePrinter thread calistirabilir ozelliktedir: public class ThreadsTest { public static void main(String args[]) { BytePrinter bp1 = new BytePrinter(); BytePrinter bp2 = new BytePrinter(); BytePrinter bp3 = new BytePrinter(); bp1.start(); bp2.start(); bp3.start(); } } Programin cikti sirasi programdan anlasilabilecegi uzere tasarim bagimlidir ve cogunlukla onceden tayin edilemeyecek bir goruntu sergilemektedir. Bu durumda 3 thread biri digerini takip eder sekilde sirayla calistirilir. Buna karsilik bazi sistemlerde de asagidakine benzer bir cikti goruntusu ile karsi karsiya kalinabilir : Bu durumda ise 3 farkli thread den gelen sonuclar kendi aralarinda karismistir. Bazi sistemler biribiri ile koordinasyon icinde calisan thread ler kullanir, bir thread de digerine gecilmesi calismakta olan thread in kontrolu diger thread e aktarmasi yoluyla gerceklesir. Esit oncelikli bir thread bile kendisinden onceki thread in tamamlanmasini beklemek zorundadir. Diger sitemler ise ayni oncelge sahip olan threadler arasinda zaman paylasimi yontemine basvurmaktadir. Bu paylasima ragmen thread lerin ciktilari arasinda bir karisiklik gorulmez.

BY Ahmet Tolga Tat

Sayfa 82

Thread Sinifi-Metotlari
Multithreading mekanizmasi tek basina bircok thread in es zamanli olarak icrasi anlamina geldigini belirttigimize gore, burada thread kavraminin uzerinde biraz daha durulmalidir. Thread, bir process icinde tek basina isletilen icra blogu olarak adlandirilabilir. Bir process kendi bellek uzayinda icra edilen program parcasi olarak tanimlanacak olursa, burada thread lerin kendilerine ait belirli bir adres uzaylari olmadigi belirtilmelidir. Her thread, kendisinin parent ligini yapan processin bellek alanindan faydalanir. Bu sekilde calisan bircok thread ornegi verilebilir. Mesela; Word un icerisinde geri planda otomatik ve eszamanli olarak calisan bir cok thread den bahsetmek mumkundur. Bu thread lerden biri yazilanin imla kontrolunu yaparken, bir digeri yapilan degisiklikleri otomatik olarak dokumana kaydeder. Burada uzerinde durulmasi istenen nokta, her thread in bir process dahilinde icra ediliyor olmasidir. Thread Sinifi bir cok sekilde yapilandirilabilir. Mesela ; public Thread ( String threadName ) ifadesi ismi threadname olan bir thread sinifini insa etmek icin kullanilir. Bir baska ifade ; public Thread() ismi Thread kelimesinin yanina getirilen birer rakam ile Thread1,Thread2 isimli thread lerin insasi icin kullanilir. Bir threadde 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 threadin 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.

Threadin Girebilecegi Durumlar-Hayat Dongusu


Herhangi bir anda bir thread farkli durumlar icerisine girmis olarak nitelendirilebilir ( hread t states). born - ready - running - waiting - sleeping - suspended - blocked - dead Diyelim ki ; thread imiz born durumunda. start metodu cagirilincaya dek thread in icinde bulundugu surecdir ve thread in ready durumuna gecmesini saglar. Sistem islemcisinden bir thread icrasi istediginde, en yuksek-oncelige sahip olan ready durumundaki thread running durumuna gecmeye hak kazanir ve icra edilir. Bu thread, dead durumuna iki sekilde ulasabilir : Ilki run metodu tamamlandigi zaman, ikincisi stop metodu cagrildigi zaman. dead durumuna giren bir thread zaman icerisinde sistemden uzaklastirilacaktir. running durumunda olan bir thread bir I/O isteginin gelmesi durumunda blocked durumuna gececektir. blocked durumuna sokulmus olan bir thread istedigi I/O islemi gerceklesir gerceklesmez tekrar ready durumuna girecektir. Belirli bir thread in sleep metodu cagrildiginda bu thread sleeping durumuna gececektir. Uyku moduna girmis bir thread belirlenen uyku suresi biter bitmez tekrar ready durumuna girer.

Icra edilmekte olan bir thread in suspend metodu cagirilirsa, ilgili metot suspended durumuna girecektir. Askiya alinmis bir thread baska bir thread, resume metodunu cagirinca tekrar ready durumuna girer.
Calistirilmakta olan bir thread e ait wait metodu cagrildiginda ise bu thread waiting durumuna girecektir ve wait metodunun cagrildigi objeye ait olarak tutulan bir kuyrukta saklanacaktir. Bu obje ile ilintili bir baska thread bu kuyrukta bekleyen ilk thread e bir notify gondererek bu threadin tekrar ready durumuna gecmesine sebep olur.

Thread ncelikleri ve Thread Zamanlamasi


Her Java appleti ya da uygulamasi multithreaded ozelliktedir. Her Java thread i de derecelendirme acisindan bir oncelige sahip olmalidir. Thread. MIN_PRIORITY (1 sabit degeri) and Thread. MAX_PRIORITY (10 sabit degeri). Default olarak, her thread e bir oncelik verilirThread. NORM_PRIORITY (5 sabit degeri). Yeni bir thread yaratildiginda onceligi, kendisini tureten threadden miras alinir. Bazi Java pla tformlari timeslicing mekanzimasini desteklerken bazilari etmez. Timeslicing olmadiginda, esit oncelige sahip olan bir grup thread icerisindeki bir thread icra edilirken digerleri icra edilme sanslarini (o an icin) yitirmis olurlar. Ote yandan timeslicing oldugu zaman, her thread quantum denilen zaman dilimleri sayesinde icra edilebilmeleri icin islemciden faydalanabilirler. Her quantum suresinin tamamlanmasinda, BY Ahmet Tolga Tat Sayfa 84

ilgili thread icrasini tamamlamamis bile olsa, islemci bu icra isleminden alinarak, icra edilmeyi bekleyen bir diger esit-oncelikteki thread in islenmesi icin kullanima atanir. Java scheduler in gorevi ise her zaman en yuksek-oncelikli thread in icra edilmesinin saglanmasidir. Eger timeslicing mekanzimasi mevcutsa scheduler, her thread in round-robin algoritmasi kapsaminda belirlenen quantumlar suresince icra edilmesini duzenler. Dusukoncelikli thread lerin oncelikleri sebebiyle ertelenmesi starvation denilen bir problemi gundeme getirecektir. Belirli bir thread in onceligi, bir tamsayi degeri donduren setPriority metodu ile belirlenir. Eger dondurulen deger ( 1 - 10 ) araliginda degilse, setPriority metodu IllegalArgumentException geri dondurur. getPriority metodu cagrilinca, ilgili thread in onceligi geriye dondurulur. Bir thread yield metodunu cagirmak suretiyle diger thread lere icra icin bir sans vermis olur. Aslinda yuksek-oncelikli bir thread ready olur olmaz, mevcut thread geri plana itilerek yeni gelen threade oncelik taninir. Dolayisi ile bir thread kendisinden daha yuksek bir oncelige sahip olan ready bir thread e yield metodu ile cagirim yapamaz. Benzer sekilde, yield metodu herzaman en yuksek-oncelikli ready durumdaki thread in isletilmesini sagladigi icin, sadece geriye kalan threadlerin hepsinin daha dusuk-oncelikte olduklari durum ic in mevcut thread en yuksek oncelige sahip olmus olacaktir. Bu sebepten dolayi, bir thread in yield metodu sayesinde esit-oncelikli thread lere icra sansi verdigi soylenebilir. Zaman paylasimli (timesliced) bir sistemde herhangi bir threadin yield metodu ile diger esit-oncelikli threadlere icra hakki tanimasi gereksizdir. Cunku Round-Robin algoritmasi sagladigi quantum mekanizmasi sayesinde bu durumu kapsamaktadir. Oyleyse, yield metodu zaman paylasimsiz (non-timesliced) sistemler icin uygun olacaktir. Boyle bir sistemde, esit-oncelikli bir thread in icra edilebilmesi icin bir diger esit-oncelige sahip thread in icrasini tamamlamis olmasi gerekir. Herhangi bir threadin icrasi, oldurulene dek, ya da I/O icin bloke edilene dek, ya da sleep, yield metodlari cagrilincaya dek, ya da daha- yuksek oncelikte bir thread tarafindan geri plana itilene dek, ya da zaman quantumu tamamlanana dek surdurulur. Mevcut thread den daha yuksek bir oncelige sahip olan bir thread suspended durumdan resume edilerek ready durumuna getirilebilir ya da sleeping durumundaki bir thread uyku modundan cikarak ready olabilir, ya da beklenen I/O islemi sonuclandiysa bloke edilmis olan thread tekrar ready konumuna donebilir, ya da waiting durumundaki bir thread notify veya notifyAll metodlarindan biri ile cagrildiysa ready durumuna gecer. Asagidaki Program Chris in onceligini Mary'den daha yuksek, Marynin onceligini de Frank'tan daha ustun tutmustur. Buna gore Chris calismaya en son, ve Frank da calismaya ilk baslasa bile, Chris calismasini Mary den once Mary de Frankdan once tamamlamis olacaktir. rnek: public class MixedPriorityTest { public static void main(String args[]) { NamedBytePrinter bp1 = new NamedBytePrinter("Frank"); NamedBytePrinter bp2 = new NamedBytePrinter("Mary"); NamedBytePrinter bp3 = new NamedBytePrinter("Chris"); bp1.setPriority(Thread.MIN_PRIORITY); bp2.setPriority(Thread.NORM_PRIORITY); bp3.setPriority(Thread.MAX_PRIORITY); bp1.start(); bp2.start(); bp3.start(); }
}

BY Ahmet Tolga Tat

Sayfa 85

Asagida ise bazi temel threading tekniklerinden olusan bir Java uygulamasi verilmistir. Burada Thread sinifindan bir nesne yapilmasi, bu Thread nesnesinin insasi ve bu Thread sinifinin sleep metodunun kullanilmasi gorulmektedir. Programda her thread rastgele 0 ile 5 arasinda belirlenen zaman dilimlerinden sonra isimlerini gostermektedirler. Bu program PrintThread ve PrintTest adinda iki tane sinif icermektedir : rnek: public class PrintTest{ public static void main(String args[] ) { PrintThread thread1,thread2,thread3,thread4; thread1=new PrintThread( "1" ); thread2=new PrintThread( "2" ); thread3=new PrintThread( "3" ); thread4=new PrintThread( "4" ); thread1.start(); thread2.start(); thread3.start(); thread4.start(); }} rnek: class PrintThread extends Thread{ int sleepTime;
public PrintThread(String id) { super(id); sleepTime = (int) (Math.random() * 5000); System.out.println( "Isim: " + getName() + "; sleep: " + sleepTime ); } public void run() { try { sleep(sleepTime); } catch(InterruptedException exception) { System.err.println( "Exception: " + exception.toString() ); } System.out.println( "Thread " +getName() ); } }

Thread eszamanlama
Java thread eszamanlama islemini gerceklestirebilmek icin monitor Synchronized(eszamanlanmis) metotlari olan her nesne bir monitor nesnesidir. BY Ahmet Tolga Tat ler kullanir. Sayfa 86

Monitor her seferinde ilgili nesnenin eszamanli metotlarindan birini calistirmak ile gorevlidir. Bu eszamanli metotlarin calistirilmasi ilgili nesnenin locking edilmesi ile saglanir. Eger bir nesnenin birden fazla eszamanli metodu varsa; belirli bir anda sadece o nesneye ait bir metot calistirilabilir. Diger metotlari kullanmak isteyen eszamanli thread ler beklemek zorundadir. Bir synchronized metodun calistirilmasi sona erince, o nesnenin lock ozelligi ortadan kaldirilir. Bundan sonra da monitor, en yuksek-oncelige sahip olan ready thread in eszamanli metodunun icrasina firsat verecektir. Asynchronized (Eszamansiz) modda calismakta olan bir thread calisamayacagina karar verebilir ve gonullu olarak wait bekleme durumuna gecebilir. Bu karar, bu thread in monitor nesnesinin denetiminden cikmasi anlamina gelir. Bundan sonra, ilgili thread diger threadlerin monitor nesnesinden faydalanmasina firsat vermek uzere bir kuyruga girerek beklemeye baslar. Eszamanli bir metodu icra eden bir baska thread isini bitirince, monitor nesnesi beklemekte olan bir thread in tekrar ready durumuna girmesini saglar. Ayni zamanda nesnenin bir baska threadi calistirmamasi icin lock edilmesi olayi gerceklestirilir. Iste bu esnada notify metodu bekleme durumunda olan thread in bekledigi kosulun saglandigi ve tekrar monitore girebilecegine dair habercilik gorevini gorur. Eger bir thread notify yerine notifyAll metodunu cagirirsa bu durumda nesneyi bekleyen tum threadler monitore girebilmek icin uyanirlar. Monitor, eszamanli metotlari calistirabilmek icin bekleyen tum threadleri bir kuyruga sokar. Eger bir baska nesne, kuyrukta beklemekte olan thread in calistirmak istedigi metodu zaten kullanmata ise bu thread kuyruktan alinir ve sira ona gelmis olur. Bir diger yol da nesnenin icinde aktif olan thread in wait durumuna girmesidir, onun yerine de kuyrukta thread isleme koyulur. Monitor eszamanli bir metodun icrasinin tamamlar tamamlamaz, sira diger metotlara gelir. wait durumunda beklemekte olan threadlerin aktive edilmesi bir baska thread in notify ya da notifyAll metodlarindan birini cagirmasi yoluyla gerceklesir. Eger monitor bir baska thread e servis verme durumuna girmisse bu durumda scheduler en yuksek-oncelikli thread i secer ve icra edilmesini saglar.

Eszamanli olmayan Thread ler ile Servis Veren/Servis Alan Iliskisi Servis Veren/Servis Alan iliskisinde servis veren thread servis verdigi thread icin cagirdigi produce metodu karsiliginda servisi alan tarafindan paylasilir bir bellek alani olan buffer daki son mesaji almamis oldugunu gormesi sonucu servis veren taraf wait metodunu cagiracaktir. Servis almak isteyen taraf da buna karsilik mesaji okudugunda servis verecek olan thread e servis almaya hazir oldugunu belirtmek uzere notify mesaji gonderecektir. Paylasima acik olan bellekteki bu mesaj bilgisi, bircok thread tarafindan bellege yapilan erisimlerin zamanlanmamasi sonucunda bozulabilir. Dolayisi ile bu erisimlerin belirli bir duzene oturtulmasi gerekecektir. Eger servis almak isteyen thread, servis verecek thread var olan mesaji okuyup degerlendirmeden once bir yenisini koyarsa bilgi kaybolacaktir ya da bozulacaktir.

Asagidaki uygulama bu duruma ornek gosterilebilir :


//SharedCell.java source public class SharedCell{ public static void main(String args[]){ HoldInteger h = new HoldInteger(); ProduceInteger p = new ProduceInteger(h);

BY Ahmet Tolga Tat

Sayfa 87

ConsumeInteger c = new ConsumeInteger(h); p.start(); c.start(); } } class ProduceInteger extends Thread { private HoldInteger pHold; public ProduceInteger(HoldInteger h){ pHold=h; } public void run(){ for (int count=0;count < 10;count++){ pHold.setSharedInt( count ); System.out.println( "Producer set sharedInt to " + count ); //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e){ System.err.println( "Exception " + e.toString() ); } } } } class ConsumeInteger extends Thread { private HoldInteger cHold; public ConsumeInteger(HoldInteger h){ cHold=h; } public void run(){ int val; val=cHold.getSharedInt(); System.out.println( "Consumer retrieved "+val); while (val!=9){ //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e) { System.err.println( "Exception " + e.toString() ); } val=cHold.getSharedInt(); System.out.println( "Consumer retrieved " + val ); } } } class HoldInteger{ private int sharedInt; public void setSharedInt( int val ) {sharedInt=val;} public int getSharedInt() { return sharedInt;} }

Bu program 4 adet sinif nesnesi kullanmaktadir-SharedCell, ProduceInt, ConsumeInteger and HoldInteger. Bu ornekte; (Program ciktisindan da gorup degerlendirebileceginiz uzere) paylasima acik olan bilgilere birden cok thread tarafindan eszamanli olarak erisim sonucunda ortaya cikabilecek hatali sonuclar gorulebilmektedir. Bu problemi cozebilmek icin, erisim isteyen servis verici ve servis alici thread ler arasinda bir synchronize(zamanlama) mekanzimasi gerceklestirilmelidir. Bu mekanizmadan kasit; paylasima acik olan bilgilere ulasmak isteyen her metot synchronized anahtar kelimesi ile birlikte gecirilmesidir. BY Ahmet Tolga Tat Sayfa 88

Eszamanli Threadler ileServis Veren/Servis Alan Iliskisi


Asagida verilmis olan ornek, yukaridaki ornegin eszamanli hale getirilmis versiyonudur. //SharedCell.java source //with thread synchronization public class SharedCell{ public static void main(String args[]){ HoldInteger h = new HoldInteger(); ProduceInteger p = new ProduceInteger(h); ConsumeInteger c = new ConsumeInteger(h); p.start(); c.start(); } } class ProduceInteger extends Thread { private HoldInteger pHold; public ProduceInteger(HoldInteger h){ pHold=h; } public void run(){ for (int count=0;count < 10;count++){ pHold.setSharedInt( count ); System.out.println( "Producer set sharedInt to " + count ); //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e){ System.err.println( "Exception " + e.toString() ); } } } } class ConsumeInteger extends Thread { private HoldInteger cHold; public ConsumeInteger(HoldInteger h){ cHold=h; } public void run(){ int val; val=cHold.getSharedInt(); System.out.println( "Consumer retrieved "+val); while (val!=9){ //sleep for a random interval try{sleep( (int) (Math.random() * 3000) ); } catch(InterruptedException e){ BY Ahmet Tolga Tat Sayfa 89

System.err.println( "Exception " + e.toString() ); } val=cHold.getSharedInt(); System.out.println( "Consumer retrieved " +val ); } } } class HoldInteger{ private int sharedInt; private boolean writeable =true; public synchronized void setSharedInt( int val ) { while (!writeable){ try{wait();} catch(InterruptedException e){ System.err.println( "Exception : " + e.toString() ); } } sharedInt=val; writeable=false; notify(); } public synchronized int getSharedInt() { while (writeable){ try{wait(); } catch(InterruptedException e){ System.err.println("Exception:"+e.toString() ); } } writeable=true; notify(); return sharedInt; } }

Servis veren/Servis Alan Iliskisi-Dairesel Gecici Bellek


Eszamanli Thread ler ile Servis veren/Servis Alan Iliskisi bolumunde verilen ornek programda servis alan ve veren her iki tur metot da erisimi dogr u bir sekilde gerceklestirmektedir fakat bu yaklasim performans acisindan iyi bir sonuc sergileyemeyecektir. Bunun sebebi de thread lerin eszamansiz (asynchronously) olarak calisiyor olmasidir. Bu durumda bu thread lerin birbirlerine kiyasla icra hizlari onceden tayin edilemez. Eger servis veren taraf, servisi servis alan tarafin alabilecegi hizdan daha hizli bir sekilde vermek istiyorsa bunu yapamaz. Iste boyle bir durumu mumkun kilabilmek icin dairesel bir gecici bellek (circular buffer) kullanimina gidilir. BY Ahmet Tolga Tat Sayfa 90

Daemon Threadler
Calisma zamani platformunu desteklemek uzere geri planda calismakta olan threadler daemon thread lerdir Mesela, clock handler thread, idle thread, garbage collector thread, screen updater thread, ve garbage collector thread leri daemon thread lerdir. Sistem tum non-daemon thread ler tamamlanir tamamlanmaz kapanir. public final void setDaemon(boolean isDaemon) public final boolean isDaemon() Default olarak yarattiginiz bir thread, daemon bir thread degildir. Fakat setDaemon(true) metodunu kullanmak suretiyle thread in daemon olmasi saglanabilir.

Thread Gruplar
Thread ler, gruplara gore organize edilebilir. Her thread grubu ise birbiri ile iliskili bir dizi thread den meydana gelir. Ornegin, bazi guvenlik sebeplerinden dolayi bir applet sadece kendi thread grubuna mensup olan threadleri kullanma hakkina sahiptir. Dolayisi ile bir applet sistemin garbage collection thread ini devre disi birakamaz. Thread gruplari da kendi aralarinda parent and children hiyerarsik yapisina sahiptirler. Asagidaki program da su metotlari kullanarak tum aktif thread leri yazdirir : java.lang.Thread sinifina ait getThreadGroup() metodu ve java.lang.ThreadGroup sinifina ait getParent() metodu. (Bu metotla en ust seviyedeki thread grubuna ulasiliyor.); daha sonra da enumerate ile main thread grubundaki tum thread ler ve cocuklari (tum gruplari kapsayan). rnek: public class AllThreads { public static void main(String[] args) { ThreadGroup top = Thread.currentThread().getThreadGroup(); while(true) { if (top.getParent() != null) top = top.getParent(); else break; } Thread[] theThreads = new Thread[top.activeCount()]; top.enumerate(theThreads); for (int i = 0; i < theThreads.length; i++) { System.out.println(theThreads[i]); } } } Thread lerin gercek listesi, sistemden sisteme degisiklikler gosterecektir fakat asagidakine benzer bir cikti muhtemeldir : BY Ahmet Tolga Tat Sayfa 91

Thread[clock handler,11,system] Thread[idle thread,0,system] Thread[Async Garbage Collector,1,system] Thread[Finalizer thread,1,system] Thread[main,1,main] Thread[Thread-0,5,main]

Runnable Interface (Calistirilabilir Arayz)


Java, coklu kaltimi (multiple inheritance) desteklemeyen bir yapiya sahiptir. Buna karsilik, coklu kalitim yoluyla gelen anahtar avantajlardan birini, daha basit olarak arayuzler interfaces sayesinde saglamis olur. public class Thread extends Object implements Runnable Calistirilabilen bir arayuz (runnable interface) insa etmek suretiyle olusturacagimiz yeni sinifa calsitirilabilir nesne (runnable object) ozelligi kazandirilmis olunur. Olusturdugumuz yeni sinif threadini asagidaki sekilde ifade ederiz : public Thread ( Runnable runnableObject) bu siniftan turetilen bir nesneye yapilan referans ile calistirilabilir arayuzun olusturulmasi. Asagidaki ifade; public Thread (Runnable runnableObject, String threadName) threadName isminde bir thread yaratir ve bu threade ait run metodunu thread icrasi icin runnableObject parametresi ile birlikte gecirir. Ornek olarak bir applet sinifi verilmistir,

Animasyonlar
Animasyonlar, Runnable interface kullanmanin ana nedenlerini gosteren en iyi ornektir. Java da bir nesneyi animate edebilmek icin, successive frameleri hesaplayan bir thread yaratilmalidir. Daha sonra da ekranin bicimsel gorunusu ile ilgilenen repaint() cagirilmalidir. Paint metodu icerisine sonsuz bir dongu de yerlestirilmesi mumkundur, fakat bu yontem oldukca sakincalidir. Asagida bir kutu icerisinde ziplayan bir toptan olusan basit bir animasyon ornegi verilmistir. Kirmizi top sadece buyuk bir daire olacak. Koordinatlari ball olarak tanimlanan java.awt.Rectangle alani icerisinde belirlenecek. paint() metodu ise sadece bu alana uygu olarak cikti goruntusunu belirleyecek. Buradaki run() metodu ise hareketin olusturulacagi yerdir. Topun koordinatlari burada yukseltilmeli, ardindan topun belirlenen alan disina cikip cikmadiginin kontrolu yapilmalidir. Eger top sinirlar disna cikma egilimi gosterirse bu durumda yonu ters cevrilmelidir : rnek: import java.awt.*; import java.applet.*; BY Ahmet Tolga Tat Sayfa 92

public class Bounce extends Applet implements Runnable { Rectangle r; int x_increment = 1; int y_increment = 1; public void init () { r = new Rectangle( 30, 40, 20, 20); Thread t = new Thread(this); t.start(); } public void paint (Graphics g) { g.setColor(Color.red); g.fillOval(r.x, r.y, r.width, r.height); } public void run() { while (true) { // infinite loop r.x += x_increment; r.y += y_increment; if (r.x >= size().width || r.x < 0) x_increment *= -1; if (r.y >= size().height || r.y < 0) y_increment *= -1; repaint(); } } }

BY Ahmet Tolga Tat

Sayfa 93

BY Ahmet Tolga Tat

Sayfa 94

Java Utilities
Paketi ve Bit ilemleri
Bu blmde java.util paketindeki bazi utilility class'lari incelenecektir. Ilk nce Vector class'i incelenecektir. Vector class'i array benzeri bir yapidir ve dinamik olarak byyp klebilmektedir. Programda veri saklamak iin kullanilir. Ayrica vector'lerin Enumeration zelliklerini kullanacagiz. Enumeration vector'n ierigini 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 iin 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 blmlerde Random class'ina gz atacagiz. Bu class Math.random ile bize saglanan rastgele sayi retiminden daha zengin bir sayi retimi saglar. Son olarak da bit islemlerini ayrinitili bir sekilde inceleyecek ve bize bit array benzeri yapi saglayan BitSet class'ini inceleyecegiz.

Vector Class'i ve Enumeration zelligi


Java dahil birok programlama dilindeki arraylar statik bir yapiya sahiptir ve programin veri sahasi ihtiyacinin artip azalmasina gre degismezler. Dolayisiyla bazi sorunlar ikar. Buna karsilik Vector class'i alisma esnasinda kapasitesi degisebilen bir yapi sunar ve bu problemleri ortadan kaldirir. Vector, herhangi bir anda ya kapasitesi kadar yada daha kapasitesinin daha altinda veri bulundurur. Kapasite Vector iin bellekte ayrilmis olan yerdir. Vector'deki veri sayisi kapasitesinden azken yeni bir eleman eklemek hizli bir operasyondur. Veri sayisi kapasiteye esitken veri eklemek kapasiteyi artiracagindan yavas bir operasyondur. Eger herhangi bir kapasite artisi verilmediyse Vector kapasitesi default olarak iki katina ikarilacaktir.

BY Ahmet Tolga Tat

Sayfa 95

Vector'ler objelere referans tutmalari iin tasarlanmistir. Dolayisiyla herhangi bir tip objeye ait bir referans Vector'de tutulabilir. Eger birincil veri tipleri( Integer, Load, . . . ) tutulmak isteniyorsa Vector'lerde, ierisinde birincil veri tipi bulunan nesneler olusturmak durumundayiz. Asagida Vector class'ini kullanan rnek applet'i inceleyebilirsiniz. Bu applet'de her is iin bir buton konmustur. TextField'i kullanarak applet'in alismasini deneyebilirsiniz. rnek: Vector Kullanan Applet import java.util.*; import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class VectorTest extends Applet implements ActionListener { private Vector v; //Grsel elemanlar private TextField input; private Button ekleBtn, silBtn, ilkBtn, sonBtn, bosBtn, mevcutBtn, konumBtn, trimBtn, statsBtn, displayBtn; public void init() { v = new Vector(1); add( new Label("Bir string giriniz: ")); input = new TextField(10); add(input); //Eklenecek, silinecek veya konumu bulunacak deger ekleBtn= new Button("Ekle"); ekleBtn.addActionListener(this); add(ekleBtn); //Girilen string ekleniyor silBtn= new Button("Sil"); silBtn.addActionListener(this); add(silBtn); //Girilen string bulunup siliniyor ilkBtn= new Button("Ilk"); ilkBtn.addActionListener(this); add(ilkBtn); //Ilk string grntleniyor sonBtn= new Button("Son"); sonBtn.addActionListener(this); add(sonBtn); //Son string grntleniyor bosBtn= new Button("Bos"); bosBtn.addActionListener(this); add(bosBtn); //Vector'n bos olup olmadigi sorgulaniyor BY Ahmet Tolga Tat Sayfa 96

mevcutBtn= new Button("Mevcut"); mevcutBtn.addActionListener(this); add(mevcutBtn); //Girilen stringin var olup olmadigi sorgulaniyor konumBtn= new Button("Konum"); konumBtn.addActionListener(this); add(konumBtn); //Girilen stringin konumu greniliyor trimBtn= new Button("Trim"); trimBtn.addActionListener(this); add(trimBtn); //Vector kapasitesi size'ina ekiliyor statsBtn= new Button("Istatistikler"); statsBtn.addActionListener(this); add(statsBtn); //Istetistikler gsteriliyor displayBtn= new Button("Grntle"); displayBtn.addActionListener(this); add(displayBtn); //Vector'n ierigi grntleniyor } public void actionPerformed( ActionEvent e) { if (e.getSource()== ekleBtn) { v.addElement( input.getText() ); showStatus( "Sona eklendi: " +input.getText() ); } else if (e.getSource()==silBtn) { if (v.removeElement(input.getText())) showStatus(" Silindi: "+input.getText()); else showStatus( input.getText()+" vector'de degil"); } else if (e.getSource()== ilkBtn) { try { showStatus("Ilk eleman: " + v.firstElement()); } catch (NoSuchElementException exception ) { showStatus ( exception.toString()); } } else if (e.getSource()== sonBtn) { try { showStatus("Son eleman: " + v.lastElement()); } catch (NoSuchElementException exception ) { showStatus ( exception.toString()); } BY Ahmet Tolga Tat Sayfa 97

} else if (e.getSource() == bosBtn) { showStatus(v.isEmpty() ? "Vector Bos" : "Vector bos degil"); } else if (e.getSource()==mevcutBtn) { String searchKey = input.getText(); if (v.contains( searchKey) ) showStatus(searchKey + " vectorde mevcut" ); else showStatus(searchKey + " vectorde mevcut degil"); } else if (e.getSource()==konumBtn) { showStatus("Eleman "+ v.indexOf(input.getText())+" konumunda"); } else if (e.getSource()== trimBtn) { v.trimToSize(); showStatus(" Vectorn kapasitesi eleman sayisina ekildi"); } else if (e.getSource()==statsBtn) { showStatus("Eleman sayisi= " + v.size() +"- kapasite = " +v.capacity()); } else if (e.getSource()== displayBtn) { Enumeration enum= v.elements(); StringBuffer buf = new StringBuffer(); while ( enum.hasMoreElements()) buf.append(enum.nextElement()).append(" "); showStatus( buf.toString()); } input.setText(""); } }

rnegin kodunu incelediyseniz kodu incelemeye geebiliriz. Appletin init metodu asagidaki ifade ile yeni bir vector yaratmaktadir. Vector v = new Vector( 1 ); Bu ifade ile vector 1 kapasitesinde olusturulmustur. Vector'un her kapasite artisi ihtiyacinda vector kapasitesi iki katina ikarilacaktir. Eger parametre kullanilmasaydi 10 ilk kapasitesi ile olusturulacakti. Ayrica ikinci parametre de kullanilabilirdi. Bu ikinci parametre de kapasite artisidir. v.addElement( input.getText() ); Yukaridaki ifade addElement metodunu kullanmaktadir ve Vector'e yeni eleman eklemektedir. Ayrica insertElementAt metodu da vardir. Bu method Vector istenilen yerden eklemeyi saglar. setElementAt metodu ise herhangi bir yerdeki elemani degistirmeye yarar. v. removeElement(); Yukaridaki ifade ise Vector'deki ilk elemani silmektedir. Eger eleman silinebilirse metod true degerini dndrr. Eger eleman bulunamazsa false degerini dndrr. 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 iin kullanilir. v. firstElement(); Bu ifade Vector'deki ilk elemana referans dndrmektedir. 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 dndrmesidir. v. isEmpty(); Bu ifade eger Vector bossa true degerini aksi takdirde false degerini dndrr. v. contains(searchKey); Bu metod ise searchKey eger Vector de var ise true yok ise false degerini dndrmektedir. Bu metod objenin equals metodunu kullanmaktadir. Bunun amaci bir esitligin var olup olmadigini kontrol etmekdir. v. indexOf( input.getText() ); Bu ifade ise Vector'n indexOf metodunu kullanmaktadir. Girilen elemanin indexini dndrr. Eger girilen eleman bulunamazsa -1 degerini dndrr. 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 dndrr. Enumeration enum = v. elements() Bu ifade Vector'n elemanlarindan olusan bir Enumeration olusturur. Enumeration Vectorun elemanlarinin gezilmesini saglar. enum.hasMoreElements(); enum.nextElement(); Bu ifadeler Enumeration da eleman kalip kalmadigini sorgulamak ve bir sonraki elemana ilerlemek iin kullanilir. Vector'ler hakkinda daha ok bilgi iin Java API dkmantasyonunu inceleyebilirsiniz

Stack Class'i
17. Blmde veri yapilarinin nasil olusturulacagini grdk. Tekrar kullanim bizim iin nemli bir konu oldugu iin bu blmde yeniden yazmak yerine java.util ierisindeki 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 ieren rnek applet'i inceleyebilirsiniz. rnek: Stack Kullanan Applet import java.util.*; import java.awt.*; import java.awt.event.*; import java.applet.Applet; BY Ahmet Tolga Tat Sayfa 99

public class StackTest extends Applet implements ActionListener { private Stack s; //Grsel elemanlar private TextField input; private Button pushBtn, popBtn, peekBtn, bosBtn, aramaBtn, goruntuleBtn; public void init() { s = new Stack(); add( new Label("Bir string giriniz: ")); input = new TextField(10); input.addActionListener(this); add(input); //Push edilecek veya aranacak string pushBtn= new Button("Push"); pushBtn.addActionListener(this); add(pushBtn); //Girilen tepeye string ekleniyor popBtn= new Button("Pop"); popBtn.addActionListener(this); add(popBtn); //tepedeki string aliniyor peekBtn= new Button("Peek"); peekBtn.addActionListener(this); add(peekBtn); //Tepedeki string'in degeri greniliyor bosBtn= new Button("Bos"); bosBtn.addActionListener(this); add(bosBtn); //Stack'in bos olup olmadigi sorgulaniyor aramaBtn= new Button("Arama"); aramaBtn.addActionListener(this); add(aramaBtn); //Girilen stringin var olup olmadigi greniliyor goruntuleBtn= new Button("Grntle"); goruntuleBtn.addActionListener(this); add(goruntuleBtn); //Stack'in ierigini grntlyor } public void actionPerformed( ActionEvent e) { if (e.getSource()== pushBtn) showStatus("Push edildi: "+s.push(input.getText())); BY Ahmet Tolga Tat Sayfa 100

else if (e.getSource()==popBtn) { try { showStatus("Pop edildi: "+s.pop()); } catch (Emp tyStackException exception) { showStatus( exception.toString()); } } else if (e.getSource()== peekBtn) { try { showStatus( "Tepedeki: "+ s.peek()); } catch (EmptyStackException exception) { showStatus( exception.toString()); } } else if (e.getSource()== bosBtn) { showStatus( s.empty() ? "Stack bos" : "Stack bos degil"); } else if (e.getSource()==aramaBtn) { String searchKey = input.getText(); int result = s.search(searchKey); if (result==-1) showStatus( searchKey + "Bulunamadi"); else showStatus( searchKey +" "+result+" indexinde bulundu"); } else if (e.getSource()== goruntuleBtn) { Enumeration enum =s.elements(); StringBuffer buf = new StringBuffer(); while (enum.hasMoreElements()) buf.append( enum.next Element()).append(" "); showStatus(buf.toString()); } } } Simdi biraz programin kodunu inceleyelim. s.push(); Bu ifade Stack'in tepesine yeni bir eleman ekler. s.pop(); Bu ifade Stack'in tepesindeki elemani siler ve o elemanin referansini dndrr. Eger elaman yoksa EmptyStackException olusturur. s. peek(); Bu ifade de . Stack'in tepesindeki elemana bir referans dndrr. Bu metodun pop'dan farki referans dndrdg elemani silmemesidir. BY Ahmet Tolga Tat Sayfa 101

s.empty(); Bu metod Stack'in bos olum olmadigini sorgulamak iin kullanilir. int result = s.search( searchKey ); Yukaridaki ifade searchKey ile girilen elemanin Stack'da olup olmadigini sorgular. Eger eleman Stack'da ise result degerine indexi aktarilir. Eger eleman Stack'da yoksa result'a -1 atanir. Stack class'i Vector class'ini inherit etmektedir. Bu nedenle de Enumeration zelligi her ikisinde de kullanilabilmektdir.

Dictionary Class'i
Bir Dictionary anahtarlari degerler dndrr. 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 yntemi siradan programclar iin kullanimi biraz zor bir yntemdir. Java Hashtable adli class'i kullanma sunarak programclari ayrintilairini dnmeden Hashtable kullanma firsatini vermitir. table = new Hashtable ( ); Yukaridaki ifade kapasitesi 101 eleman ve dolma faktr .75 olan bos bir Hashtable yaratir. Dolma faktor asilacagi, zaman tablo otomatik olarak byr. Hashtable'a parametre yardm ile kapasitesi ve dolma faktr belirtilebilir. Asagida rnek appleti inceleyebilirsiniz.

rnek: Hashtable Kullanan Applet

import java.util.*; import java.awt.*; import java.applet.Applet; public class HashtableTest extends Applet { Hashtable table; Label name1, name2; TextField fName, lName; TextArea display; Button put, get, remove, empty, containsKey, containsObj, clear, listElems, listKeys; public void init() { table = new Hashtable(); name1 = new Label( "First name" ); fName = new TextField( 10 ); name2 = new Label( "Last name (key)" );

BY Ahmet Tolga Tat

Sayfa 102

lName = new TextField( 10 ); display = new TextArea( 4, 45 ); put = new Button( "Put" ); get = new Button( "Get" ); remove = new Button( "Remove" ); empty = new Button( "Empty" ); containsKey = new Button( "Contains key" ); containsObj = new Button( "Contains object" ); clear = new Button( "Clear table" ); listElems = new Button( "List objects" ); listKeys = new Button( "List keys" ); add( name1 ); add( fName ); add( name2 ); add( lName ); add( display ); add( put ); add( get ); add( remove ); add( empty ); add( containsKey ); add( containsObj ); add( clear ); add( listElems ); add( listKeys ); } public boolean action( Event e, Object o ) { if ( e.target == put ) { Employee emp = new Employee( fName.getText(), lName.getText() ); Object val = table.put( lName.getText(), emp ); if ( val == null ) showStatus( "Put: " + emp.toString() ); else showStatus( "Put: " + emp.toString() + "; Replaced: " + val.toString() ); } else if ( e.target == get ) { Object val = table.get( lName.getText() ); if ( val != null ) showStatus( "Get: " + val.toString() ); else showStatus( "Get: " + lName.getText() + " not in table" ); } else if ( e.target == remove ) { Object val = table.remove( lName.getText() ); if ( val != null ) showStatus( "Remove: " + val.toString() ); else showStatus( "Remove: " + lName.getText() + " not in table" ); } else if ( e.target == empty ) { showStatus( "Empty: " + table.isEmpty() );

BY Ahmet Tolga Tat

Sayfa 103

} else if ( e.target == containsKey ) { showStatus( "Contains key: " + table.containsKey( lName.getText() ) ); } else if ( e.target == containsObj ) { showStatus( "Contains object: " + table.contains( new Employee( fName.getText(), lName.getText() ) ) ); } else if ( e.target == clear ) { table.clear(); showStatus( "Clear: Table is now empty" ); } else if ( e.target == listElems ) { StringBuffer buf = new StringBuffer(); for ( Enumeration enum = table.elements(); enum.hasMoreElements(); ) buf.append( enum.nextElement() ).append( '\n' ); display.setText( buf.toString() ); } else if ( e.target == listKeys ) { StringBuffer buf = new StringBuffer(); for ( Enumeration enum = table.keys(); enum.hasMoreElements(); ) buf.append( enum.nextElement() ).append( '\n' ); display.setText( buf.toString() ); } return true; } } class Employee { private String first; private String last; public Employee( String fName, String lName ) { first = fName; last = lName; } public String toString() { return first + " " + last; } }

Object val = table.put ( lName.getText ( ), emp ); Bu ifade Hastable'in put adli metodunu kullanarak anahtari ve degeri Hashtable'a ekler. Object val = table.get ( lName.getText ( ) );

BY Ahmet Tolga Tat

Sayfa 104

Bu ifade get metodunu kullanarak parametre olarak gnderilen key'e sahip veriyi dndrr eger o key de veri yoksa null dndrr.

Object val = table.remove ( lName.getText ( ) ); Bu ifade ise parametre olarak yollanan key li eleman siler ve referans ini dndrr. Eger elemani bulamazsa null dndrr. table.isEmpty ( ); Ifadesi Hashtable'in bo olup olmadigini kontrol eder. table.containsKey ( lName.getText ( ) ); Ifadesi ise parametre olarak girilen key li elemanin Hashtableda olup olmadigini kontrol eder. table.clear ( ); Metodu ile Hashtable temizlenir. table.elements ( ); table.keys ( ); Bu ifadeler yardimi ile de table'in keyleri ve elemanlari iin Enumeration olusturulur.

Properties Classi
Properties class'i Hashtable class'inin biraz degismis bir halidir. Bu degisiklik bu nesnenin kalici olmasi yani dissal bir dosyaya veya network yoluyla verileri gndermesi ve sonra tekrar alabilmesidir. Bu isler yapilirken ObjectOutputStream ve ObjectInputStream classlari kullanilmaktadir. Bu classlar java.io paketinde bulunmaktaadir. Hashtable class'indan bir diger farki anahtar ve deger olarak string almasidir. Ayni hashing kurallari bu class iin de geerlidir. table = new properties ( ); Properties 'in tanimlanmasi yukaridaki gibi yapilmaktadir. Object val = tabsle.getProperty ( propName.getText ( ) ); Bu ifade ile name'i verilen string property iinde aratilir. Eger eleman bulunursa value stringi dndrlr. Eger eleman bulunamazsa aramaya default property'den devam edilir. Bu islem default property bitene kadar devam eder. table.load ( input ); Bu ifade dissal bir dosyadan veri almak iin kullanilir. input bir inputstream dir ve bu stream'in ierigi proterty'ye aktarilir. table.save(output); Bu ifade ise property 'nin ierigini output isimli stream'a gnderir. Bu iki metod properties'in kalici olmasini saglamaktadir.

Random Class'i
Random Class'i math.random'dan ok daha zengin bir rastgele sayi retici sunmaktadir. Bunun math.random'dan farki rettigi sayiyi bir daha retmemesi yani hep farkli sayilar retmesidir. Random r = new Random ( ) Yukaridaki ifade ile random class'ini kullanabiliriz. BY Ahmet Tolga Tat Sayfa 105

Random r = new Random ( seedValue ); Yukaridaki ifade kullanildiginda ise random objemiz her denememizde ayni sayi serisini retir yani pseude random number retir. Bu durum debug iin gereklidir. nk bir program bir sayi grubu iin hata verirse bize debug islemi iin ayni sayi grubu lazim olacaktir. Burda bu durumu saglayan seedValue parametresinin girilmesidir. r.setSeed ( seed Value ) Yukaridaki ifade ile seedValue degeri sifirlanir.. r.nextInt ( ) r.nextLong ( ) Yukaridaki ifadeler random objesine yeni bir integer veya yeni bir long iin istekte bulunur. r.nextGaussian ( ) Yukaridaki ifade Gauss'un olasilik yogunlugu dagilimi ile double bir deger retir.

Bit Islemleri ve Bitwise Islemcileri


Java birok bit islemi olanagi saglamaktadir. Asagida operatorler ve islevleri listelenmistir. Islemc Isim Aiklama i & bitwise AND Her bit iin mantiksal AND islemi uygulanir. | bitwise inclusive OR Her bit iin mantiksal OR islemi uygulanir. ^ bitwise exclusive OR Her bit iin mantiksal XOR islemi uygulanir. << left shift Her bit bir tane sola kaydirilir.Sona 0 beslenir. >> right shift with sign extension Her bit bir tane saga kaydirilir. Saga isaret biti beslenir. >>> right shift with zero extension Her bir bir tane saga kaydirilir. Saga 0 beslenir ~ one's complement Btn bitler tersine evrilir. Yukaridaki islemler parametre yardimi ile 1 den fazla defa yaptirilabilir. Asagida bir sayinin bit ailimini gsteren bir rnek applet sunulmustur.

rnek: PrintBits rnei import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class PrintBits extends Applet implements ActionListener { private TextField inp ut, output; public void init() { add( new Label(" Bir integer sayi giriniz: ")); input= new TextField(10); BY Ahmet Tolga Tat Sayfa 106

input.addActionListener(this); add(input); add( new Label(" Sayinin bit'leri: ")); output= new TextField(35); output.setEditable( false ); add(output); } public void actionPerformed(ActionEvent e) { int val = Integer.parseInt(e.getActionCommand()); output.setText( getBits( val)); } public String getBits( int value) { int displayMask = 1 << 31; StringBuffer buf= new StringBuffer(35); for (int c=1; c <= 32; c++) { buf.append(( value & displayMask) == 0 ? "0" :"1"); value <<=1; if ( c % 8 == 0 ) buf.append(" "); } return buf.toString(); } }

Asagidaki applet ise islmecileri kullanmaktadir.

rnek: Bit ilemcileri appleti import java.awt.*; import java.awt.event.*; import java.applet.Applet; public class bitisleme extends Applet implements ActionListener { private TextField input1, input2, result, bits1, bits2, bits3; private Button and, inclusiveOr, exclusiveOr, complement; private Panel inputPanel, bitsPanel, buttonPanel; public void init() BY Ahmet Tolga Tat Sayfa 107

{ setLayout( new BorderLayout() ); inputPanel = new Panel(); inputPanel.setLayout( new GridLayout( 4, 2 ) ); inputPanel.add( new Label( "2 Tane Tam Sayi Giriniz: " ) ); inputPanel.add( new Label( "" ) ); inputPanel.add( new Label( "1.Sayi" ) ); input1 = new TextField( 8 ); inputPanel.add( input1 ); inputPanel.add( new Label( "2.Sayi" ) ); input2 = new TextField( 8 ); inputPanel.add( input2 ); inputPanel.add( new Label( "Sonuc" ) ); result = new TextField( 8 ); result.setEditable( false ); inputPanel.add( result ); bitsPanel = new Panel(); bitsPanel.setLayout( new GridLayout( 4, 1 ) ); bitsPanel.add( new Label( "Bitsel Gsterim" ) ); bits1 = new TextField( 33 ); bits1.setEditable( false ); bitsPanel.add( bits1 ); bits2 = new TextField( 33 ); bits2.setEditable( false ); bitsPanel.add( bits2 ); bits3 = new TextField( 33 ); bits3.setEditable( false ); bitsPanel.add( bits3 ); buttonPanel = new Panel(); and = new Button( "bitwise AND" ); and.addActionListener( this ); buttonPanel.add( and ); inclusiveOr = new Button( "bitwise OR" ); inclusiveOr.addActionListener( this ); buttonPanel.add( inclusiveOr ); exclusiveOr = new Button( "bitwise XOR" ); exclusiveOr.addActionListener( this ); buttonPanel.add( exclusiveOr ); BY Ahmet Tolga Tat Sayfa 108

complement = new Button( "Ters al" ); complement.addActionListener( this ); buttonPanel.add( complement ); add( inputPanel, BorderLayout.WEST ); add( bitsPanel, BorderLayout.EAST ); add( buttonPanel, BorderLayout.SOUTH ); } public void actionPerformed( ActionEvent e ) { if ( e.getSource() == complement ) { input2.setText( "" ); bits2.setText( "" ); int val = Integer.parseInt( input1.getText() ); result.setText( Integer.toString( - val ) ); bits1.setText( getBits( val ) ); bits3.setText( getBits( - val ) ); } else { int val1 = Integer.parseInt( input1.getText() ); int val2 = Integer.parseInt( input2.getText() ); bits1.setText( getBits( val1 ) ); bits2.setText( getBits( val2 ) ); if ( e.getSource() == and ) { result.setText( Integer.toString( val1 & val2 ) ); bits3.setText( getBits( val1 & val2 ) ); } else if ( e.getSource() ==inclusiveOr ) { result.setText( Integer.toString( val1 | val2 ) ); bits3.setText( getBits( val1 | val2 ) ); } else if ( e.getSource() ==exclusiveOr ) { result.setText( Integer.toString( val1 ^ val2 ) ); bits3.setText( getBits( val1 ^ val2 ) ); } } } public String getBits( int value ) { int displayMask = 1 << 31; StringBuffer buf = new StringBuffer( 35 ); for ( int c = 1; c <= 32; c++ ) { buf.append( (value & displayMask ) == 0 ? '0' : '1' ); value <<= 1; if ( c % 8 == 0 ) buf.append( ' ' ); } BY Ahmet Tolga Tat Sayfa 109

return buf.toString(); } }

BitSet Class'i
BitSet class'i ierisinde bitlerin tutulmasini saglayan dinamik bir yapidir. Yani appletin alisma esnasinda boyutu degis ebilen array benzeri bir yapidir ve ierisinde bitleri tutar. Byle bir yapi programlama da ok ihtiya duyulmaktadir. Bu yapi sayesinde indis sayisi kadar true(1), false(0) elde ederiz ve bunlar bize flag grevi grr. BitSet b = new BitSet(); Yukaridaki ifade ile yeni bir BitSet tanimlayabiliriz. BitSet b = new BitSet( Size ); Yukaridaki tanimlama biimi ile boyutunuda belirtebiliriz. b.set( bitNumber ); Yukaridaki ifade ile bir konumdaki bit 1'e esitlenir yani set edilir. b.clear( bitNumber ); Yukaridaki ifade ile bir konumdaki bit 0'a esitlenir yani reset edilir. b.get( bitNumber ); Yukaridaki ifade ile bir konumdaki bitin degeri gernilir. Bu yapi yardimiyla bir sayinin asal olup olmadigini tutabiliriz. rnegin 1000 indislik bir bitset aar ve her indisdeki biti o indis degerine denk gelen sayinin asal olup olmadigini gsteren bit olarak kullanabiliriz. Bu rnegi asagidaki applettde grebiliriz.

rnek: BitSet Kullanan Applet import java.applet.Applet; import java.awt.*; import java.util.*; public class BitSetTest extends Applet { BitSet sieve; Panel inputPanel; Label inputLabel; TextField input; TextArea primes; public void init() { sieve = new BitSet( 1024 ); setLayout( new BorderLayo ut() ); inputLabel = new Label( "Enter a value from 1 to 1023" ); input = new TextField( 10 ); inputPanel = new Panel(); BY Ahmet Tolga Tat Sayfa 110

inputPanel.add( inputLabel ); inputPanel.add( input ); add( "North", inp utPanel ); primes = new TextArea(); add( "Center", primes ); // set all bits from 1 to 1023 int size = sieve.size(); for ( int i = 1; i < size; i++ ) sieve.set( i ); // perform Sieve of Eratosthenes int finalBit = (int) Math.sqrt( sieve.size() ); for ( int i = 2; i < finalBit; i++ ) if ( sieve.get( i ) ) for ( int j = 2 * i; j < size; j += i ) sieve.clear( j ); int counter = 0; for ( int i = 1; i < size; i++ ) if ( sieve.get( i ) ) { primes.appendText( String.valueOf( i ) ); primes.appendText( ++counter % 7 == 0 ? "\n" : "\t" ); } } public boolean action( Event e, Object o ) { int val = Integer.parseInt( input.getText() ); if ( sieve.get( val ) ) showStatus( val + " is a prime number" ); else showStatus( val + " is not a prime number" ); return true; } }

BY Ahmet Tolga Tat

Sayfa 111

BY Ahmet Tolga Tat

Sayfa 112

Exception Handling
Exception calisma durumunda meydana gelen hata durumudur. Pascal ,C gibi exception handling'i desteklemeyen dillerde olusabilecek hatalarin denetimi elle yapilmaktadir. Bu zahmetli durum JAVA programlama dilinde nesne ynelimli alisma zamani hatalari ynetimi kullanilarak onlenir. En cok karsilasilan hata turleri dizinlerde index degerinin siniri asmasi, aritmetik islemlerde degisken degerlerinin sinirin disina cikmasi, sifira blme, hatali metod parametreleri ve bellek tkenmesi. Javanin hata ayiklama islemi, btn tip hatalarinin yakalanmasini saglar. Bu, programlari daha dayanikli ve gl yapar. Hatalar, exceptions sinifindan tretilmis siniflarin nesneleridir. Hata ayiklamanin diger bir manasi kontroln bir metoddan dndrlmesidir. Normalde, bir hata meydana geldigi zaman, bu hata ile ilgilenen bir metod cagrilir. Eger bu metod hata ile ilgilenmezse, yeni bir kod daha cagrilir.. Bu zincir bu ekilde devam eder.

Exception Handling ne zaman kullanilir


Hata giderme asagidaki durumlarda kullanilmalidir: 1. Sadece istisnai durumlari incelemek iin 2. Program paralari arasindaki hatalari gidermek iin 3. Metodlar, siniflar, ktphaneler gibi yazilim paralarinin hatalarini gidermek iin 4. Genis projelerde projenin dzgn dagilimini saglamak iin.

Javada hata yakalamanin temelleri


Java hata ayiklama bir hatanin tespit edilmesi durumunda kullanilir.Byle bir durum hatayi "throw" etmektir. Buradan bir sonucun retilmesi garanti edilmez. Eger bir hata varsa bu hata yakalanip islenecektir. Hata retecek kod bir "try" blogu iine konur. Try blogunun ardindan hemen bir veya daha fazla "catch" blogu gelir. Her bir catch blogu yakalatip isleyebilecegi hatalari belirler. Son catch blogundan sonra, bululup bulunmamasi nemli olmayan fakat bulundugu taktirde mutlaka calistirilacak olan "finally" blogu yer alir. Bir hata yakalandigi zaman, kontrol try blogundan ayrilip, hata iin uygun catch blogu aranir. Eger hatanin tipi catch bloklarindan birine uyarsa, catch bloktaki kod calistirilir. Eger hibir catch blogu bulunmazsa, program son catch blogundan sonra devam eder. Eger son catch blogundan sonra finally blogu varsa, bu kod calistirilir. Bir hata metod ierisindeki bir try blogunda yakalanabilecegi gibi, metod tarafindan dogrudan veya dolayli yolla agrilan bir try blogu tarafindan da yakalanabilir. Hatanin yakalandigi noktaya "throw point" denir.
Bir hata yakalndigi zaman program throw point' e dnmeyebilir. nk java hata gidermek icin "termination" modelini kullanmaktadir. "Resumption" modelinde kontrol "throw point" e geri dner.

BY Ahmet Tolga Tat

Sayfa 113

Java Dilindeki Hata Paketi


LinkageError ClassCircularityError ClassFormatError IncompatibleClassChangeError AbstractMethodError IllegalAccessError InstantiationError NoSuchFieldError NoSuchMethodError NoClassDefFoundError UnsatisfiedLinkError VerifyError ThreadDeath VirtualMachineError(Abstract Class) InternalError OutOfMemoryError StackOverFlowError UnknownError AWTError (in java.awt)

Exception cesitleri
Java bircok farkli exception nesnesi icerir.Bunlardan bazilari bu hatayi "throw" eden bir fonksiyon kullanici tarafindan tanimlandiginda kullanicinin ele almasi gereken durumlardir. Bellek tukenmesi,sifira bolme gibi bazi durumlarda ise sistem otomatik olarak bir hata yakalama mekanizmasi olusturur.

Java'da kullanilan Exception'lar

EXCEPTION
Aritmetik Exception Array Index'inin Siniri Asmasi Arraylerde Type Hatasi Dosya Bulunamamasi Durumu IO Exception

ACIKLAMA Sifira Bolme Gibi Matematiksel Hatalarda Olusur Hatali Index Degerlerinin Kullanilmasi Sonucu Olusur Arraylerde Hatali Tipte Bir Degiskenin Kullanilmasi Ile Olusur Var Olmayan Bir Dosyaya Giris Istemi Oldugunda Olusur Bir Dosyayi Okuyamama Gibi Genel I/O Hatalari

BY Ahmet Tolga Tat

Sayfa 114

NullPointer Exception Sayi Bicimleriyle Ilgili Hatalar

Null Bir Nesneye Referans Verilmesi String ve Sayi Degiskenlerini Birbirine Cevirirken Olusabilecek Hatalar Yeni Bir Nesneyi Bellege Yerlestirmek Icin Yer Olmayinca Olusur Bir Applet Browser'in Izin Vermedigi Bir Olayi Islemeye Calisinca Olusur Sistem Stack Alaninin Disini Kullanmaya Calisinca Olusur Program String'te Var Olmayan Bir Karakter Pozisyonuna Girmeye Calisirsa Olusur

Bellek Sinirinin Asilmasi

Guvenlik Hatalari Stack'in Dolma Durumu

String Index'inin Sinirlarin Disinda Olmasi

Exception handlingdeki blok tanimlari


try bloklari
Bir hata meydana geldigi zaman try blogu icindeki bir catch blogu tarafindan yakalanir. try { .... } catch(){ .... } Eger bir try blogu calistirilip ,hicbir hata ile karsilasilmazsa kontrol son hata yakalayicidan sonraki ilk koddan devam eder.Eger finally blok varsa bu blok calistirilir.

BIR EXCEPTION'IN ORTAYA ATILMASI Hata ayiklama islemi bir hata meydana geldigi zaman calistirilir. Buna "throwing an exception" denir. Hata ayiklama kodu ayiklama isleminin nesnesini belirler. Islenen hata throwable sinifindan tretilmis herhangi bir sinif olabilir. Throwable sinifinin iki alt sinifi "Exception" ve "Error" dir.Error genellikle sistem problemleriyle ilgilenir. Exception ise birok java programcisinin arzu ettigi problemlerle ilgilenir. Bir hata durumu yakalandigi zaman kontrol o anki try blogu iindeki uygun bir catch blogundan devam eder. Eger byle bir catch yoksa bir sonraki try blogundan devam eder. BY Ahmet Tolga Tat Sayfa 115

Throwing An Exception

public boolean action(Event evt, Object arg) { try GetURL(); catch (MalformedURLException e) { badURL = true; repaint(); } return true; } protected void GetURL() throws MalformedURLException { String str = textField.getText(); URL url = new URL(str); AppletContext context = getAppletContext(); context.showDocument(url); }

Throws kelimesi

Bir throws clause bir metod tarafindan hangi hatalarin yakalabilecegini listeler. int g(float h) throws a,b,c { //method body } Bazi hatalar calisma zamaninda meydana gelir. Bunlara "RunTimeExceptions" denir.

Bir Exceptionun yakalanmasi


Hata giderici kodlar "catch" bloklari icerisinde yer alir. Her catch blogu "catch" kelimesiyle baslar. Catch blogundaki hatanin tanimini yapan sinif ismi ve parametre ismi vardir. Hata ile hibir hata giderme kodu uymayabilir.Bu aramanin bir sonraki try blogund an devem etmesini saglar. Bu islem sonunda hata ile uyan hicbir catch blogu bulunmazsa, GUI tabanli olmayan bir program calisir. Apletler ve GUI tabanli programlar olay isleminin sonucunu gnderirler. FINALLY BLOGU Bir exception oldugu zaman metottaki isleyis ani ve dogrusal olmayan bir yola girer.Metodun kodlanmasina bagli olarak bir exception'in zamansiz bir sekilde geri donmesine bile sebep olabilir.Mesela bir metot giriste bir dosyayi aciyor ve cikista kapatiyorsa exception- handling mekanizmasinin bu dosyayi kapatan kodu gecmemesi gerekir.Finally anahtar kelimesi bu ihtimal icin tasarlanmistir. Finally blogu istege baglidir.Eger varsa "try" blogunun catch tumcesinden sonra yer alir.Java, eger bir finally blogu varsa, try blogu ve onun catch bloklari icinde bir exception ele alinmasina bakmadan, finally blogunun isletilecegini garanti eder. Bir try blogundan finally blogunu islemeden cikmak mmkn degildir.

BY Ahmet Tolga Tat

Sayfa 116

CONSTRUCTER VE FINALIZER'LAR
Bir constructor iinde bir hata farkedilirse ne olur? Problem constructor bir deger dndrmez, o zaman programin nesnenin dzgnce olusturulup olusturulmadigini bilmesini nasil saglayacagiz? Bir tasari, kt olusmus nesneyi metoddan dndrmek ve bunu kullanan nesnelerin bu nesnenin dzgn olup olmadigini anlayacak testler yapiyor olmasini ummak. Diger bir tasari, constructor disinda global bir degisken tanimlamak, ama bu da zayif bir programlama yolu. Contructor'larda ortaya atilan exceptionlar nihai garbage koleksiyonu iin isaretlenen nesnelerin parasi olarak olusturulmasina sebep olurlar. Her bir nesne garbage koleksiyonuna atilmadan, onun finalizer'i cagrilir. Bir defa daha, Java garbage koleksiyonuna atilacak nesnelerin sirasini garanti etmez ve sonu olarak cagrilacak finalizer'larin sirasini da garanti etmez.

BUILT-IN EXCEPTION'LAR
Java'nin java.lang paketi iinde standart olarak tanimlanmis bir cok exception sinifi vardir.En cok kullanilanlar RuntimeException tipinin alt siniflaridir.Java.lang java programlarina otomatik olarak getirilir. Ayrica herhangi bir metodun throws listesinde bulunma zorunlulugu da yoktur.Java'da Java.lang'in disinda baska exception paketleri de vardir.Asagida Java dilinde kullanilan built- in exception'larin listesi sunulmaktadir. Java.Lang Paketi'ndeki Exception'lar IllegalAccessException InstantionationException InterruptedException NoSuchMethodException ArithmeticException ArrayStoreException ClassCastExeception IllegalArgumentException IllegalThreadStateException NumberFormatException IllegalMonitorStateException IndexOutOfBoundException ArrayIndexOutOfBoundException StringIndexOutOfBoundException NegativeArraySizeExecption NullPointerException SequrityException Java.Util Paketindeki Exception'lar RunTime Exception EmptyStackException NosuchElementException

Java.io Paketindeki Exception'lar Exception BY Ahmet Tolga Tat Sayfa 117

IOException EOFException FileNotFoundException InterruptedIOExzception UTFDataFormatException

Java.net Paketindeki Exception'lar


Exception IOException MalFormedURLException ProtocolException SocketException UnknownHostException UnknownServiceException

Yeni Exception siniflari yapma


Java' nin icinde yaygin hatalara yonelik exception siniflari tanimlanmistir.Ancak kullanici bazi ozel durumlarda kendi exception siniflarini tanimlamak isteyebilir.Bu gibi durumlarda yapilmasi gereken sey Throwableicinde bir alt sinif tanimlamaktir. Yaratilan alt siniflari mutlaka kullanma zorunlulugu yoktur.Amac sisteme varliklarini bildirmektir. Exception sinifi kendisinin hi bir sinifini tanimlamaz.Gerekli olanlari Throwable'dan saglar. Bylece btn exception'lar kendi yarattiklarimiz dahil, Throwable tarafindan tanimlanan metodlari kullanabilecek hale gelir. Ayrica yarattigimiz exception siniflarinin bir veya bir ka metodunu hkmsz kilabilir, kendimiz yeniden yazabiliriz. Yaygin super siniflardan cesitli exception siniflari tretilebilir. Eger bir catch metodu bir super sinif tipinin exception neenelerini yakalamak iin yazilmissa, bu ayrica bu super sinifin alt siniflarinin nesnelerini de yakalayabilir. Bu yaklasim, baglantili hatalarin kalitsal isleyisine izin verir. Exception'larla kalitimi kullanmak, exception handler'in ilgili hatalarini kisa bir gsterim ile algilamasina olanak saglar. Btn alt siniflar icin ayridir. import java.applet.Applet; import java.awt.*; public class ZeroTest extends Applet { Label prompt1, prompt2; TextField input1, input2; int number1, number2; double result; // Initialization BY Ahmet Tolga Tat Sayfa 118

public void init() { prompt1 = new Label( "Enter numerator" ); input1 = new TextField( 10 ); prompt2 = new Label( "Enter denominator and" + "press Enter" ); input2 = new TextField( 10 ); add( prompt1 ); add( input1 ); add( prompt2 ); add( input2 ); } // Process GUI events public boolean action( Event event, Object object ) { if ( event.target == input2 ) { number1 = Integer.parseInt( input1.getText() ); input1.setText( "" ); number2 = Integer.parseInt( input2.getText() ); input2.setText( "" ); try { result = quotient( number1, number2 ); showStatus( number1 + " / " + number2 + " = " + Double.toString( result ) ); } catch ( ZeroException exception ) { showStatus( exception.toString() ); } } return true; } // Definition of method quotient. Used to demonstrate // throwing an exception when a divide-by- zero error // is encountered. public double quotient( int numerator, int denominator ) throws ZeroException { if ( denominator == 0 ) throw new DivideByZeroException(); return ( double ) numerator / denominator; } }

BY Ahmet Tolga Tat

Sayfa 119

BY Ahmet Tolga Tat

Sayfa 120

Java Metodlari

Problemleri cozmek icin kullanilan bilgisayar programlari cok buyuk boyutlardadir. Buyuk programlari yonetmenin ve gelistirmenin en uygun yolu ise programlari daha kucuk parcalara bolmektir. Bu parcalara modul denir.

Java 'da Program Modulleri


Java dilinde 2 modul bulunmaktadir.Bunlar sinif lar ve metod lardir. Java programlari java sinif kutuphanelerinde hazir olarak bulunan metodlar ve siniflar kullanilarak, onlardan yeni siniflar tureterek ve yeni sinif ve metodlar olusturularak bunlarin birlestirilmesiyle yazilir. Java API, Java sinif kut uphanelerinin olusturdugu bir arayuzdur.Bu arayz ( sinif kutuphaneleri ) , programcinin isini genel matematiksel hesaplamalar, string islemleri, karakter islemleri, giris cikis ve hata kontrolleri gibi bircok islemlerde kullanilmak uzere cok sayida sinif ve metod icererek kolaylastirir. Java diline ait hazir sinif kutuphaneleri JDK( Java Developer's Kit )'in bir parcasidir. Programci programda kullanilmak uzere ozel isler icin tasarlanmis metodlar yazabilir. Bir metodun kullanilabilmesi iin agrilmasi(method call) gerekir. Bu agirma islemi sirasinda gerekli parametreler(arguments) de belirtilir.

Math Sinifi Metodlari


Math sinifi metodlari genel matematik islemlerinde kullanilir. Metodlar isimleri va parantez icindeki parametreleri ile birlikte cagrilir. Butun math sinifi metodlari Math sinif ismi, "." ve metod ismi ile birlikte kullanilir. Metotlar genelde asagidaki sekilde agrilirlar : [Class_name] Method_name ([Arg_1],[Arg_2..]); [Class_name] : bu kisim agrilacak olan metotun ait oldugu sinifi belirtir. Her zaman gerekmez. Ancak Math sinifinin bir metodu BY Ahmet Tolga Tat Sayfa 121

agrilacaksa "Math." Ifadesi mutlaka metot isminde nce bulunmalidir. Metod parametreleri sabitler, degiskenler veya ifadeler( expressions ) olabilir. Bazi Math sinifi metodlari sunlardir; {PRIVATE}ab x'in mutlak degerini hesaplar. s( x ) ceil( x ) x'in en kucuk degerini dondurur. Bu deger x' den kucuk degildir. cos( x ) x'in trigonometrik Kosinus degerini verir. ( x 'in birimi radyan ) exp( x ) e uzeri x'i hesaplar. floor( x ) x'in en buyuk degerini dondurur. Bu deger x' den buyuk degildir. log ( x ) x' in e tabaninda dogal logaritmasini verir. max( x , y ) x ve y 'den buyuk olanini dondurur. min( x , y ) x ve y 'den kucuk olanini dondurur. pow( x , y) x'in y. kuvvetini verir. sqrt( x ) x'in karekokunu hesaplar.

Metodlar
Metodlar programcinin programi moduler hale getirmesini saglar. Metod icinde tanimlanmis butun degiskenler yerel degiskenler ( local variables ) dir. Sadece icinde tanimlandigi metod icerisinde taninirlar. Metodlarin bir cogu parametrelere sahiptir. Bu parametreler metodlar arasindaki iletisimi saglamak icin kullanilir. Genellikle yerel degiskenlerdir Programi metodlar ile modularize etmenin bir kac yolu vardir. Divide-conquer yaklasimi program gelistirirken programa daha cok hakim olunmasini saglar. Diger bir yol ise software reusability' dir ( Var olan metodlar yeni bir program uretmek icin bloklar halinde olusturulur).Iyi bir yontem ile isimlendirme ve tanimlamalar yapilir, ayrica ozel bir program kodu yazmak yerine program standart metodlardan olusturulur. Ucuncu bir nokta ise tekrar eden program kodundan sakinmaktir. Paketlenmis kod(modularize edilmis, kucuk parcalara ayrilmis) programin degisik yerlerinden cagrilir ve boylece tekrar yazilmasindan kurturulur.

Metod Tanimlamalari
Su ana kadar sinif kutuphanelerinde var olan metodlar ve siniflar kullanildi. Simdi yeni bir metodun nasil tasarlandigini gorecegiz. Bir applet tasarlayalim ve square metodunu kullanarak 1' den 10'a kadar olan sayilarin karesini bulsun ve paint metodunu kullanarak yazdirsin.

BY Ahmet Tolga Tat

Sayfa 122

// Square metodu programci tarafindan tanimlanmistir. import java.awt.Graphics; import java.applet.Applet; public class karealma extends Applet { public void paint ( Graphics g ) { int xposition = 25; for ( int x = 1; x <= 10; x++ ) { g.drawString( String.valueOf ( square( x ) ), xPosition, 25 ); xPosition +=20; } } // Square metod tanimi public int square( int y ) { return y*y; } }

Square metodu paint icerisindeki 12. satirdaki call ( square(x)) deyimi ile cagrilir. Square metodu parametre olarak x'i alir ve y'ye x' in degerini kopyalar. Metod y*y' yi hesaplar ve sonuc geri doner ve ekrana yazdirilir. Bu islem on kez tekrarlanir. 17. satirdaki metod tanimlamasi metodun paramatre olarak integer bir sayi kabul ettigini gosterir. Metod isminden onceki Int kelimesi ile metodun integer bir sonuc dondurecegi anlasilir.Javadaki butun metodlarin tanimlamasi bir sinif taniminin icerisinde yapilmalidir. Metod tanimlamasinin formati asagidaki gibidir. Dondurulecek-degerin-tipi metod-ismi( parametre -listesi ) { Tanimlamalar ve ifadeler } Metod ismi herhangi gecerli bir ifade olabilir. Dondurulecek degerin tipi void ise bu ifade Metodun birsey dndrmeyecegini gsterir.Parametre listesinde birden fazla parametre var ise "," ile birbirinden ayrilirlar. Parametere listesindeki parametreler metod cagrildigi zaman kabul edilir.Parametrelerin tanimlamalari acik bir sekilde yapilmalidir. "{" ve "}" arasinda yazilan hersey metodun govdesini olusturur.Blok olarakta isimlendirilir.Degiskenler blok icerisinde tanimlanmalidir. Bir metod baska bir metod icinde tanimlanamaz. Metodun cagrildigi yere donmesi uc sekilde olur. Eger metod bir deger dondurmuyor ise geri donus metodun sonuna gelinmesiyle "}" veya asagidaki satirin uygulanmasi ile olur ; return eger bir deger geri donduruyorsa return expression ifadesi kullanilir. Ikinci ornegimizde programci tarafindan tanimlanmis, uc tane sayidan en buyugu bulan maximum isimli metod kullanilmistir. Sayilar metin kutularindan giris olarak alinir, enter ile birlikte maximum metodu cagrilir, en buyuk olan sayi bulunup return ile geri donulur ve diger metin kutusuna en buyuk sayi yazdirilir.
import java.awt.*; import java.applet.Applet; import java.awt.event.*;

BY Ahmet Tolga Tat

Sayfa 123

public class max extends Applet implements ActionListener { Label label1, label2, label3, resultLabel; TextField number1, number2, number3, result; int num1, num2, num3, max; public void init() { label1 = new Label( "Enter first number:" ); number1 = new TextField ( "0", 10 ); label2 = new Label( "Enter second number:" ); number2 = new TextField ( "0", 10 ); label3 = new Label( "Enter third number:" ); number3 = new TextField ( "0", 10 ); resultLabel = new Label( "Maximum value is:" ); result = new TextField ( "0", 10 ); result.setEditable( false ); number1.addActionListener( this ); number2.addActionListener( this ); number3.addActionListener( this ); add( label1 ); add( number1 ); add( label2 ); add( number2 ); add( label3 ); add( number3 ); add( resultLabel ); add( result ); } public int maximum( int x, int y, int z) { return Math.max( x, Math.max( y, z)); } public void actionPerformed( ActionEvent e) { num1 = Integer.parseInt( number1.getText() ); num2 = Integer.parseInt( number2.getText() ); num3 = Integer.parseInt( number3.getText() ); max = maximum( num1, num2, num3); result.setText( Integer.toString( max ) ); } }

Rastgele Sayi Tretme


Bu bolumde birden fazla metod iceren bir oyun programi olusturacagiz. Programda daha once gosterilen yapilar kullanilacaktir. double randomValue = Math.random( ); Random metodu 0.0 ile 1.0 arasinda rastgele double bir sayi uretir.Bu aradaki sayilarin her biri esit sansa sahiptir. Random metodunu gostermek icin bir program yazacagiz. Bu programda 20 kere zar atisini simule edecegiz ve uretilen sayilari satirlara sirasi ile yazdiracagiz. Program 1 ile 6 arasinda rastgele sayi uretir. Programi asagida gorebilirsiniz. Random ile birlikte " * " operatoru kullanilir. BY Ahmet Tolga Tat Sayfa 124

( int ) ( math.random( )*6 ) 0 ile 5 arasinda rastgele sayi uretmek icin yukaridaki ifade kullanilir. Buna scalling denir. 6 scalling faktorudur.Program icerisinde her uretilen sayiya 1 eklenmistir.
import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class random extends Applet implements ActionListener { int frequency[] = { 0, 0, 0, 0, 0, 0, 0 }; int limit; Label label1; TextField field1; public void init() { label1 = new Label ( "Zar ka kere atlacak?" ); field1 = new TextField ( "1000", 5 ); field1.addActionListener( this ); add ( label1 ); add ( field1 ); } public void paint( Graphics g ) { int Ypos = 70; g.drawString( "Zar", 25, 55); g.drawString( "Gelme Skl", 100, 55); for (int i = 1; i <= 6; i++) { g.drawString( Integer.toString( i ), 25, Ypos); g.drawString( Integer.toString( frequency[ i ]), 100, Ypos); Ypos += 15; } } public void actionPerformed( ActionEvent e ) { limit = Integer.parseInt( field1.getText() ); for (int i = 1; i <= 6; i++ ) { frequency [ i ] = 0; } for ( int roll = 1; roll <= limit; roll++ ) { int face = 1 + (int)( Math.random() * 6 ); frequency[ face ]++; } repaint(); } }

Otomatik Degiskenler
Su ana kadar degisken isimleri iin tanimlayicilar kullanilmistir.(identifiers) degiskenlerin bir ok zellkileri vardir : ad, tip, boyut, deger, sre(duration), menzil (scope). Bunlardan ilk drd aiktir. Sre ise degiskene ilk referans verilip bellekte yer ailmasindan, bellekten silinineye kadar geen sredir. Bu sre her degisken iin farklidir. Bazilari ok kisa, bazilari ise tm program boyunca hayatta kalirlar. Menzil ise program iinden degiskene referans edilebilen yerlerdir. Bazilarinin menzili modl seviyesinde kalirken bazilari da tm programdan referans BY Ahmet Tolga Tat Sayfa 125

edilebilir. Metotlarin yerel degiskenleri ve parametrelerde yaratilan degiskenleri "otomatik sreli degiskenler" olarak adlandirilir. Bu degiskenler islenme sirasi kendilerine geldiginde yaratilirlar ve metottan ikana kadar var olurlar. Metottan ikinca da gene otomatik olarak imha edilirler. Otomatik sreli degiskenler kisaca "Otomatik Degiskenler" diye adlandirilir. Java ayrica static sreli degiskenlere de izin vermektedir. Bu tr degiskenler bellege yklendikten programin bitmesine kadar yasarlar. Statik sreli metotlarin adlari ise ilk bellege yklendigi andan program bitimine kadar varolur. Ancak bu her zaman kullanilabilecekleri anlamina gelmez, nk menzil ve sre (duration) kisitlamalari hala geerlidir.

Scope Kurallari
Bir degiskene ait scope o degiskene program icerisinden ulasilabildigimiz sahalardir. Mesela bir yerel degiskene tanimlandigi blok disindan ulasilamaz. O degiskene sadece tanimlandigi blok icerisinden referans edilebilir. Bir degisken icin class scope ve block scope' una bakilir. Metodlar ve ornek degiskenler icin class scope soz konusudur. Class scope sinifa ait ' { ' ile baslar ve ' } ' ile son bulur. Class scope sinif icerisindeki metodlar icerisinden diger metod ve ornek degiskenlere ulasilabilmesini saglar. Blok icerisindeki degiskenler block scope 'a sahiptir. Block scope tanimlanmasi ile baslar ve blok sonu olan ' } ' ile biter.

Recursion ( tekrarlama )
Daha once uzerinde durdugumuz programlar genel olarak metodlardan olusuyor ve birbirlerini bir duzen icerisinde hiyerarsik olarak cagiriyorlardi. Bir recursive metod ise kendi icerisinden kendisini cagiran metod olarak tanimlanabilir. Basit ornekleri mevcuttur. Asagidaki programimiz ( FactorialTest.java ) recursion bir programdir. 0' dan 10' a kadar olan sayilarin faktoriyellerini hesaplar ve yazdirir. Recursive bir metod olan factorial once sayinin 1' e esit veya 1' den kucuk olup olmadigini kontrol eder, eger bu sart gerceklesirse factorial 1 degerini dondurur. Eger bu sart dogru degil ise bu satir islenir ; return number*factorial ( number - 1 ); yani factorial metodu icerisinden yine factorial metodu (number-1) parametresi yollanarak cagrilir.
import java.applet.Applet; import java.awt.Graphics; public class faktorial extends Applet { public void paint( Graphics g ) { int Ypos = 25; for (long i = 0; i <= 10; i++) { g.drawString( i + "! = " + factorial( i ), 25, Ypos); Ypos += 15; } } public long factorial( long number ) { if (number <= 1) return 1; else return number * factorial( number - 1); } }

BY Ahmet Tolga Tat

Sayfa 126

Recursion ve Iterasyon
Bu bolumde recursion ve iteration metodlari karsilastirilacak ve programcinin hangi sebeple hangi metodu nerede sececegi uzerinde durulacaktir.. Ikiside kontrol yapisina dayanir. Iteration tekrarlamali yapilari kullanir(for veya do/while). Recursion secmeli bir yapi kullanir( if, if /else veya switch gibi ) Hepsi tekrarlamayi icerir. Ikiside yok etmek icin bir test icerir. Iteration dongu sarti gerceklestiginde recursion ise temel sart gerceklestiginde yok olur. Eger iteration testinde dongu sarti gerceklesmezse sonsuz dongu meydana gelir. Recursion' un eksileri coktur.Surekli olarak mekanizmayi calistirir ve siksik overhead ( ustune yazma ) yapar. Bu da onun islemci zamani ve bellek acisindan pahali olmasi anlamina gelir. Iteration normal olarak metod icinde meydana gelir overhead ve extra bellek ayrimi ihmal edilir. Recursive olarak cozulebilecek her problem iterative olarakta cozulebilir. Recursive iteration ' a gore daha cok hatalari kontrol eder ve anlasilmasi ve yonetilmesi daha kolaydir.

Method Overloading
Java metodlarin isimlendirilmesi sirasinda ayni isimlerin kullanilmasina izin verir. Metodlar isimleri aynioldugu halde parametreleri farkli olabilir. Bu method overloading olarak tanimlanir. Bir method overloading meydana geldigi zaman java compiler'i metodlari sirasi ile test eder parametrelerin tiplerini, sayilarini ve sirasini karsilastirir ve uygun olan metod cagrilir. Method overloading ayni isi yapan fakat farkli veri tiplerini kullanan metodlar icin tercih edilir. Overloading methodlar programlari daha anlasilir ve okunur hale getirir. Asagida gordugunuz program ( MethodOverload.java ) overloaded metodlar olan square'lari kullanir. Metodlardan biri parametre olarak integer bir sayi alirken digeri double sayi almaktadir.
import java.awt.Graphics; import java.applet.Applet; public class appmethodoverload extends Applet { public void paint( Graphics g) { g.drawString( "Tamsay 8'in karesi = " + square( 8 ), 25, 25); g.drawString( "Tamsay olmayan 6,5'un karesi = " + square( 6.5 ), 25, 40); } int square( int x ) { return x * x; } double square( double x ) { return x * x; } }

Program icerisindeki square metodlari; BY Ahmet Tolga Tat Sayfa 127

int square ( int x ) &n bsp; double square ( double y )

Applet Siniflarinin Metodlari


Su ana kadar bircok applet yazildi ama bir apletin uygulanmasi sirasinda otomatic olarak cagrilan applet sinifi uzerinde durulmadi. Asagidaki figurde applet sinifina ait metodlar, ne zaman cagrildiklari ve amaclari listelenmistir. Bu metod appletviewer veya browser tarafindan aplet islem icin yuklendigi zaman cagrilir. Apletin calismasi ile {PRIVATE}public void init ( ) calisir.Ornek degiskenleri ve bir aplete ait GUI bilesenlerini baslatmak, gosterilecek resim gibi seyleri yuklemek yaptiklari arasindadir. Bu metod baslangic metodu calisip islenmesi bittikten sonra public void start ( ) tekrar kullanicinin apletin yuklu oldugu HTML sayfasina donmekle birlikte calismaya baslar. Bu metod init metodu calismasini bitirdikten ve start metod calismaya basladiktan sonra appletin uzerine birseyler cizmek public void paint ( Graphics g ) icin calismaya baslar.Aplet tekrar boyanicak oldugu zaman tekrar otomatik olarakaktif hale gelir. Applet calismasini durdurdugunda veya kullanici HTML public void stop ( ) sayfasini terkettiginde veya kullanici HTML sayfasini terkettigi zaman calismaya baslar. Applet bellekten ayrildigi zaman calismaya baslar. Applet icin public void destroy ( ) ayrilmis kaynaklari yok eder.

BY Ahmet Tolga Tat

Sayfa 128

Java Lang
Tm object oriented dillerde olduu gibi Javada da baz baka hazr snflar size kullanmanz iin bir ok metot salar. Bu blmde otomatik olarak yklenen java.lang paketinin baz snflarna deineceiz. java.lang paketi javanin dili olan siniflari icerir.

java.lang.Math
Tanml Deikenler; public final static double E e saysnn hazr deerini verir. (2.71828...) public final static double PI PI saysnn hazr deerini veirir. (3.14159... Metotlar; Metotlar Math.metot() eklinde armalsnz. public static type abs (type x) Mutlak Deer. public static double sqrt (double x) throws AritmeticException Karekk. public static double pow(double x, double y) throws ArithmeticException s alma. public static synchronized double random ( ) Random say retir. public static type max (type a, type b) ki deerin maksimumunu verir. public static long round (double x) Verilen sayy yuvarlar. rnek: //Path /Examples100/Math/Math1.java public class Math1 { public static void main (String args [ ] ) { int x; double rand, y, z, e; float max; rand = Math.random(); x=Math.abs(-123); y=Math.round(123.567); z=Math.pow(2,4); e=Math.E; max =Math.max((float)1e10, (float)3e9); BY Ahmet Tolga Tat Sayfa 129

System.out.println (rand); System.out.println (x); System.out.println (y); System.out.println (z); System.out.println (e); System.out.println (max); } }

java.lang.Character
Deklrasyon; char c; /* character deikeni */ Character C; /* Character objesi */ Constructor; public Character (char deer) Verilen deer ile bir karakter objesi oluturur. Metotlar; public static boolean islowerCase (char ch) Kk harf ise true, degil ise false dner. public static boolean isUpperCase (char ch) - Byk harf ise true, degil ise false dner. public static boolean isDigit (char ch) - Rakam ise true, degil ise false dner. public static boolean isSpace (char ch) - Boluksa true, degil ise false dner. public static char toLowerCase (char ch) Gelen karakteri kk harfe evirir. public static char toUpperCase (char ch) - Gelen karakteri byk harfe evirir. public char charValue ( ) Verilen karakter objesinin char deerini evirir. public String toString ( ) Karakter objesini Stringe evirir. rnek; // Path /Examples100/Character/Char1.java public class Char1{ public static void main (String args[]){ char c1='A'; char c2='z'; char c3='5'; Character C1=new Character('C'); System.out.println ("Karakter "+c1+" buyuk harfmi? "+Character.isUpperCase(c1)); System.out.println ("Karakter "+c2+" buyuk harfmi? "+Character.isUpperCase(c2)); System.out.println ("Karakter "+c3+" rakam mi? "+Character.isDigit(c3)) ; BY Ahmet Tolga Tat Sayfa 130

System.out.println (c1+" kucuk harfe cevir: "+Character.toLowerCase(c1)); System.out.println ("Karakter objesi C1 in degeri: "+C1.charValue()); } }

java.lang.Integer
Deklrasyon; int i; /* integer deikeni */ Integer I; /* Integer objesi */ Tanml Deikenler; public final static int MIN_VALUE Bir integern alabilecei minimum deeri verir. public final static int MAX_VALUE Bir integern alabilecei maksimum deeri verir. Metotlar; public static String toString (int i) Verilen integer i Stringe evirir. public static int parseInt (String s) throws NumberFormatException Verilen Stringi integera evirir. public static Integer valueOf (String s) throws NumberFormatException - Verilen Stringi integer objesine evirir. public int intValue ( ) Integer objesinin deerini integer olarak verir. public long longValue( ) Integer objesinin deerini long olarak verir. public float floatValue( ) Integer objesinin deerini float olarak verir. public double doubleValue ( ) Integer objesinin deerini double olarak verir. public String toString ( ) Integer objesinin deerini String olarak verir. public boolean equals (Object obj) Verilen objeyle karlatrr. rnek; // Path /Examples100/Integer/Int1.java public class Int1 { public static void main (String args [ ] ) { Integer X; int x; double y; String stry=args[0]; X=Integer.valueOf("34") ;
Try {

x=Integer.parseInt(stry); BY Ahmet Tolga Tat

Sayfa 131

System.out.println("x: "+x+", stringden alinmistir.") ; }catch (NumberFormatException e) { System.out.println ("Verilen arguman integer degildir.") ; System.exit (1) ; } y=X.doubleValue(); System.out.println("X double a cevrilmis: "+y); System.out.println("X as a String: " + X.toString ( ) ); } }

java.lang.Long Long snfnn metotlar ve tarz Integer snfnn neredeyse aynsdr. Gerekli metotlara API dokmantasyonundan baklabilir.

java.lang.Float
Deklrasyon; float f; /* float deikeni f * / Float F; /* Float objesi F */ Constructor; public Float (type deer) Verilen float ya da double deikeni ile bir Float objesi oluturur. public Float (String s) throws NumberFormatException Verilen String ile bir Float objesi oluturur. Tanml Deikenler; public final static float MIN_VALUE Bir floatn alabilecei minimum deeri verir. public final static float MAX_VALUE Bir floatn alabilecei maksimum deeri verir. public final static float NEGATIVE_INFINITY Eksi sonsuz. public final static float POSITIVE_INFINITY Art sonsuz. public final static float NaN Say deil (kendi dahil hibir eye eit olmayan bir float). Metotlar; public static native String toString (float f) Verilen float Stringe evirir. public static nativeFloat valueOf(String s) throws NumberFormetException Verilen Stringin deerini floata evirir. BY Ahmet Tolga Tat Sayfa 132

public boolean is NaN( ) Eer Float objesinin deeri NaN ise true, aksi halde false dner. public boolean isInfinite( ) - Eer Float objesinin deeri sonsuz ise true, aksi halde false dner. public String toString ( ) Float objesini Stringe evirir. public int intValue ( ) Float objesini integera evirir. public long longValue ( ) Float objesini longa evirir. public float floatValue ( ) Float objesini floata evirir. public double doubleValue ( ) Float objesini doublea evirir. public boolean equals (Object obj) Verilen objeyle karlatrr. java.lang.Double Double snfnn metotlar ve tarz Float snfnn neredeyse aynsdr. Gerekli metotlara API dokmantasyonundan baklabilir.

java.lang.String
Constructor; public String (String deer) Verilen Stringden yeni bir String kopyas yaratr. public String (char deer [ ] ) Karakter dizisini Stringe evirir. public String (char deer [ ], int offset, int say) Karakter dizisini belli bir offsetten balayarak belli sayda karakter alarak Stringe evirir. Metotlar; public int length ( ) Stringin uzunluunu geri verir. public char charAt(int index) Stringin belirli bir yerdeki karakterini verir. public boolean equals (Object obj) Stringi verilen objeyle karlatrr. public boolean equalsIsIgnoreCase (String s) - Stringi verilen objeyle karlatrr fakat eitlii ararken byk kk harflerden etkilenmez. public int compareTo(String s) Stringi verilen String ile karlatrr ve kk, eit ve byk olma durumuna gre; negatif, sfr veya pozitif deer dndrr. public booelan regionMatches (int offset, String diger, int doffset,int sayi) Stringi offsetten balayarak verilen dier Stringde de doffsetten balayarak sayi uzunluunda karilatrr. BY Ahmet Tolga Tat Sayfa 133

public boolean startsWith (String ba) Stringin verilen String ile balayp balamadn kontrol eder. public boolean andsWith (String son) Stringin verilen String ile bitip bitmediini kontrol eder. public String substring (int baIndex, int sonIndex) Verilen ba ve son indexlerden Stringi keserek yeni bir String yaratr. public String concat (String str) Stringi verilen String ile birletirir. public String toLowerCase( ) Stringin tm karakterlerini kk harfe evirir. public String toUpperCase( ) Stringin tm karakterlerini byk harfe evirir. public String trim ( ) Stringin bandaki ve sonundaki boluklar atar. public char [ ] toCharArray ( ) Stringi karakter dizisine evirir. public static String valueOf (type x) Verilen x tipini Stringe evirir. public static String valueOf (char data[ ]) Verilen karakter dizisini Stringe evirir. rnek1; // Path /Examples100/String/String1.java class String1{ public static void main (String args[]){ String x="abc"; String y=new String("abc"); String z="abc"; if (x==y) System.out.println("x==y"); else if (x.equals(y)) System.out.println("x esittir y") ; if (x==z) System.out.println ("x==z"); } } rnek2; // Path /Examples100/String/String2.java class String2{ public static void main (String args[]){ String bir=new String("Merhaba"); float f=3.141592f; String pi=String.valueOf(f); BY Ahmet Tolga Tat Sayfa 134

System.out.println("String bir: "+bir.toUpperCase()); System.out.println("String bir+pi: "+bir.concat(pi)); } }

java.lang.StringBuffer
Constructor; public StringBuffer ( ) Bo bir StringBuffer yaratr. public StringBuffer (int i) Bo ama kapasitesi belli bir StringBuffer yaratr. public StringBuffer (String str) Verilen String ile dolu bir StringBuffer yaratr. Metotlar; public int length( ) StringBuffern uzunluunu verir. public synchronized void setLength (int yeniUzunluk) throws StringIndexOutOfBoundsException StringBuffern uzunluunu yeniden ayarlar. public synchronized char charAt (int index) throws StringIndexOutOfBoundsException stenen indexdeki karakteri verir. public synchronized void getChars (int bas, int son, char hedef[ ], int hBas) throws StringIndexOutOfBoundsException veya throws ArrayIndexOutOfBounds StringBuffer daki baslang indexinden son indexine kadar olan karakterleri hedef karakter dizisine hBas indexinden tibaren atar. public synchronized void setCharAt (int index, char ch) throws StringIndexOutOfBoundsException StringBuffer daki verilen indexteki karakteri verilen char karakteri yapar. public String toString( ) StringBuffer n ierdii veriyi bir Stringe atar. public synchronized StringBuffer append (String str) Bu StringBuffern sonuna bir String ekler. public synchronized StringBuffer insert(int offset, String str) throws StringIndexOutOfBoundsExceptio n StringBuffern istenen offsetine, verilen Stringi yerletirir. rnek; // Path /Examples100/StringBuffer/StringBuffer1.java class StringBuffer1{ public static void main (String args[]){ int boy=args[0].length(); StringBuffer hedef=new StringBuffer(boy); BY Ahmet Tolga Tat

Sayfa 135

for (int i=(boy-1);i>=0;i--){ hedef.append(args[0].charAt (i) ) ; } System.out.println(hedef.toString()); } }

BY Ahmet Tolga Tat

Sayfa 136

Java AWT
Java API Paketleri
Java bir ok nceden hazirlanmis sinif iermektedir. Bu siniflarin birbirleriyle iliskili olanlari package olusturmak zere disk zerinde ayni dizinlere gruplanmistir. Iste btn bu package'lerin olusturdugu topluluk Java uygulamalari programlama arayzleri (Java applications programming interface : Java API) olarak adlandirilmaktadir. Simdiye kadar ya zilan "import" metodu da bu sinifllarin bulundugu yerleri belirlemede kullanilmaktaydi. Bu arayz Java'nin en by zelliklerinden birini olusturmaktadir, nk programcinin zerindenbyk bir yk kaldirmaktadir. Java API Packages bir ok package iermektedir. Bunlarin hepsinin burada anlatilmasi uygun degildir. Sadece bir ka rnek verilecektir. java.awt : Grafik arayzleri yaratmak iin gereken siniflari ve metotlari ierir. java.io : Programlarin girdi/ikti islemlerini gereklestirmek iin gerekenler. java.net : Programlarin Internet veya Intranet zerinden haberlesebilmesi iin gerekenler. java.sql : Programlarin Veri tabanlarina erisimi iin gerekenler. Ve daha bir oklari.

java.awt:Abstract Window.Toolkit. oklu platform destekli grafik tabanl snflar ierir.Javanin en Onemli paketlerinden birisidir........

Temel AWT ve Olay Yakalama


Javann java.awt paketi GUI (Graphical User Interface Grafiksel Kullanc Arabirimi) yaratmak iin bir ok snfa sahiptir ve ayn zamanda bunlar yerletirmek iin Layout Manager lar ve olaylar yakalamak iin event snfn ierir. Genelde GUI paralarn eklemek iin add komutu kullanlr ve de bunlar eklemek iin mutlaka bir panel veya framee ihtiyacmz vardr.

Frame
Genelde appletlerde ekran sorun olmuyordu. Appletimiz zaten extend ettii Applet snfndan panel olma zelliini alr ve kolayca grafiksel ilemleri kaldrr. Fakat daha nce de fark ettiiniz gibi henz Java uygulamalarnda grafiksel ilemlerle alamadk nk bunu iin frame kullanmamz gereklidir. rnek; //Path /Examples100/Frame/Frame1.java import java.awt.*; BY Ahmet Tolga Tat Sayfa 137

public class Frame1 extends Frame{ public static void main (String args[]){ Frame fr=new Frame("Merhaba Dunyali!"); fr.setSize(500,500); fr.setBackground(Color.blue); fr.show(); } }

Panel
Paneller de tpk frameler gibi GUI paralar ve hatta baka panelleri eklemek iin gerekli alan yaratr. lk panel mutlaka bir window veya tabii ki bir frame objesine eklenmelidir. rnek; //Path /Examples100/Panel/Panel1.java import java.awt.*; public class Panel1 extends Panel{ public static void main (String args[]){ Frame fr=new Frame("Panelli Frame!"); Panel pan=new Panel(); fr.setSize(500,500); fr.setBackground(Color.blue); fr.setLayout(null); pan.setSize(100,100); pan.setBackground(Color.yellow); fr.add(pan); fr.show(); } }

Appletler zaten panelin alt snf olduundan direkt olarak GUI paralarn ekleyebiliriz rnek; //Path /Examples100/Panel/Panel2.java import java.awt.*; import java.applet.Applet; public class Panel2 extends Applet{ Button but; public void init() { but=new Button(OK); BY Ahmet Tolga Tat

Sayfa 138

add(but); } }

Dzenleme Menejeri(layout manager)


AWT elemanlarn dzenlerken iki nemli ey bulunmaktadr: 1. Panele yerletirerek hangi srada ve dzende elemanlarn bulunacann belirlenmesi 2. Ekranda panelin grnmn idare eden dzenleme menejeri Ekrandaki her panelin bir dzenleme menejeri bulunur. AWT be temel dzenleme menejeri kullanlr: 1.FlowLayout 2.GridLayout 3.GridBagLayout 4.BorderLayout 5.CardLayout Verilen bir panel iin bir dzenleme menejeri yaratmak iin setLayout() metodunu kullanabilirsiniz: public void init() { setLayout(new FlowLayout()); } Dzenleme menejeri bir defa yaratldktan sonra zerine eleman ekleyebilirsiniz.

FlowLayout Manager
Bu yerleim dzeninde eklenen paralar liste eklinde sralanr ve bo yerlere yerleirler. rnekte bir applete dmeler ekleyeceiz ve applet panel snfndan geldii iin FlowLayoutun sonucunu greceiz. FlowLayout (Ak Dzenleme) Snf FlowLayout snf en basit dzenleme biimidir. Ak dzenleme snf elemanlarn panele satr, satr sralanmasna izin verir. Eer bir eleman bir satra uymuyorsa bir sonrakine otomatik olarak yerletirilir. Ak dzenleme snfnn satr dzenleme olan a her satr geerlidir. Yani, bir satrdaki elemanlar ister ortaya yanak, saa yana k veya sola yanak dizebilirsiniz. Basit ortaya yanak bir FlowLayout snf yaratmak iin aadaki satrlar kullannz: setLayout(new FlowLayout()); Sola veya saa yanak ak dzenleme snf oluturmak iin aadaki iki parametreyi kullanabilirsiniz(hibir parametre kullanlmazsa ortaya yanak olduu varsaylr): FlowLayout.RIGHT FlowLayout.LEFT BY Ahmet Tolga Tat Sayfa 139

Yukardaki parametreleri aadaki gibi kullanabilirsiniz: setLayout(new FlowLayout(FlowLayout.LEFT)); FlowLayout snfnda elemanlar arasndaki uzaklklar piksel olarak yatay ve dikey olarak (gap values-derinlik deerleri) belirleyebilirsiniz. setLayout(new FlowLayout(FlowLayout.LEFT),10,10); Yukardaki rnekten de anlalaca gibi eklediimiz 10 deerleri yatay ve dikey olarak iki eleman arasndaki uzakl piksel(nokta) olarak belirler.

rnek; //Path /Examples100/FlowLayout/FlowLayout1.java import java.awt.*; import java.applet.Applet; public class FlowLayout1 extends Applet{ Button but1,but2,but3; public void init() { but1=new Button(But1); but2=new Button(But2); but3=new Button(But3); add(but1); add(but2); add(but3); } }

BorderLayout Manager
Bu tarza gre be zel alan vardr: North(kuzey), South(Gney), East(Dou), West(Bat) ve Center(Merkez). Bir framee dmeler ekleyip BorderLayoutun sonucunu greceiz nk Framelerde BorderLayout varsaylan yerleim dzeniydi.

Border Layouts(Kenar izgi Layoutlar)


Border(kenar izgi) Layout'lar, flow(ak) ve grid(zgara) Layoutlarndan farkl olarak davranr. Bir dzlemde, bir panel eklerken border layout kullanlr. Yerini belirlemek iin corafi tanmlamalar kullanlr; gney, dou, bat ve merkez gibi. BY Ahmet Tolga Tat Sayfa 140

Border Layout'u kullanmak iin, dier layoutlar kullanmak iin oluturduumuz aadaki komut satrn yaznz: SetLayout(new BorderLayout()); Yukardaki satrla oluturulan BorderLayout zerine elemanlar eklemek iin add( ) metodunu kullanabilirsiniz. Add( ) metodunun ilk argman bir stringdir ve elemann Layout iindeki yerini belirlemek iin kullanlr. Add("North",new TextField("Balk",50)); Add("South",new TextField("Status",50)); add( ) metodunu dier layout yneticilerinde de kullanabilirsiniz. Border Layout'un hem yatay hem de dikey ukurlar vardr. Gney ve kuzey elemanlarna ek olarak, dier yn elemanlar da kullanlabilir. Panelin her bir tarafna elemanlar yerletirebilir siniz. Border Layout zerinde ukurlar oluturmak iin, aadaki piksel deerlerini parametre olarak kabul eden komutu kullannz. SetLayout(new BorderLayout(10,10)); rnek; //Path /Examples100/BorderLayout/BorderLayout1.java import java.awt.*; public class BorderLayout1 extends Frame{ public static void main (String args[]){ Frame fr=new Frame("BorderLayout!"); Button butN, butS, butE, butW, butC; butN=new Button(North); butS=new Button(South); butE=new Button(East); butW=new Button(West); butC=new Button(Center); fr.setSize(250,250); fr.add(North,butN); fr.add(South,butS); fr.add(East,butE); fr.add(West,butW); fr.add(Center,butC); fr.show(); } }

GridLayout Manager
Bu yerleim tipi sra ve stun mantna dayanr. Mesela sral ve iki stunlu bir GridLayoutta GUI paralarn yerletirmek zere alt adet hcre oluur.

BY Ahmet Tolga Tat

Sayfa 141

Grid ve Grid Bag Layout


Bir grid layout kullanarak bir paneli satrlar ve kolonlara ayrabilir siniz. Panele yerletirdiiniz her bir eleman gridin(zgarann) bir hcresine karlk gelir. Bir grid layout'u oluturmak iin ka satr ve stundan oluacan belirleyiniz. Aadaki rnekte olduu gibi satr ve stun saylarn parametre olarak veriniz. SetLayout(new GridLayout(3,3)); Grid layoutlarda elemanlar arasnda yatay ve dikey boluklar oluur. Bu balklar, aadaki piksel deerlerini ekleyerek oluturabilirsiniz. SetLayout(new GridLayout(3,3,10,15)); Yukardaki kod 10 piksel yatay, 15 piksel dikey boluk oluturur. GridBagLayout'lar, GridBAgLAyout snfndan elemanlarla oluturulur. GridBagLayout sizin kullanc arayz elemanlarnz dikdrtgensel bir grid ierisinde kullanmanza yarar; fakat GridBagLayout'larda programc daha fazla kontrol yapmak durumundadr.

rnek; //Path /Examples100/GridLayout/GridLayout1.java import java.awt.*; import java.applet.Applet; public class GridLayout1 extends Applet{ Button but1,but2,but3,but4,but5,but6; public void init() { setLayout(new GridLayout(3,2)); //3 sra 2 sutun but1=new Button(But1); but2=new Button(But2); but3=new Button(But3); but4=new Button(But4); but5=new Button(But5); but6=new Button(But6); add(but1); add(but2); add(but3); add(but4); add(but5); add(but6); } }

BY Ahmet Tolga Tat

Sayfa 142

Kart(Card) Layoutlar
Kart layoutlar dier layoutlardan farkllklar gsterir. Dier layoutlarn tam tersine, bir kart layoutuna elemanlar eklediimiz zaman, hepsi bir kerede ekranda gsterilmez. Kart layoutlar, bir slide show gibi her bir kart arka arkaya bir defada gste rmek iin kullanlr. Genellikle, bir kart layout'u olutururken, ekleyeceiniz elemanlar dier container elemanlar olabilir(genellikle paneller). Her bir kart iin farkl bir layout kullanarak, farkl grnmde ekranlar oluturabilirsiniz. Panele eklediiniz her bir kart iin bir isim veriniz. Sonrasnda, metodlar kullanarak CardLayout snfnda tanmlanan metodlarla layout ierisindeki kartlar arasnda gei yapabilirsiniz. Aadaki rnekte, kart ieren bir layout vardr: setLayout(new CardLayout()); Panel deneme1=new Panel() add("Birinci",deneme); Panel deneme2=new Panel() add("kinci",deneme2); Panel deneme3=new Panel() add("nc",deneme3); show(bu,"kinci");

Insets(kmeler)
Insetler, bir panel zerinde elemanlar arasnda yatay ve dikey boluklarn miktarn panel ierisinde belirlemede kullanlr. Panel zerine yerletirilecek elemanlarn stten, alttan, soldan ve sadan ne kadar boluk braklacan belirlemede kullanlrlar. Bir inset oluturmak iin insets() metodunu kullann z. Public Insets insets(){ return new Insets(10,10,10,10); } Insets() metodunun yanna verilen isim, rnein yukardaki fonksiyon ismi de Insets olmak zere, yanna ald drt parametrik deer ile panel zerinde yukardan, aadan, sadan ve soldan piksel olarak ne kadar boluk braklacan belirlerler.

Button
Radyo butonlar, kontrol kutularnn bir versiyonudur. Radyo butonlar grn olarak kontrol kutular gibidir. Fakat, bir radyo buton grubundan sadece bir tanesi seilebilir. Bu butonlar birbirlerine seri bal ekildedir. Bir radyo butonlar grubu oluturmak iin ilk nce, bir CheckboxGroup oluturulmaldr: CheckboxGroup.cbg=new CheckBoxGroup(); Yukarda da grld gibi ilk nce bir kontrol kutusu grubu oluturulmal ve daha sonra aadaki gibi kontrol kutusu elemanlar tanmlanmaldr. BY Ahmet Tolga Tat Sayfa 143

add(new CheckBox("Evet",cbg,true); add(new CheckBox("Hayr",cbg,false); imdi dier bir rnei inceleyelim: CheckBoxGroup.cbg=new CheckBoxGroup(); add(new CheckBox("Yeil",cbg,true); add(new CheckBox("Krmz",cbg,false); Yukardakilere ek olarak, getCheckGroup( ) ve setCheckboxGroup( ) metodlarn kullanarak verilen bir kontrol kutusuna eriebilir ve onun grubunu deitirebilirsiniz. Sonu olarak, getCurrent() ve setCurrent(checkbox) metodlar, bir kontrol grub u ierisinde tanmlanrlar ve seili, geerli olan kontrol kutularna erimeyi ve herhangi bir kontrol kutusunu geerli hale getirm eyi salayan metodlardr.

Choice Seim menleri etiketler, butonlar ve kontrol kutularna gre daha karmak kullanc arayz (UI) elemanlardr. Seim menleri popup men (pull down men) tipinde olabilirler. Kullancnn bir men elemann semelerine olanak salarlar. Sonrasnda da seim ekranda grnr. Bir seim mens oluturmak iin Choice snfndan bir rnek yaratlmaldr. Sonrasnda, oluturduunuz bu men sistemine eleman eklemek iin addItem() metodunu kullannz. Choice c=new Choice(); c.addItem("Elma"); c.addItem("Armut"); add(c); --meny panele ekler Seim mens ayn anda sadece bir tane eleman seme olana salar. Ayn anda birden ok eleman semek iin kaydrmal listeleri(scrolling list) kullannz. Seim Mens Metodlar {PRIVAT E}Metod getItem(int ) countItems () getSelecte dIndex() getSelecte dItem() select(int) select(strin g) Hareketi int parametresi ile belirlenen men elemann geriye dndrr, int parametresi 0 deeri ile balar ve dizi mantnda olduu gibi kullanlr. Bir seim mensndeki eleman saysn verir. Seili men elemannn indeks pozisyonunu geriye dndrr. Bir string olarak o anda geerli olan eleman geriye dndrr. Verilen bir pozisyondaki eleman seer. Verilen string ile men elemann seer.

rnek; //Path /Examples100/Choice/Choice1.java import java.awt.*; import java.applet.Applet; BY Ahmet Tolga Tat Sayfa 144

public class Choice1 extends Applet{ Choice renkSecici; public void init() { renkSecici=new Choice(); renkSecici.addItem (Mavi); renkSecici.addItem (Sari); renkSecici.addItem (Yesil); add(renkSecici); } }

Checkbox
aretleme kutular. Kontrol kutular, semek veya seimi kaldrmak iin kullanlan iki deerli elemandr. Kontrol kutular iaretli(on) veya iaretsiz(off)dirler. Bu kontrol kutularn belirlemek iin iki zel durum sz konusudur: zel olmayan halde, kontrol kutular birden ok ise birbirlerine seri olarak bal deildirler. zel halde ise, bir seri kontrol kutusu vardr ve ilerinden sadece birisi seilebilecektir. zel olmayan kontrol kutularn CheckBox snfn kullanarak aadaki seeneklerden biriyle oluturabilirsiniz: CheckBox(), seili olmayan kontrol kutusunu oluturur. CheckBox(String), verilen stringi etiket olarak kullanan bir kontrol kutusu oluturur. CheckBox(String,null, boolean), verilen stringi etiket olarak kullanan bir kontrol kutusu oluturur ve boolean argmannn doru(true) olup olmamasna(false) gre ya seilidir ya da seili deildir. Aada kontrol kutular iin harlanm rnekleri bulabilirsiniz: add(new Checkbox("kitap")); add(new Checkbox("kalem")); add(new Checkbox("silgi")); add(new Checkbox("anta,null,true"); Kontrol Kutusu Metodlar {PRIVATE} Hareketi Metod getLabel() Kontrol kutusunun etiketini geriye dndrr. setLabel(strin Kontrol kutusunun etiketini deitirir. g) getState() Kontrol kutusunun seili olup olmadn geriye dndrr. setState(bool Kontrol kutusunun durumunu deitirir, seili ise seili deil, seili deilse seili ean) durumuna dndrr. BY Ahmet Tolga Tat Sayfa 145

rnek; //Path /Examples100/Checkbox/Checkbox1.java import java.awt.*; import java.applet.Applet; public class Checkbox1 extends Applet{ Checkbox cb1; Checkbox cb2; public void init() { cb1=new Checkbox(Acil); cb2=new Checkbox(Lux); add(cb1); add(cb2); } }

Radio Buttons
CheckboxGroup kavramyla birlemi ve ilikili hareket eden Checkboxlara verilen isimdir. Radyo butonlar, kontrol kutularnn bir versiyonudur. Radyo butonlar grn olarak kontrol kutular gibidir. Fakat, bir radyo buton grubundan sadece bir tanesi seilebilir. Bu butonlar birbirlerine seri bal ekildedir. Bir radyo butonlar grubu oluturmak iin ilk nce, bir CheckboxGroup oluturulmaldr: CheckboxGroup.cbg=new CheckBoxGroup(); Yukarda da grld gibi ilk nce bir kontrol kutusu grubu oluturulmal ve daha sonra aadaki gibi kontrol kutusu elemanlar tanmlanmaldr. add(new CheckBox("Evet",cbg,true); add(new CheckBox("Hayr",cbg,false); imdi dier bir rnei inceleyelim: CheckBoxGroup.cbg=new CheckBoxGroup(); add(new CheckBox("Yeil",cbg,true); add(new CheckBox("Krmz",cbg,false); Yukardakilere ek olarak, getCheckGroup( ) ve setCheckboxGroup( ) metodlarn kullanarak verilen bir kontrol kutusuna eriebilir ve onun grubunu deitirebilirsiniz. Sonu olarak, getCurrent() ve setCurrent(checkbox) metodlar, bir kontrol grubu ierisinde tanmlanrlar ve seili, geerli olan kontrol kutularna erimeyi ve herhangi bir kontrol kutusunu geerli hale getirm eyi salayan metodlardr.

rnek; BY Ahmet Tolga Tat Sayfa 146

//Path /Examples100/Radio/Radio1.java import java.awt.*; import java.applet.Applet; public class Radio1 extends Applet{ CheckboxGroup cbg; public void init() { cbg=new CheckboxGroup(); add(new Checkbox(bir,cbg,true));
add(new Checkbox(iki,cbg,false)); add(new Checkbox(uc,cbg,false));

} }

Menuler

Choice menus
Seim menleri etiketler, butonlar ve kontrol kutularna gre daha karmak kullanc arayz (UI) elemanlardr. Seim menleri popup men (pull down men) tipinde olabilirler. Kullancnn bir men elemann semelerine olanak salarlar. Sonrasnda da seim ekranda grnr. Bir seim mens oluturmak iin Choice snfndan bir rnek yaratlmaldr. Sonrasnda, oluturduunuz bu men sistemine eleman eklemek iin addItem() metodunu kullannz. Choice c=new Choice(); c.addItem("Elma"); c.addItem("Armut"); add(c); --meny panele ekler Seim mens ayn anda sadece bir tane eleman seme olana salar. Ayn anda birden ok eleman semek iin kaydrmal listeleri(scrolling list) kullannz. Seim Mens Metodlar {PRIVAT E}Metod BY Ahmet Tolga Tat Hareketi Sayfa 147

getItem(int ) countItems () getSelecte dIndex() getSelecte dItem() select(int) select(strin g)

int parametresi ile belirlenen men elemann geriye dndrr, int parametresi 0 deeri ile balar ve dizi mantnda olduu gibi kullanlr. Bir seim mensndeki eleman saysn verir. Seili men elemannn indeks pozisyonunu geriye dndrr. Bir string olarak o anda geerli olan eleman geriye dndrr. Verilen bir pozisyondaki eleman seer. Verilen string ile men elemann seer.

Asagida Menuya bir rnek verilmistir.Programi kayit ederken BabaMenu diye kayid edip derleyin.Cnk programda Public olan BabaMenudr. rnek: import java.awt.*; import java.awt.event.*; class AnaMenu extends MenuBar { private MenuItem aGeri; private CheckboxMenuItem aRenk; public AnaMenu() { Menu m; //Datei m = new Menu("File"); m.add(new MenuItem("Yeni")); m.add(new MenuItem("Tekrar")); m.add(new MenuItem("Kaydet")); m.addSeparator(); m.add(new MenuItem("Cik")); add(m); //Bearbeiten m = new Menu("Calisma"); m.add((aGeri = new MenuItem("Geri"))); m.addSeparator(); m.add(new MenuItem("Kes")); m.add(new MenuItem("Kopyala")); m.add(new MenuItem("Yazdir")); m.add(new MenuItem("Sil")); add(m); //Optionen BY Ahmet Tolga Tat

Sayfa 148

m = new Menu("Optionen"); m.add(new MenuItem("Einstellungen")); m.add((aRenk = new CheckboxMenuItem("Renk"))); add(m); //Info m=new Menu("Bilgi"); m.add(new MenuItem("Hakkinda")); m.add(new MenuItem("Yardim")); Menu m1=new Menu("YaziTipi"); m1.add(new MenuItem("Verdana")); m1.add(new MenuItem("Arial")); m1.add(new MenuItem("Impact")); m.add(m1); add(m); enableRueckgaengig(false); //Farbe anschalten setFarbe(true); } public void enableRueckgaengig(boolean ena) { if (ena) { aGeri.setEnabled(true); } else { aGeri.setEnabled(false); } } public void setFarbe(boolean on) { aRenk.setState(on); } }

public class BabaMenu extends Frame { public static void main(String[] args) { BabaMenu wnd=new BabaMenu(); } public BabaMenu() { super("Menu Programi"); setLocation(100,100); setSize(500,400); setBackground(Color.white); BY Ahmet Tolga Tat Sayfa 149

setMenuBar(new AnaMenu()); setVisible(true); addWindowListener ( new WindowAdapter() { public void windowClosing(WindowEvent event ) { setVisible(false); dispose(); System.exit(0); } } );//dikkat ) ? } }

Text Fields
Text alanlar, string giriine olanak salayan kullanc arayz elemanlardr. Text alan oluturmak iin aadaki admlardan birini kullanabilirsiniz: TextField(), 0 karakter uzunluunda bo bir text alan oluturur. TextField(int), int parametresi ile verilen uzunlukta bir string oluturur. TextField(String), 0 karakter uzunluunda yer ayrarak verilen stringi ilk deer olarak atar. TextField(String, int), int parametresi uzunluunda yer ayrarak, String deerini ilk deer olarak atar. Aadaki rnek, 30 karakter uzunluundaki bir text alan oluturur ve ilk deer olarak ierisine "Adnz Giriniz:" stringini yerletirir. TextField tf=new TextField("Adnz Giriniz",30) add(tf); BY Ahmet Tolga Tat Sayfa 150

Text alanlarnn nnde etiketler kullanabilirsiniz. Text alanlar, text blgesinden(text area) farkldr. Text alanlar snrl byklkteyken tek satrlk bilgilerin girii iin kullanlrlar. Text alanlar snrl byklkteyken tek satrlk bilgilerin girii iin kullanlrlar. Text blgelerinin kaydrma ubuklar ve pencereleri vardr, bu yzden kullanm asndan ok satrl bir text alan gibi dnlebilir. Text alanlarn ifreler iin de kullanabilirsiniz. Bu tip text alanlarnn ierisine bilgi girii olduu halde girilen karakterleri belirleyemezsiniz. Text alan ile bir ifre oluturmak iin, ilk nce bir text alan oluturulur ve daha sonra setEchoCharacter( ) metodu kullanlr. Aadaki rnek bir ifre girii salar: TextField tf=new TextField(30); tf.setEchoCharacter("*"); Bu rnekte ise iki text alan ve bir ifre alan oluturulmaktadr: add(new Label("Adnz Giriniz")); add(new TextField("Adnz bu alana giriniz",45)); add(new Label("Soyadnz Giriniz")); add(new TextField("Soyadnz bu alana giriniz",45)); add(new Label("Telefonunuzu Giriniz")); TextField t=new TextField(20); t.setEchoCharacter('*'); add(t); Text alanlar TextComponent snfndan miras alnrlar. Text Alan Metodlar {PRIVATE} Hareketleri Metod getText() String olarak text alannn deerini geriye dndrr. setTextStrin Verilen stringi text alanna koyar. g() getColumns( Text alannn geniliini geriye dndrr. ) select(int,int ki tamsay pozisyon arasndaki textleri seer(pozisyonlardan 0'dan balar). ) selectAll() Text alanndaki tm textleri seer. Textin grnebilir olup olmadn belirler. True(doru) veya false(yanl) deeri isEditable() dndrr. setEditable( Textin grnebilirliini kaldrabilir veya eski haline dndrebilir, boolean boolean) parametresi true veya false deerlerinden birini alr. getEchoChar Text alanna girilen stringi kapatan karakteri belirler. () echoCharIsS Text alan iin stringi kapatma karakteri belirler et()

BY Ahmet Tolga Tat

Sayfa 151

Olay Yakalama(Events)
Kullanc tarafndan yaplan olaylar yani ilemleri ve hareketleri farkedebilme ve bunlarn etkisi ile baz grevleri yerine getirme kavramdr. JDK 1.1 ile beraber eski olay yakalama kavram tamamen deimitir. Artk ok daha fazla object oriented ve kullanm kolaydr. rnek; //Path /Examples100/Event/Event1.java import java.applet.Applet; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Event1 extends Applet implements ActionListener { Button but; TextField tf1, tf2; public void init() { setLayout(new BorderLayout()); but=new Button("Karesi"); tf1=new TextField(); tf2=new TextField(); tf2.setEditable(false); add("North",tf1); add("South",tf2); add("Center", but); but.addActionListener(this); } public void actionPerformed(ActionEvent e) { tf2.setText(Double.toString(Math.pow(Integer.parseInt(tf1.getText()),2))); } }

Kullanc Arayz(UI) Olaylarn ve Hareketlerini Ele Almak


Herhangi bir UI elemann harekete geirmek iin bir action() metodunu applet veya applet snfnda tanmalay nz. Public boolean action(Event evt,Object arg){ .......................... } action( ) metodu, temel mouse ve klavye hareketlerine benzer. Bu metodlar gibi, pas geilen nesne bu olay simgeler. Action metodunun ikinci argman olay retecek kullanc arayz elemanna dayanr. Bir BY Ahmet Tolga Tat Sayfa 152

eleman bir olay retirken, daha sonra gerekecek olan bilgiler pas edilir. Ek bilgiler action( ) metodu ile pas edilir. Etiketler haricindeki tm kullanc arayz elemanlarnn farkl hareketleri ve argmanlar vardr: Butonlar seilip, tklandnda hareket oluturulur ve bir butonun argman butonun etiketidir. Kontrol kutularnn her iki tr(exclusive ve non-exclusive checkboxes) de kutu seildiinde iaretlenir. Argman her zaman "dorudur". Seim menleri, bir men eleman seildiinde bir hareket retirler ve argman o seilen men elemandr. Text alanlar; kullanc imle text alanndayken enter tuuna basarak geri dnerken bir hareket yaratr. rnein, tab butonu ile bir dier text alanna geilebilir veya mouse ile bir buton tklanabilir veya return hareketine bal bir trigger(tetikley ici) koturulabilir. Temel hareketlerin tam aksine, seebileceiniz birok nesneye deiik hareketler balayablirsiniz. Bunlardan biri de, "Mouse Down" olaydr. Birok kullanc arayz elemanlarnn rettii farkl hareketleri action( ) metodu ile belirleyebilirsiniz. Bu arayz elemanlarnn hangilerinin hareket iin gnderildiklerini belirlemede instanceOf operatrn kullannz. Public void boolean action(Event evt,Object arg) { if(evt.target instanceof(TextField) handleText(evt.target); else if(evt.target instanceof Choice) handleChoice(arg); } Buna ramen, kullanc arayz elemanlarnn hareketini action( )'n bodysi ierisinde ele alabilirsiniz. Bylece her eleman ayr ayr metodla tanmlamak yerine, action( ) metodu ierisinde bir defada tanmlayabilirsiniz. Burada, iki tane handler(ele alan) metod var. Text alanndaki hareketi ele alan metod, handleText(). Seim mens zerindeki bir elemann hareketini ele alan handleChoice metodudur. Ele almak istediiniz harekete bel olarak, hareketten argman pas edebilirsiniz, rnein UI elemannn yollad bilgi veya dier ierebilecek herhangi bir bilgiyi... Aada be temel button zerinde renklendirilmi etiketler bulunmaktadr. Action( ) metodu, bit buton hareketi iin test eder ve kelimeyi changeColor( ) metoduna pas eder. Bylece zerine tklanan butonun r engi ekrann arka fontu olarak deiir.

import java.awt.*; public class ButtonActionsTest extends java.applet.Applet { public void init(){ setBackground(Color.white); add(new Button("Red")); add(new Button("Blue")); add(new Button("Green")); add(new Button("White")); add(new Button("Black")); } BY Ahmet Tolga Tat Sayfa 153

public boolean action(Event evt,Object arg) { if(evt.target instanceof Button) changeColor((String)arg); return true; } void changeColor(String bname) { if(bname.equals("Red")) setBackground(Color.red); else if(bname.equals("Blue")) setBackground(Color.blue); else if(bname.equals("Green")) setBackground(Color.green); else if(bname.equals("White")) setBackground(Color.white); else if(bname.equals(Color.black); } }

-e Paneller ve Elemanlar
zel appletlere kullanc arayz(UI) elemanlar elendiricidir; fakat i ie yerletirilmi panellerle grsel gzelliklere eriebilirsiniz. Bu panel zerine eitli boyutlarda paneller ekleyerek; zerlerinde farkl renkler belirleyebilirsiniz. e Paneller Paneller gerekten ekranda grntlenen elemanlardr; panellerin en byk snf containerlardr; dier elemanlar ierisinde bulundurur. Applet snf panelin bir alt snfndan kaltm yoluyla appletleri alr. Panelleri bir applet ierisine atmak iin, yeni bir panel oluturunuz ve applete ekleyiniz; dier herhangi bir kullanc arayz(UI) elemanlarn da ekleyebilirsiniz. SetLayout(new GridLayout(1,2,10,10); Panel Panel1=new Panel(); Panel Panel2=new Panel(); add(panel1); add(panel2); Daha sonrasnda, her bir paneli birbirinden bamsz olarak kullanabilirsiniz. Panel1.setLayout(new FlowLayout()); Panel1.add(new Button("Up")); Panel1.add(new Button("Down"));

Olaylar(Events) ve - e Paneller
-ie paneller yaratlrken, paneller bir hiyerari ierisinde sralanrlar. Bu hiyerari, bir appletteki elemanlarn birbiriyle nasl etkileeceini belirleyeeceinden nemlidir. Ayrca, hiyerari olaylar ele almay da etkiler, zellikle kullancnn giri olaylar, rnein mouse ve klavye olaylar gibi... Olaylar, en iteki elemanlardan alnr ve gvdeye doru zincir geilir. rnein, bir alt panelde mouse olaylar (mouseDown( ) ve mouseUp( ) metodlar) kullanlsn ve panel bir buton iersin. Butonu tklamak, paneli yaptndan nce butonun olay almas demektir. BY Ahmet Tolga Tat Sayfa 154

Temel olay metodlar geriye mantksal deerler dndrr. Bir olay ele alma metodu, ister temel olay metodlar olsun, isterse daha jenerik handleEvent( ) olsun, verilen rasgele bir olayda, aadaki eyi yapabilir: Olayla ilikili deildir (bu genellikle handleEvent( ) iin dorudur; nk tm olaylar sistem aracl ile retir). Durum bu ise, olay bir eleman onu proses edene kadar geer. Bu durumda, olay ele alma metodu "false(yanl)" geriye dndrmelidir. Olay yakalar, iler ve geriye "true(doru)" dndrr. Bu yntemde olay; o olayla ilintili metod ile durdurulur. Bu durumda temel mouseDown(); keyDown() metodlar kullanlr. Metodu yakalar, iler ve bir sonraki olay alcsna gnderir. Bu daha az kullanlan bir metoddur. Bu halde olay metodu, geriye "false(yanl)" dndrmelidir.

Kullanc Arayz Elemanlarna Ekler


Burada ele alnacak UI elemanlar hareket retmediklerinden, action( ) metodunu kullanarak davranlarn ele alamazsnz. Bunun yerine, jenerik bir handleEvent() kullanlmaldr.

Text Blgeleri(Text Areas)


Text blgeleri, text alanlarna(text fields) benzer; fakat text alanlarndan farkl olarak fazla miktarda veri satr alma yeteneine sahiptirler. Text alanlar snrl byklktedir ve aaya, yukarya doru kaydrlamaz. Text girii iin ok kullanl drlar. Bir text alan oluturmak iin aadaki fonksiyonlardan herhangi birini kullanabilirsiniz: TextArea( ), 0 satr uzunluunda ve 0 karakter geniliinde bo bir text blgesi oluturur. Text blgesine bir boyut vermeden panele eklemeyiniz; nk grntlenmemesi gibi bir problem oluacaktr. TextArea(int,int), verilen sayda satr ve kolondan oluan bo bir text blgesi oluturur. TextArea(String) 0 satr ve 0 kolondan oluan ve Stringi grntlemeye alan bir text blgesi oluturur. TextArea(String,int,int) verilen boyutta Stringi grntleyen bir text blgesi oluturur. String str="Bir zamanlar bir cad vard, kk ocuklar karrd" add(new TextArea(str,10,60)); Hem text blgeleri hem de text alanlar TextComponent snfndan zellikleri kaltm yoluyla alrlar.

Text Blgesi Metodlar


{PRIVATE}Metod Hareketi getColumns() Text blgesinin karakter veya kolon olarak geniliini belirler. getRows() Text blgesindeki satrlarn saysn dndrr. insertText(String,int) Pozisyonu belirtilen texti yerletirir. replaceText(String,int,i Verilen bir pozisyondaki yeni stringi eskisiyle deitirir. nt) setLineIncrement(int Scrollbarn ka satr olarak deieceini belirler, default deeri 1 dir inc) getLimeIncrement() Son noktas belirlenmi bir scrollbarn satrlar aras art miktarn BY Ahmet Tolga Tat Sayfa 155

belirler. getPageIncrement(int Scrollbar seiliyken bir sayfalk scrolling miktarn belirler.Default inc) deeri 10 dur. GetPageIncrement Scrollbar seiliyken bir scrolling hareketinin ka satr olduunu belirler.

Scrolling(kaydrma) Listeleri
Seim menlerini hatrlaynz, farkl opsiyonlar ierisinden bir seim yapmanza olanak salarlar. Bir kaydrma listesi, fonksiyonellik olarak seimlik menlere benzerler. Bir listeden birden ok seim yapabilirsiniz. Kaydrma listeleri iki nemli ynden farkllk gsterirler: Kaydrma listeleri(scrolling lists) pop-up men deillerdir. Elemanlardan oluan birer listelerdir. Bir listeden bir veya daha ok eleman seimine olanak salarlar. Dier elemanlara eriebilmeniz iin scrollbar(kaydrma ubuu) vardr. Bir kaydrma listesi, istenirse bir defada sadece bir eleman seimine olanak salar(exclusive) veya birden ok eleman seimini salayabilir(nonexclusive ). Bir kaydrma listesi oluturmak iin, List snfnn bir rneini yaratnz. Sonraki admda bir listeye eleman ekleyiniz. List snfnn iki constructor'u (oluturucusu) vardr. List() her defasnda sadece bir eleman seimine olanak salayan bir kaydrma listesi yaratr. List(int, boolean) belirlenen sayda grnen satr ile ekranda bo bir kaydrma snf yaratr. Boolean argman birden ok satr seilebiliyorsa (true), seilemiyorsa (false) deerini alr. Bir liste nesnesi oluturduktan sonra, addItem() metodunu kullanarak elemanlar listeye ekleyiniz. Sonra da, eleman ilikilendirmek istediiniz panele ekleyiniz. List eleman=new List(5,true); eleman.addItem("NewYork"; eleman.addItem("Chicago"; eleman.addItem("Miami"; eleman.addItem("Londra"; eleman.addItem("Michigan"; eleman.addItem("Paris";

Kaydrma Listesi Metodlar


table border> MetodHareketi getItem(int)Belirlenen pozisyondaki stringi geriye dndrr. countItems()Mendeki eleman saysn geriye dndrr. getSelectedIndex()Seili elemann index pozisyonunu geriye dndrr. getSelectedIndexes()Index pozisyonlarn bir dizi olarak geriye dndrr. getSelectedItem()Seili olan eleman bir string olarak geriye dndrr. getSelectedItems()Birden ok seili eleman varsa, bir dizi olarak string deerlerini geriye dndrr. select(int)Belirlenen bir pozisyondaki eleman seer. select(String)Be lirlenen bir stringe sahip eleman seer.

Scrollbar(kaydrma ubuklar) ve Sliderlar


Text alanlar ve kaydrma listeleri kendi kaydrma ubuklarna (scrollbars) sahiptirler. Bu tr kullanc arayz elemanlarnda kaydrma ubuklar elemanlardan bamsz paralar deillerdir. Bir kullanc arayz olarak kaydrma ubuklarn (scrollbars) veya sliderlar tek bana yaratabilirsiniz. Kaydrma ubuklar bir maximum ve minumum arasndaki deerleri semek iin kullanlr. BY Ahmet Tolga Tat Sayfa 156

Balang ve scrollbarn sonundaki oklar baz kk unite deerleri ile azaltlr veya arttrlabilir.(default deeri 1 dir) Bir defalk Page-Down hareketi sonucunda getirilecek satr says.(default deeri 10 dur) Scrollbar zerinde bulunan kutuya asansr veya baparmak denir. Mouse ile bu kut uyu hareket ettirerek listeler ierisinde daha hzl ilerleyebilirsiniz. Bir scrollbar yaratmak iin tane constructor(oluturucu) kullanabilirsiniz. Scrollbar(), default deeri 0 olan bir kaydrma ubuu yaratr. Scrollbar(int), default deeri 0 olan bir kaydrma ubuu yaratr. Argman, Scrollbar.Horizontal ve Scrollbar.Vertical snf deikenlerini kullanabilmeniz iin olanak salar. Scrollbar(int, int, int, int) aadaki argmanlara sahip bir scrollbar yaratr. Argman I. Scrollbarn yatay m yoksa dikey mi olduunu belirler: Scrollbar.Horizontal Scrollbar.Vertical Argman II. Maximum ve minumum deerler arasndaki deeri simgeler. Argman III. Scrollbarn kutusunun geniliini veya yksekliini belirler.
Argman IV. ve Argman V. scrollbar iin kullanlacak minumum ve maximum deerleri belirler. Aada ok basit bir scrollbar rnei listelenmitir. Bu scrollbarn sayac deitike sol tarafna kanc deer zerinde olduu yazlmaktadr. import java.awt.*; public class SliderTest extends java.applet.Applet { Label I; public void init() { I=new Label("0"); add(I); add(new Scrollbar(Scrollbar.HORIZONTAL,0,0,1,100)); } public boolean handleEvent(Event evt) { if (evt.target instanceOf Scrollbar) { int v=((Scrollbar)evt.target).getValue(); I.setText(String.valueOf(v)); } return true; } }

Scrollbar Metodlar
{PRIVATE}Metod getMaximum() getMinumum() getOrientation() getValue() setValue(int) Hareketi Maximum deeri geriye dndrr. Minumum deeri geriye dndrr. Scrollbarn ynn geriye dndrr: 0 ->Scrollbar.HORIZONTAL 1 ->Scrollbar.VERTICAL Scrollbarn o andaki geerli deerini dndrr. Scrollbarn geerli deerini oluturur.

Kanvaslar(canvases)
Bir kanvas(canvas) zerine izim yaplabilen bir elemandr. Bir kanvas yaratmak iin Canvas snfn kullannz. BY Ahmet Tolga Tat Sayfa 157

Canvas can=cew Canvas(); add(can);

UI Olaylar(kullanc arayz olaylar)


nceki blmde kullancnn klavye veya mouse giriinden retilen temel olaylarn zellikleri incelendi. Bu olay tipleri Event nesnelerinin bir olay numaras (event id) olarak depolanr. MouseDown(), keyDown() olaylarn kullanarak bu olaylar ele alan metodlar tanmlanr. Olaylar ynetmenin en genel yntemi, handleEvent() metodunu kullanmaktr.

Ek Olaylar(Events)
{PRIVATE}Ol ay Action_Event Key_Action List_Deselect List_Select Scroll_Absolut e Scroll_Line_D own Scroll_Line_U p Scroll_Page_D own Scroll_Page_U p Hareketi Bir UI eleman hareket oluturduunda retilir. Text alan hareketi olutuunda retilir. Bir kaydrma listesinde(scrollinglist) elemanlarn seimi kaldrldnda retilir. Bir kaydrma listesindeki elemanlarn seimi durumunda retilir. Scrollbarn kutusu hareket ettirilirken retilir. Scrollbarn altndaki veya solundaki ok tklandnda retilir. Scrollbarn stndeki veya sandaki ok tklandnda retilir. Scrollbarn altndaki alanlara veya sandaki alanlara geildiinde retilir. Scrollbarn zerindeki alanlara veya solundaki alanlara geildiinde retilir.

rnek: import java.awt.*; import java.applet.*; public class gui2 extends Applet { private TextArea t1,t2; private Button b; public void init() { String s ="Bir asagi bir de yukari dogru \n"+ "bakiyordu. Sanki birseyler arar gibiydi. \n" +

BY Ahmet Tolga Tat

Sayfa 158

"O sirada tam arkasinda bir seyler kimildadi.\n"+ "O da ne !!?...."; t1=new TextArea (5,20); t1.setText (s); t2=new TextArea (5,20); b=new Button ("KOPYALA>>>"); setLayout (new FlowLayout (FlowLayout.RIGHT,55,55)); add (t1); add (b); add (t2); } public boolean action (Event e,Object o) { if (e.target==b) { t2.setText (t1.getSelectedText()); return true; } return false; } }

rnek: import java.awt.*; import java.applet.*; public class renklicerceve extends Applet { private DemoFrame f; private Button showFrame; public void init() { String s="Click here!"; showFrame=new Button(s); add(showFrame); } public boolean action (Event e, Object o) { if (e.target==showFrame ) { String s="This frame does something!"; if (f!=null){ f.hide(); f.dispose(); } f=new DemoFrame(s); f.resize(300,200); f.setResizable(false); f.show(); } return true; } } class DemoFrame extends Frame { private Button a,b,c,d; public DemoFrame (String s) { super (s); a=new Button ("Yellow"); b=new Button ("Red"); c=new Button ("Blue");

BY Ahmet Tolga Tat

Sayfa 159

d=new Button ("Green"); add ("North",a); add ("East",b); add ("South",c); add ("West",d); } public boolean handleEvent (Event e) { if (e.id==Event.WINDOW_DESTROY){ hide(); dispose(); return true; } return super.handleEvent(e); } public boolean action (Event e,Object o) { if (e.target==a) setBackground (Color.yellow); else if (e.target==b) setBackground (Color.red); else if (e.target==c) setBackground (Color.blue); else if (e.target==d) setBackground (Color.green); repaint(); return true; } } rnek: import java.applet.Applet; import java.awt.*; public class kartlar extends Applet { private Canvas c; private CardLayout cardManager; private Panel deck,p1,p2,p3,p4; private Button b1,b2,b3,prevButton, nextButton,lastButton,firstButton; public void init() { setLayout ( new BorderLayout () ); b1=new Button ("FIRST CARD"); b2=new Button ("SECOND CARD"); b3=new Button ("THIRD CARD"); c=new Canvas(); c.setBackground(Color.green); c.resize(80,80); deck=new Panel(); cardManager=new CardLayout(); deck.setLayout (cardManager); add ("East",deck); p1=new Panel(); p1.add(b1); deck.add(b1.getLabel(),p1); p2=new Panel(); p2.add(b2); p2.add(c); deck.add(b2.getLabel(),p2); p3=new Panel(); p3.setLayout (new BorderLayout()); p3.add ("North",new Button ("North Pole"));

BY Ahmet Tolga Tat

Sayfa 160

p3.add ("West",new Button ("The West")); p3.add ("East",new Button ("Far East")); p3.add ("South",new Button ("South Pole")); p3.add ("Center",b3); deck.add(b3.getLabel(),p3); p4=new Panel(); p4.setLayout (new GridLayout(2,2)); p4.add (firstButton=new Button("First")); p4.add (nextButton=new Button("Next")); p4.add (prevButton=new Button("Previous")); p4.add (lastButton=new Button("Last")); add("West",p4); } public boolean action (Event e,Object o) { if (e.target==firstButton) cardManager.first(deck); else if (e.target==prevButton) cardManager.previous(deck); else if (e.target==nextButton) cardManager.next(deck); else if (e.target==lastButton) cardManager.last(deck); return true }}

BY Ahmet Tolga Tat

Sayfa 161

Java Applet
Java Applet Temelleri
Daha nce ilk appletimizi yazmtk ve o zaman appletimizi Applet snfndan extend etmemiz gerektiini renmitik. (Sonuta bir taraycnn ekrannda alabilmesi ve kendine o web sayfasnda bir alan yaratabilmesi iin bir sr yetenee sahip olmas lazm ve o yeteneklerini de ite hazr Applet classndan almaktadr. Bu yeteneklerle beraber belirli zamanlarda altrlan baz metotlar inherit eder. imdi bu metotlar tanyacaz. Applet Metotlar init() Bu metot, applet java destekli tarayc tarafndan ilk aldnda alr. Ve ilk ve son kez gerekli duyduumuz balang ilemlerini altrr. public void init(){ //mzii hafzaya yukle //baz sabitleri ve deikenleri ata } start() Start metodu appletin balang ilemleri sonulandktan sonra veya ayrca applet tekrar ziyaret edildii zamanlarda al r public void start(){ //gerekli ilemler bala //mzii almaya bala } stop() Bu metot appletin ekranda olmad zamanlarda arlr. public void stop(){ //threadleri dondur //mzii durdur } destroy() Destroy metotu, tarayc kapatld zaman alr ve genel de aktif olan threadleri ldrmek gibi son ilemleri yani temizlii yapmakla ykmldr. BY Ahmet Tolga Tat Sayfa 162

public void destroy(){ //tm alt threadleri ldr } resize(int genilik, int ykseklik) Init metotu iin de kullanlmas gereklidir, applete sayfa zerinde ayrlacak alan tanmlar. paint(Graphics g) Bu metot appletin alanndaki izimden sorumludur ve genelde applet ilk aldnda otomatik olarak ilk izimleri yapmak zere alr. Graphics snf alnr. public void paint(Graphics g) { g.drawString(Merhaba!,20,20); //ekrana Merhaba1 yazsn basar } update(Graphics g) Bu bir ara metottur. Repaint metodu painti armadan nce update ile ekran tekrar temizler ve hazrlar. repaint() Bu metot paint fonksiyonunu tekrar altrr. Appletlere Parametre Gndermek Bazen yazdnz programn kaynak kodunda deiiklik yapmaktansa dardan baz deerleri deitirmek iin ona parametreler gndeririz. Java Appletlerinde bunu HTML kodundaki applet komutuyla yapabiliyoruz. Yani bir web tasarmcs belli bir ama iin yazlm appleti deiik deerlerle altrabilir. nce web sayfasndan nasl gnderildiine bakalm; rnek; Path /Examples100/AppletBasics/AppletBasics1.html <title> Test Zamani </title> <hr> <applet code=Applet1.class width=200 height=200> <param name=x value=30> <param name=y value=40> </applet> <hr> imdi ise nasl alnp, kullanldna bakalm; rnek; // Path /Examples/AppletBasics/Applet1.java import java .awt .Graphics; import java.applet.Applet; public class Applet1 extends Applet{ String koordinatx, koordinaty; public void init(){ koordinatx=getParameter("x"); koordinaty=getParameter(" y"); } BY Ahmet Tolga Tat Sayfa 163

public void paint(Graphics g){


g.drawString("Merhaba!",Integer.parseInt(koordinatx), Integer.parseInt(koordinaty));

} }

Multimedia
Graphic Snfna Ait Metotlar drawLine (x1, y1, x2, y2) drawRect (x, y, genilik,ykseklik) fillRect (x, y, genilik, ykseklik) clearRect (x, y, genilik, ykseklik) drawRoundRect (x, y, genilik, ykseklik, arkGenilii, arkYkseklii) fillRoundRect (x, y, genilik, ykseklik, arkGenilii, arkYkseklii) draw3DRect (x, y, genilik, ykseklik, boolean kabark) fill3DRect (x, y, genilik, ykseklik, boolean kabark) drawOval (x, y, genilik, ykseklik) fillOval (x, y, genilik, ykseklik) drawArc (x, y, genilik, ykseklik, ilkA, arkAs) fillArc (x, y, genilik, ykseklik, ilkA, arkAs) drawPolygon (int [ ] xNoktalar, int [ ] yNoktalar, noktaSays) fillPolygon (int [ ] xNoktalar, int [ ] yNoktalar, noktaSays) drawsString (string s, x, y) drawChars (char data [ ], offset, uzunluk, x, y ) drawBytes (byte data [ ], offset, uzunluk, x, y ) rnek; //Path /Examples100/Graphics/Graphics1.java import java.awt.*; import java.applet.Applet; public class Graphics1 extends Applet { public void paint (Graphics g) { g.drawLine(10,10,10,40); g.drawRect(50,50,20,20); g.fillRect(80,80,20,20); g.drawArc(110,110,30,15,30,90); } } Image Kullanm ve Metotlar drawImage(Image im, int x, int y, ImageObserver resimTutucu) Resmi iz. Image Bu deiken imaj dosyalarn tutar. getImage(URL url, String s) Verilen resmi alr ve atayabilir. BY Ahmet Tolga Tat Sayfa 164

rnek; //Path /Examples100/Image/Image1.java import java.awt.*; import java.applet.Applet; public class Image1 extends Applet { Image im; public void init() { im=getImage(getDocumentBase(),"Im1.gif"); } public void paint (Graphics g) { g.drawImage(im,5,20,this); g.drawString("Bu bir cicek",5,10); } }

Audio Kullanm Metotlar


AudioClip Bu deiken ses dosyalarn tutar. getAudioClip(URL sesDizini, String sesDosyas) AudioClip.play() AudioClip.loop() AudioClip.stop()

rnek; //Path /Examples100/Audio/Audio1.java import java.awt.Graphics; import java.applet .*; public class Audio1 extends Applet{ AudioClip ses; public void init() { ses=getAudioClip(getDocumentBase(),"S1.au"); } public void start() { ses.loop(); } public void stop() { ses.stop(); } BY Ahmet Tolga Tat Sayfa 165

} Asagidaki Applet dgmelere basildikca au dosyalarini calistirir.Programi calistirmak icin hello.au ve world .au muzik dosyalariniz olmasi gerekir.

rnek: import java.awt.*; import java.awt.event.*; import java.applet.*; public class HWApplet extends Applet implements ActionListener { Button hello; Button world; AudioClip helloClip; AudioClip worldClip; public void init() { super.init(); setLayout(new FlowLayout()); hello = new Button("Hello"); hello.addActionListener(this); add(hello); world = new Button("World"); world.addActionListener(this); add(world); helloClip = getAudioClip(getCodeBase(),"hello.au"); worldClip = getAudioClip(getCodeBase(),"world.au"); } public void actionPerformed(ActionEvent event) { String cmd = event.getActionCommand(); if (cmd.equals("Hello")) { helloClip.play(); } else if (cmd.equals("World")) { worldClip.play(); } } }

BY Ahmet Tolga Tat

Sayfa 166

mgelerin Yklenmesi, Gsterimi ve Boyutlandrlmas


Java'nn okluortam zellikleri grafikler, imgeler, animasyonlar, sesler ve ksaca video'yu iermektedir. Biz okluortam konumuza imgelerle balyoruz. Konunun daha iyi anlalmas iin aadaki rnek zerinde incelemeler yaparak gerekli ksmlar detayl bir bii mde ele alnacaz. import java.awt.*; import java.applet.Applet; public class deneme extends Applet {

privateImage deneme;

public void init() {

deneme=getImage(getDocumentBase(),"deneme0.jpg"); } public void paint( Graphics g ) { g.drawImage(deneme,1,1,this); int width=deneme.getWidth(this); int height=deneme.getHeight(this); g.drawImage( deneme,1,90,width*2,height*2,this); } }

Yukardaki programda image tipindeki deneme deikeni aadaki satrda ilkleniyor. deneme=getImage(getDocumentBase(),"deneme0.jpg");Buradaki getImage metodunun 2 parametresinden ilki olan getDocumentBase(), 2. parametrede kullanlan dosyann lokasyonunu belirten bir metoddur. 2. parametrede kullanlan dosya isminin gif veya jpg uzantl olmas gerekir. Applet'in paint metodu Graphics ve drawImage metodunu kullanarak imgeyi grntler. Applet, drawImage metodunun iki versiyonunu kullanyor. g.drawImage(deneme[currentimage],1,1,this);satrnda girilen 4 parametreden ilki image nesnesini, 2. ve 3. parametreler imgenin sol st kesini, 4. parametre ise appleti gsterir. g.drawImage( deneme,1,90,width*2,height*2,this)satr imgenin yeniden boyutlandrlm halinin kts iin drawImage metodunun dier versiyonunu kullanyor. Bu satrda imgenin ktsnda boyutunun imgenin orjinal boyutunun 2 kat olmas salanyor.

BY Ahmet Tolga Tat

Sayfa 167

import java.awt.*; import java.applet.Applet; public class denemeloop extends Applet { private Image deneme[]; private int totalimages=15, currentimage=0, sleeptime=50;

public void init() { deneme = new Image[totalimages]; for (int i=0;i < deneme.length;i++) deneme[i]=getImage(getDocumentBase(),"deneme"+i+".jpg");

} public void paint( Graphics g ) { g.drawImage(deneme[currentimage],1,1,this); currentimage=(currentimage+1)%totalimages; try{ Thread.sleep(sleeptime); } catch(InterruptedException e) { showStatus (e.toString()); } repaint(); } public void start() { currentimage=0; } }

Denemeloop snf applet'in init metodunda yklenen image tipinde bir diziyi iler. GetImage metodu her bir imgenin yklenmesi iin kullanlyor: deneme[i]=getImage(getDocumentBase(),"deneme"+i+".jpg");2. parametrede geen "deneme"+i+".jpg" format, i saya deerine gre sras gelen her bir dosyann alnmas iin BY Ahmet Tolga Tat Sayfa 168

kullanlmaktadr. rnekteki animasyonun gsterimi Applet'in paint metodu tarafndan salanyor.Programn hemen banda tanmlanan CurrentImage deikeni gsterilen imgelerden o andaki(gsterilen) imgenin numarasn tutar. Bu sayede drawImage metodunda deneme dizisinin kanc elemann applet'e kt olarak verilecei belirlenir.lk olarak drawImage metodu bir erevenin gsterimi iin kullanlyor, sonra applet ok ksa bir sre iin (50 milisaniye) bekler: Thread.sleep(sleeptime);Sonra, repaint metodu alr. Bu metod applet'in update metodunu applet'in arka yznn silinmesi (temizlenmesi) iin arr.Daha sonra update metodu paint metodunu bir sonraki imgenin gsterimi iin aktif hale getirir. Bu applet'in altrlmas esnasnda imgelerin yklenmesinin zaman ald grlyor. Ykleme anndaki bu zaman kayb programn almasda genel bir yavalamaya neden olmaktadr. Bunun asl nedeni ise paral imgelerin grntlenmesinden kaynaklanmaktadr. Ayrca, bu animasyon her imge grntlenmesinde bir titreim yapmaktadr. Bunun sebebi ise arlan update metodudur. update metodu applet'i temizledii zaman, temizleme iini applete yine applet boyunda bo bir ereve izmeyle yapmaktadr. Bu, az nce izilen imgenin silinmesini salamaktadr. Sonu olarak, applet bir imge izer, belli bir sre bekler, sonra appletin arka plann siler(titreime neden olur) ve yeni imgeyi izer. Applet, sonsuz zyinelemeli bir arm gerekletiriyor grnyor- paint, repainti. repaint metodu update metodunu; update, paint'i; paint ise tekrar repaint metodunu armaktadr. Bu sonsuz zyinelemeli arm 'daki asl problem eer kullan c baka bir Web sayfasna gese bile bu applet CPU kullanmaya devam edecektir ve belki sistemin performans decektir.

ift Grafik Tamponlama


Eer okluortam tabanl uygulamalar gelitirmek istiyorsanz, kullanclarnz sizden dzgn ses ve animasyonlar isteyeceklerdir. Kt sunular kabul edilemez. Mutlaka elinizdekinin en mkemmelini vermelisiniz.ift Grafik Tamponlama(graphics double buffering) tekniiyle, program bir imgeyi ekrana sunarken(render ederken) bir yandan dier imgeyi de gsterim iin ekransz tampon(off-screen buffer) iinde hazrlayabilir. Tabii ki, bu yntemle gelen fazla bellek sarfiyat da olacaktr. Bu extra bellek ihtiyac fazla olabilir ama gelimi grnt performans bu ihtiyaca deecektir. ift Grafik Tamponlama(graphics double buffering) yntemi paint metodu d nda kalan herhangi bir metod iinde izim iini gerekletirmek zorunda olan baz programlarda da faydal olmaktadr. Ekransz tampon(off-screen buffer) metodlar hatta farkl snflarn nesneleri arasnda izim iin gidip gelebilir. izimin sonular daha sonra grntlenebilir. Uyar:Double buffering(ift Grafik Tamponlama) yntemi animasyonun titreimini azaltabilir ancak animasyonun ileyi hzn grnr ekilde yavalatabilir. ift Grafik Tamponlama'nn basite ierii yledir: bo bir Image yarat, bo imgenin zerini iz(Graphics snfnn metodlarn kullanarak) ve imgeyi grntle.Aadaki kod bir nceki denemeloop rneinin alp ift grafik tamponlama ynteminin eklemi halidir . import java.awt.*; import java.applet.Applet; public class denemeloop2 extends Applet { private Image deneme[]; private int totalimages=2, BY Ahmet Tolga Tat Sayfa 169

currentimage=0, sleeptime=50; private Graphics gContext; private Image buffer;

public void init() { deneme = new Image[totalimages]; buffer=createImage(160,80); gContext=buffer.getGraphics(); gContext.setColor(Color.white); gContext.fillRect(0,0,160,80);

for (int i=0;i < deneme.length;i++) deneme[i]=getImage(getDocumentBase(),"deneme"+"loop2"+i+".jpg");

} public void start() { gContext.drawImage(deneme[0],0,0,this); currentimage=1; } public void paint( Graphics g ) { g.drawImage(buffer,0,0,this); gContext.fillRect(0,0,160,80); gContext.drawImage(deneme[currentimage],0,0,this); currentimage=(currentimage+1)%totalimages; try{ Thread.sleep(sleeptime); } catch(InterruptedException e) { showStatus (e.toString()); } repaint(); }

BY Ahmet Tolga Tat

Sayfa 170

ift Grafik Tamponlama ynteminin uygulan nda iki anahtar para var-bir Image(imge) referans(bu programda buffer) ve bir de Graphics referans(gContext bu programda). Image(mge), grntlenecek pixellerin sakland yerdir.Graphics referans da bu pixellerin izimi iin kullanlr.Image ve Graphics referanslar ekran-harici imge(off-screen image) ve ekran-harici grafik ierii(off-screen graphics context)'ne iaret ederler nk bu iki deiken gerek ekran pixel hesab deil tampon pixel hesaplamalarn yaparlar. ift grafik tamponu aadaki iki satrla(init metodunda) oluturulur: buffer=createImage(160,80); gContext=buffer.getGraphics(); lk satr applet'in createImage metodunu,boyutlar 160 a 80 olan bir imge yaratmak iin kullanr. kinci satr Image snfnn getGraphics metodunu Image tipindeki buffer deikeninden grafiin ieriini almak iin kullanr. gContext referans ekran-d imge iziminde kullanlacaktr. gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); satrlar ekran-d grafik ieriinin izim rengini beyaz yapar ve ekran-d imgeye beyaz bir dikdrtgen izer. Start metodu, imge dizisindeki ilk imgenin gContext kullanlarak izilmesini salar. mge buffer deikeninde saklanr. Paint metodu buffer deikeninde bulunan imge herneyse onu grntlemekle ve bir sonraki imgenin hazrlndan sorumludur. lk olarak, fillRect ekran-d imgenin temizlenmesi iin kullanlr. Sonra, bir sonraki imge ekran-d imgeye izilir. Belli bir sre bekledikten sonra repaint metodu arlr.Bu arm ayr bir thread ileyiine(update alr) neden olur. Bu applet'in almas srasnda animasyonun hala imge yklenmesi srasnda dzgn olmadna dikkat ediniz. Ancak, imgeler tamamen yklendikten sonra, bir nceki rnekteki titreimlerin birou elenmi hale gelir.Appletin bu versiyonu hala bir sonsuz zyineleme iindedir.Bir sonraki rnekte titreimleri tamamen eleyeceiz

mge Ykleme Denetimi iin MediaTracker


Sizin de ilk iki animasyonda grdnz gibi, imgeler yklendiinde, yklenen imgeler belli aralklarla paral imgeler gibi grntleniyorlard. Bu, animasyonun irkin ve gze ho gelmeyen bir grnt vermesine neden oluyordu. Aadaki programda animasyonu Java'nn MediaTracker tipini kullanmak iin atk. Ne zaman ki bir imge tamamen yklendiinde animasyonun bir paras gibi grntlenir. import java.awt.*; import java.applet.Applet; public class denemeloop3 extends Applet { private Image deneme[]; privateint totalimages=2, currentimage=0, sleeptime=50; private Graphics gContext; private Image buffer;

BY Ahmet Tolga Tat

Sayfa 171

private MediaTracker imageTracker; public void init() { deneme = new Image[totalimages]; buffer=createImage(160,80); gContext=buffer.getGraphics(); gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); imageTracker=new MediaTracker(this); for (int i=0;i < deneme.length;i++){ deneme[i]=getImage(getDocumentBase(),"deneme"+"loop2"+i+".jpg"); imageTracker.addImage(deneme[i],i); } try{ imageTracker.waitForID(0); } catch(InterruptedException e) { } } public void start() { gContext.drawImage(deneme[0],0,0,this); currentimage=1; } public void paint( Graphics g ) { g.drawImage(buffer,0,0,this); if (imageTracker.checkID(currentImage,true)){

gContext.fillRect(0,0,160,80); gContext.drawImage(deneme[currentimage],0,0,this); currentimage=++currentimage%totalimages; } try{ Thread.sleep(sleeptime); } BY Ahmet Tolga Tat Sayfa 172

catch(InterruptedException e) { showStatus (e.toString()); } repaint(); } public void update(Graphics g){ paint(g);}

} Grld gibi denemeloop3.html rnei ilk iki rnekten daha dzgn almtr. Bunu salayan da MediaTracker snfdr. mgeleri bir programa yklerken, imgeler programn o imgenin yklenmesinin ne zaman tamamlandn belirleyebilmesi iin MediaTracker snfndan bir nesneyle kaytlanrlar. imageTracker=new MediaTracker(this); satryla MediaTracker ilklenir. Constructor'un parametresi bir ImageObserver(imgelerin zerinde izilecei nesne)'dr. Bu durumda applet(this) ImageObserver grevindedir. GetImage metodunun her imgenin yklenebilmesi iin almasndan sonra imageTracker.addImage(deneme[i],i);satr yklenen imgeyi MediaTracker nesnesi olan imageTracker ile kaytlamak iin altrlr. lk parametre yklenen imgeye referans eden deiken, 2. parametre de MediaTracker' o imgenin statsnde sorgulamak iin kullanlabilecek bir tamsay ID'dir. ID tek olmak zorunda deildir. Birok imgeyi bir grup olarak izlemek iin ayn ID numaras verilebilir. Tm imgeler imageTracker ile kaytlandktan sonra imageTracker.waitForID(0);satr 0 ID'li imge tamamen yklenene kadar programn beklemesini salar. Program, imge yklenene kadar almasn durdurur. lk imgenin yklenmesi tamamlandnda, start metodunda grntlenmesi iin hazrlatlr, sonra paint metodunda grntlenir. Sonraki imgenin grntlenmesi iin hazrlan bir if yaps tarafndan paint metodunda salanr. if (imageTracker.checkID(currentImage,true))koulu 2 i yapar. lki, checkID metodu, imgenin tamamen yklenip yklenmediini anlamak iin currentImage' kontrol eder. Eer yklenmise true deeri dner ve if yapsnn vcudu sonraki imgenin hazrlan iin alr.Eer imge tamamen yklenmemise if yaps false deeri dndrr ve else paras alr. Eer checkID almaya baladnda imge daha yklenmeye balamamsa 2. parametre imge yklemeye imdi balamaldr anlamna gelmektedir. MediaTracker titreimi engellemez, basite imgeler yklendike animasyonun balangcn dzeltir. Dolaysyla paral imgeler grntlenmez. Tm titreimin engellenmesi iin, kendi tanmmz olan applet'in update metodunu saladk. nceki rneklerde update metodu applet'i silip, paint metodunu aryor demitik. Appletin temizlenmesi titreime neden olur. Bizim update tanmmz orjinal update metodunu override etmektedir. Yeni versiyon basite paint metodunu armaktadr. Applet temizleme ilemi yaplmad!. Ama bir nceki imgenin yerini nasl temizleriz? Cevap, biz temizlemeyi zaten yapmtk. Her imgenin grntlenmesi iin hazrlan srasnda, ekran-d imgeyi temizliyoruz, dolaysyla arka plan tamamen beyaz. Sonra, yeni imgeyi beyaz arka plana iziyoruz. Ekran-d imge grntlendiinde, yeni imgenin beyaz arka plan applet zerindeki tm imgeyi saklar.

BY Ahmet Tolga Tat

Sayfa 173

Animasyon ak iin ayr bir thread kullanmak


imdiye kadar grlen tm animasyon rneklerindeki ortak sorun appletin srekli almasyd. Aadaki rnek program yeni bir okluortam veya animasyon teknii sunmaktan ok bir animasyonun "browser friendly" olmas iin yaratlmasnn kolay bir yolunu sunmaktadr. nceden deindiimiz gibi, kullanc baka bir sayfaya gese bile animasyonlarmz almaya ve CPU zamann almaya devam edecektir. Bu rneke animasyonu ayr bir thread t olarak altrmamz ve thread zerinde kontrolmzn olmas iin applet'i ayoruz. import java.awt.*; import java.applet.Applet; public class denemeloop4 extends Applet { private Image deneme[]; private int totalimages=2, currentimage=0, sleeptime=50; private Graphics gContext; private Image buffer; private MediaTracker imageTracker; private Thread animate; public void init() { deneme = new Image[totalimages]; buffer=createImage(160,80); gContext=buffer.getGraphics(); gContext.setColor(Color.white); gContext.fillRect(0,0,160,80); imageTracker=new MediaTracker(this); for (int i=0;i < deneme.length;i++){ deneme[i]=getImage(getDocumentBase(),"deneme"+"loop2"+i+".jpg"); imageTracker.addImage(deneme[i],i); } try{ imageTracker.waitForID(0); } catch(InterruptedException e) { BY Ahmet Tolga Tat Sayfa 174

} } public void start() { gContext.drawImage(deneme[0],0,0,this); currentimage=1; if (animate==null) { animate=new Thread(this); animate.start(); }

public void stop() { if (animate!=null) { animate.stop(); animate=null; } } public void paint( Graphics g ) { g.drawImage(buffer,0,0,this); }

public void run() { while (true) { if (imageTracker.checkID(currentImage,true)){ gContext.fillRect(0,0,160,80); gContext.drawImage(deneme[currentimage],0,0,this); currentimage=++currentimage%totalimages; } try{ Thread.sleep(sleeptime); } catch(InterruptedException e) { BY Ahmet Tolga Tat Sayfa 175

showStatus (e.toString()); } repaint(); } } public void update(Graphics g){ paint(g);} }

Ses Paralar Ykleme ve alma


Java programlar ses paralarn ileyip alabilirler. Sisteminizin ses ile ilgili donanmlara(speaker ve ses kart) sahip olmas gerekir. Java sesleri almak iin iki mekanizma salar-applet'in play metodu veya audioClip arayznden play metodu ile ses alma gerekletirilebilir. Eger siz bir programda bir ses almak istiyorsanz applet metodu play sizin iin sesi ykleyecek ve alacaktr. Aadaki program ses iin kk bir rnek tekil etmektedir: import java.awt.*; import java.applet.Applet; public class loadaudioandplay extends Applet { private AudioClip sound; private Button playsound,loopSound,stopsound; public void init() { sound=getAudioClip(getDocumentBase(), "hi.au"); playsound=new Button ("play"); playsound.addActionListener(this); add(playsound); loopSound=new Button("Loop"); loopSound.addActionListener(this); add(loopSound); stopsound= new Button("stop"); stopsound.addActionListener(this); add(stopSound); } public void actionperformed(ActionEvent e) { if (e.getSource()==playSound) sound.play(); else if (e.getSource()==loopSound) sound.loop(); BY Ahmet Tolga Tat Sayfa 176

else if (e.getSource()==stopSound) sound.stop(); } }

Imge Haritalar
Daha ilgi ekici web sayfalarn yaratmada kullanlab bir dier teknik imge haritalarnn kullanmdr. Bir imge haritas kullancnn farkl amalar iin tklayabilecei scak alanlar(hot areas)' olan bir imgedir. Ne zaman bir kullanc mouse ile bir hot area zerine konumlanrsa browser'n stats alannda aklayc bir bilgi belirir. Bu teknik bubble help sistemlerin yapmnda kullanlr.Ne zaman bir kullanc ekrandaki herhangi bir eleman zerine konumlanrsa bubble help destekli sistem genellikle kk bir pencerede bir mesaj vererek kullancy ynlendirir. Ayrca mesaj stat ubuunda da grntlenir. Aada verilmi olan program, Java Multimedia Cyber Classroom adl CD den ikonlar ieren imgeleri yklyor. Bu ikonlar tandk gelebilir. Bu kitaptaki ikonlar yine bu CD den alnm ikonlardr. Program kullancnn mouse ile bir imgeyi point etmesini ve aklayc bilgi vermeyi salamaktadr. MouseMouve metodu mouse iin koordinatlar alr ve bu koordinatlar translateLocation metoduna gnderir. translateLocation metodu daha sonra ilgili appletin stat ubuunda bir mesaj grntler. Bu applete tklama herhangi bir olaya sebep olmaz. leriki nitelerde "Networking" konusunda baka bir web sayfasn browser'a yklemenin teknikleri anlatlacaktr. Bu networking zellikleriyle bu appleti modifiye edebilir, ve her ikonun farkl bir URL ile ilikilendirilmesi salanabilir . import java.awt.*; import java.applet.Applet; import java.awt.event.*; public class ImageMap extends Applet implements MouseListener, MouseMotionListener{ Image deneme; MediaTracker trackImage; int width,height; public void init() { addMouseListener(this); addMousemMotionListener(this); trackImage=new MediaTracker(this); deneme=getImage (getDocumantBase(),"deneme0.jpg"); trackImagwe.addImage(deneme,0); try{ trackImage.waitForAll(); } BY Ahmet Tolga Tat

Sayfa 177

catch(InterruptedException e) { }

width=deneme.getWidth(this); height=deneme.getHeight(this); resize(width,height); } public void paint( Graphics g ) { g.drawImage(deneme,0,0,this); }

public mouseMoved(MouseEvent e) {showStatus(translateLocation(e.getX()))} public mouseExited(MouseEvent e) { showStatus("Pointer outside deneme applet"); } public void mouseDragged(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseClicked(MouseEvent e){} public String translateLocation(int x) { int iconWidth = width/6; if (x>=0 && x < = iconWidth) return "Common Prg.Error"; else if (x>iconWidth && x < =iconWidth*2) return "Good prog. Practise"; else if (x>iconWidth*2 && x< =iconWidth*3) return "Performance Tip"; else if (x>iconWidth*3 && x< =iconWidth*4) return "Portability Tip"; else if (x>iconWidth*4 && x< =iconWidth*5) return "Soft. Engineering Observation"; else if (x>iconWidth*5 && x< =iconWidth*6) return "Testing and Debugging Tip"; return ""; } }

BY Ahmet Tolga Tat

Sayfa 178

Java Swing
Swing ile awtteden daha fazlasini yapabilirsiniz. Simdi biraz swing yabalim..Dtt daatt datt ddt dancing...J

[ Import javax.swing.*; ]

JFrame
import java.awt.*; import javax.swing.*; public class JFrameExample { public static void main(String[] args) { JFrame f = new JFrame("This is a test"); f.setSize(400, 150); Container content = f.getContentPane(); content.setBackground(Color.white); content.setLayout(new FlowLayout()); content.add(new JButton("Button 1")); content.add(new JButton("Button 2")); content.add(new JButton("Button 3")); f.addWindowListener(new ExitListener()); f.setVisible(true); } }

import java.awt.*; import java.awt.event.*; public class ExitListener extends WindowAdapter { public void windowClosing(WindowEvent event) { System.exit(0); } }

BY Ahmet Tolga Tat

Sayfa 179

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

public class WindowUtilities { public static void setNativeLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting native LAF: " + e); } }

public static void setJavaLookAndFeel() { try {

UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting Java LAF: " + e); } }

public static void setMotifLookAndFeel() { try {

UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } catch(Exception e) { System.out.println("Error setting Motif LAF: " + e); } }

public static JFrame openInJFrame(Container content,

BY Ahmet Tolga Tat

Sayfa 180

int width, int height, String title, Color bgColor) { JFrame frame = new JFrame(title); frame.setBackground(bgColor); content.setBackground(bgColor); frame.setSize(width, height); frame.setContentPane(content); frame.addWindowListener(new ExitListener()); frame.setVisible(true); return(frame); }

/** Uses Color.white as the background color. */

public static JFrame openInJFrame(Container content, int width, int height, String title) { return(openInJFrame(content, width, height, title, Color.white)); } public static JFrame openInJFrame(Container content, int width, int height) { return(openInJFrame(content, width, height, content.getClass().getName(), Color.white)); } }

BY Ahmet Tolga Tat

Sayfa 181

Look and Feel


import javax.swing.*; import java.awt.*; public class WindowUtilities { public static void setNativeLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting native LAF: " + e); } } public static void setJavaLookAndFeel() { try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); } catch(Exception e) { System.out.println("Error setting Java LAF: " + e); } } public static void setMotifLookAndFeel() { try { UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); } catch(Exception e) { System.out.println("Error setting Motif LAF: " + e); } } ... }

JLabel
import java.awt.*; import javax.swing.*; public class JLabels extends JFrame { public static void main(String[] args) { new JLabels(); } public JLabels() { super("Using HTML in JLabels"); WindowUtilities.setNativeLookAndFeel();

BY Ahmet Tolga Tat

Sayfa 182

addWindowListener(new ExitListener()); Container content = getContentPane(); Font font = new Font("Serif", Font.PLAIN, 30); content.setFont(font); String labelText = "<html><FONT COLOR=RED>Red</FONT> and " + "<FONT COLOR=BLUE>Blue</FONT> Text</html>"; JLabel coloredLabel = new JLabel(labelText, JLabel.CENTER); coloredLabel.setBorder (BorderFactory.createTitledBorder("Mixed Colors")); content.add(coloredLabel, BorderLayout.NORTH); labelText = "<html><B>Bold</B> and <I>Italic</I> Text</html>"; JLabel boldLabel = new JLabel(labelText, JLabel.CENTER); boldLabel.setBorder (BorderFactory.createTitledBorder("Mixed Fonts")); content.add(boldLabel, BorderLayout.CENTER); labelText = "<html>The Applied Physics Laboratory is a division " + "of the Johns Hopkins University." + "<P>" + "Major JHU divisions include:" + "<UL>" + " <LI>The Applied Physics Laboratory" + " <LI>The Krieger School of Arts and Sciences" + " <LI>The Whiting School of Engineering" + " <LI>The School of Medicine" + " <LI>The School of Public Health" + " <LI>The School of Nursing" + " <LI>The Peabody Institute" + " <LI>The Nitze School of Advanced International Studies" + "</UL>"; JLabel fancyLabel = new JLabel(labelText, new ImageIcon("images/JHUAPL.gif"), JLabel.CENTER); fancyLabel.setBorder (BorderFactory.createTitledBorder("Multi-line HTML")); content.add(fancyLabel, BorderLayout.SOUTH); pack(); setVisible(true); } }

JButton
import import import import import import java.awt.*; java.awt.event.*; javax.swing.AbstractButton; javax.swing.JButton; javax.swing.JPanel; javax.swing.JFrame;

BY Ahmet Tolga Tat

Sayfa 183

import javax.swing.ImageIcon; public class ButtonDemo extends JPanel implements ActionListener { protected JButton b1, b2, b3; public ButtonDemo() { ImageIcon leftButtonIcon = new ImageIcon("images/right.gif"); ImageIcon middleButtonIcon = new ImageIcon("images/middle.gif"); ImageIcon rightButtonIcon = new ImageIcon("images/left.gif"); b1 = new JButton("Disable middle button", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CENTER); b1.setHorizontalTextPosition(AbstractButton.LEFT); b1.setMnemonic(KeyEvent.VK_D); b1.setActionCommand("disable"); b2 = new JButton("Middle button", middleButtonIcon); b2.setVerticalTextPosition(AbstractButton.BOTTOM); b2.setHorizontalTextPosition(AbstractButton.CENTER); b2.setMnemonic(KeyEvent.VK_M); b3 = new JButton("Enable middle button", rightButtonIcon); //Use the default text position of CENTER, RIGHT. b3.setMnemonic(KeyEvent.VK_E); b3.setActionCommand("enable"); b3.setEnabled(false); //Listen for actions on buttons 1 and 3. b1.addActionListener(this); b3.addActionListener(this); b1.setToolTipText("Click this button to disable the middle button."); b2.setToolTipText("This middle button does nothing when you click it."); b3.setToolTipText("Click this button to enable the middle button."); //Add Components to this container, using the default FlowLayout. add(b1); add(b2); add(b3); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("disable")) { b2.setEnabled(false); b1.setEnabled(false); b3.setEnabled(true); } else { b2.setEnabled(true); b1.setEnabled(true); b3.setEnabled(false); } } public static void main(String[] args) { JFrame frame = new JFrame("ButtonDemo");

frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {

BY Ahmet Tolga Tat

Sayfa 184

System.exit(0); } }); frame.getContentPane().add(new ButtonDemo(), BorderLayout.CENTER); frame.pack(); frame.setVisible(true); } }

import java.awt.*; import javax.swing.*; public class JButtons extends JFrame { public static void main(String[] args) { new JButtons(); } public JButtons() { super("Using JButton"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.white); content.setLayout(new FlowLayout()); JButton button1 = new JButton("Java"); content.add(button1); ImageIcon cup = new ImageIcon("images/cup.gif"); JButton button2 = new JButton(cup); content.add(button2); JButton button3 = new JButton("Java", cup); content.add(button3); JButton button4 = new JButton("Java", cup); button4.setHorizontalTextPosition(SwingConstants.LEFT); content.add(button4); pack(); setVisible(true); } }

JPanel
import java.awt.*; import javax.swing.*; public class JPanels extends JFrame { public static void main(String[] args) { new JPanels(); }

BY Ahmet Tolga Tat

Sayfa 185

public JPanels() { super("Using JPanels with Borders"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.lightGray); JPanel controlArea = new JPanel(new GridLayout(3, 1)); String[] colors = { "Red", "Green", "Blue", "Black", "White", "Gray" }; controlArea.add(new SixChoicePanel("Color", colors)); String[] thicknesses = { "1", "2", "3", "4", "5", "6" }; controlArea.add(new SixChoicePanel("Line Thickness", thicknesses)); String[] fontSizes = { "10", "12", "14", "18", "24", "36" }; controlArea.add(new SixChoicePanel("Font Size", fontSizes)); content.add(controlArea, BorderLayout.EAST); JPanel drawingArea = new JPanel(); // Preferred height is irrelevant, since using WEST region drawingArea.setPreferredSize(new Dimension(400, 0)); drawingArea.setBorder(BorderFactory.createLineBorder (Color.blue, 2)); drawingArea.setBackground(Color.white); content.add(drawingArea, BorderLayout.WEST); pack(); setVisible(true); } }

import java.awt.*; import javax.swing.*; public class SixChoicePanel extends JPanel { public SixChoicePanel(String title, String[] buttonLabels) { super(new GridLayout(3, 2)); setBackground(Color.lightGray); setBorder(BorderFactory.createTitledBorder(title)); ButtonGroup group = new ButtonGroup(); JRadioButton option; int halfLength = buttonLabels.length/2; // Assumes even length for(int i=0; i<halfLength; i++) { option = new JRadioButton(buttonLabels[i]); group.add(option); add(option); option = new JRadioButton(buttonLabels[i+halfLength]); group.add(option); add(option); } } }

BY Ahmet Tolga Tat

Sayfa 186

Internal Frames
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class JInternalFrames extends JFrame { public static void main(String[] args) { new JInternalFrames(); } public JInternalFrames() { super("Multiple Document Interface"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.white); JDesktopPane desktop = new JDesktopPane(); desktop.setBackground(Color.white); content.add(desktop, BorderLayout.CENTER); setSize(450, 400); for(int i=0; i<5; i++) { JInternalFrame frame = new JInternalFrame(("Internal Frame " + i), true, true, true, true); frame.setLocation(i*50+10, i*50+10); frame.setSize(200, 150); frame.setBackground(Color.white); desktop.add(frame); frame.moveToFront(); } setVisible(true); } }

JToolBar
import java.awt.*; import javax.swing.*; public class ToolBarButton extends JButton { private static final Insets margins = new Insets(0, 0, 0, 0); public ToolBarButton(Icon icon) { super(icon); setMargin(margins);

BY Ahmet Tolga Tat

Sayfa 187

setVerticalTextPosition(BOTTOM); setHorizontalTextPosition(CENTER); } public ToolBarButton(String imageFile) { this(new ImageIcon(imageFile)); } public ToolBarButton(String imageFile, String text) { this(new ImageIcon(imageFile)); setText(text); } }

import java.awt.*; import javax.swing.*; import java.awt.event.*; public class JToolBarExample extends JFrame implements ItemListener { private BrowserToolBar toolbar; private JCheckBox labelBox; public static void main(String[] args) { new JToolBarExample(); } public JToolBarExample() { super("JToolBar Example"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); content.setBackground(Color.white); toolbar = new BrowserToolBar(); content.add(toolbar, BorderLayout.NORTH); labelBox = new JCheckBox("Show Text Labels?"); labelBox.setHorizontalAlignment(SwingConstants.CENTER); labelBox.addItemListener(this); content.add(new JTextArea(10,30), BorderLayout.CENTER); content.add(labelBox, BorderLayout.SOUTH); pack(); setVisible(true); } public void itemStateChanged(ItemEvent event) { toolbar.setTextLabels(labelBox.isSelected()); pack(); } }

JLists
BY Ahmet Tolga Tat Sayfa 188

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class ListDemo extends JFrame implements ListSelectionListener { private JList list; private DefaultListModel listModel; private static final String hireString = "Hire"; private static final String fireString = "Fire"; private JButton fireButton; private JTextField employeeName; public ListDemo() { super("ListDemo"); listModel = new DefaultListModel(); listModel.addElement("Alison Huml"); listModel.addElement("Kathy Walrath"); listModel.addElement("Lisa Friendly"); listModel.addElement("Mary Campione"); //Create the list and put it in a scroll pane list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); list.addListSelectionLis tener(this); JScrollPane listScrollPane = new JScrollPane(list); JButton hireButton = new JButton(hireString); hireButton.setActionCommand(hireString); hireButton.addActionListener(new HireListener()); fireButton = new JButton(fireString); fireButton.setActionCommand(fireString); fireButton.addActionListener(new FireListener()); employeeName = new JTextField(10); employeeName.addActionListener(new HireListener()); String name = listModel.getElementAt( list.getSelectedIndex()).toString(); employeeName.setText(name); //Create a panel that uses FlowLayout (the default). JPanel buttonPane = new JPanel(); buttonPane.add(employeeName); buttonPane.add(hireButton); buttonPane.add(fireButton); Container contentPane = getContentPane(); contentPane.add(listScrollPane, BorderLayout.CENTER); contentPane.add(buttonPane, BorderLayout.SOUTH); } class FireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //This method can be called only if

BY Ahmet Tolga Tat

Sayfa 189

//there's a valid selection //so go ahead and remove whatever's selected. int index = list.getSelectedIndex(); listModel.remove(index); int size = listModel.getSize(); if (size == 0) { //Nobody's left, disable firing. fireButton.setEnabled(false); } else { //Adjust the selection. if (index == listModel.getSize())//removed item in last position index--; list.setSelectedIndex(index); //otherwise select same index } } } //This listener is shared by the text field and the hire button class HireListener implements ActionListener { public void actionPerformed(ActionEvent e) { //User didn't type in a name... if (emp loyeeName.getText().equals("")) { Toolkit.getDefaultToolkit().beep(); return; } int index = list.getSelectedIndex(); int size = listModel.getSize(); //If no selection or if item in last position is selected, //add the new hire to end of list, and select new hire. if (index == -1 || (index+1 == size)) { listModel.addElement(employeeName.getText()); list.setSelectedIndex(size); //Otherwise insert the new hire after the current selection, //and select new hire. } else { listModel.insertElementAt(employeeName.getText(), index+1); list.setSelectedIndex(index+1); } } } public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting() == false) { if (list.getSelectedIndex() == -1) { //No selection, disable fire button. fireButton.setEnabled(false); employeeName.setText(""); } else { //Selection, update text field. fireButton.setEnabled(true);

BY Ahmet Tolga Tat

Sayfa 190

String name = list.getSelectedValue().toString(); employeeName.setText(name); } } } public static void main(String s[]) { JFrame frame = new ListDemo(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.pack(); frame.setVisible(true); } }

JTree
import java.awt.*; import javax.swing.*; import javax.swing.tree.*; public class SimpleTree extends JFrame { public static void main(String[] args) { new SimpleTree(); } public SimpleTree() { super("Creating a Simple JTree"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); Object[] hierarchy = { "javax.swing", "javax.swing.border", "javax.swing.colorchooser", "javax.swing.event", "javax.swing.filechooser", new Object[] { "javax.swing.plaf", "javax.swing.plaf.basic", "javax.swing.plaf.metal", "javax.swing.plaf.multi" }, "javax.swing.table", new Object[] { "javax.swing.text", new Object[] { "javax.swing.text.html", "javax.swing.text.html.parser" }, "javax.swing.text.rtf" }, "javax.swing.tree", "javax.swing.undo" }; DefaultMutableTreeNode root = processHierarchy(hierarchy); JTree tree = new JTree(root);

BY Ahmet Tolga Tat

Sayfa 191

content.add(new JScrollPane(tree), BorderLayout.CENTER); setSize(275, 300); setVisible(true); }

private DefaultMutableTreeNode processHierarchy(Object[] hierarchy) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(hierarchy[0]); DefaultMutableTreeNode child; for(int i=1; i<hierarchy.length; i++) { Object nodeSpecifier = hierarchy[i]; if (nodeSpecifier instanceof Object[]) // Ie node with children child = processHierarchy((Object[])nodeSpecifier); else child = new DefaultMutableTreeNode(nodeSpecifier); // Ie Leaf node.add(child); } return(node); } }

import import import import

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

public class SelectableTree extends JFrame implements TreeSelectionListener { public static void main(String[] args) { new SelectableTree(); } private JTree tree; private JTextField currentSelectionField; public SelectableTree() { super("JTree Selections"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); DefaultMutableTreeNode child; DefaultMutableTreeNode grandChild; for(int childIndex=1; childIndex<4; childIndex++) { child = new DefaultMutableTreeNode("Child " + childIndex); root.add(child); for(int grandChildIndex=1; grandChildIndex<4; grandChildIndex++) { grandChild = new DefaultMutableTreeNode("Grandchild " + childIndex + "." + grandChildIndex); child.add(grandChild); } } tree = new JTree(root); tree.addTreeSelectionListener(this); content.add(new JScrollPane(tree), BorderLayout.CENTER);

BY Ahmet Tolga Tat

Sayfa 192

currentSelectionField = new JTextField("Current Selection: NONE"); content.add(currentSelectionField, BorderLayout.SOUTH); setSize(250, 275); setVisible(true); } public void valueChanged(TreeSelectionEvent event) { currentSelectionField.setText ("Current Selection: " + tree.getLastSelectedPathComponent().toString()); } }

import java.awt.*; import javax.swing.*; public class DynamicTree extends JFrame { public static void main(String[] args) { int n = 5; // Number of children to give each node if (args.length > 0) try { n = Integer.parseInt(args[0]); } catch(NumberFormatException nfe) { System.out.println("Can't parse number; using default of " + n); } new DynamicTree(n); } public DynamicTree(int n) { super("Creating a Dynamic JTree"); WindowUtilities.setNativeLookAndFeel(); addWindowListener(new ExitListener()); Container content = getContentPane(); JTree tree = new JTree(new OutlineNode(1, n)); content.add(new JScrollPane(tree), BorderLayout.CENTER); setSize(300, 475); setVisible(true); } }

Alert Dialogs (JOptionPane)


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

public class JOptionPaneExamples extends JFrame implements ActionListener { public static void main(String[] args) { new JOptionPaneExamples(); }

BY Ahmet Tolga Tat

Sayfa 193

private JButton popupDialogButton; private JRadioButton[] dialogTypeButtons; private JRadioButton[] messageTypeButtons; private int[] messageTypes = { JOptionPane.PLAIN_MESSAGE, JOptionPane.INFORMATION_MESSAGE, JOptionPane.QUESTION_MESSAGE, JOptionPane.WARNING_MESSAGE, JOptionPane.ERROR_MESSAGE }; private JLabeledTextField titleField, messageField, selectionValuesField, buttonLabelsField, focusedButtonField; private JCheckBox ignoreSelectionValuesBox; private ButtonGroup messageTypeButtonGroup, buttonTypeButtonGroup, dialogTypeButtonGroup; private JRadioButton[] buttonTypeButtons; private int[] buttonTypes = { JOptionPane.DEFAULT_OPTION, JOptionPane.YES_NO_OPTION, JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.OK_CANCEL_OPTION }; private JCheckBox[] lookAndFeelBoxes; public JOptionPaneExamples() { super("JOptionPane Examples"); addWindowListener(new ExitListener()); WindowUtilities.setNativeLookAndFeel(); Container content = getContentPane(); content.setLayout(new GridLayout(0, 1)); JPanel buttonPanel = new JPanel(); popupDialogButton = new JButton("Show Option Pane(s)"); popupDialogButton.addActionListener(this); buttonPanel.add(popupDialogButton); content.add(buttonPanel); dialogTypeButtonGroup = new ButtonGroup(); dialogTypeButtons = new JRadioButton[] { new JRadioButton("Show Message", true), new JRadioButton("Get Confirmation"), new JRadioButton("Collect Input"), new JRadioButton("Present Options") }; content.add(new RadioButtonPanel("Dialog type:", dialogTypeButtons, dialogTypeButtonGroup)); messageTypeButtonGroup = new ButtonGroup(); messageTypeButtons = new JRadioButton[] { new JRadioButton("Plain"), new JRadioButton("Information", true), new JRadioButton("Question"), new JRadioButton("Warning"), new JRadioButton("Error") }; content.add(new RadioButtonPanel("Option Pane Type:", messageTypeButtons, messageTypeButtonGroup)); lookAndFeelBoxes = new JCheckBox[] { new JCheckBox("Native", true), new JCheckBox("Java (Metal)"), new JCheckBox("Motif") }; content.add(new CheckBoxPanel("Looks to use:", lookAndFeelBoxes)); titleField = new JLabeledTextField("Title:", "Title to appear at top of border"); content.add(titleField);

BY Ahmet Tolga Tat

Sayfa 194

messageField = new JLabeledTextField("Message:", "Message to appear inside of dialog box"); content.add(messageField); buttonTypeButtonGroup = new ButtonGroup(); buttonTypeButtons = new JRadioButton[] { new JRadioButton("Default", true), new JRadioButton("Yes/No"), new JRadioButton("Yes/No/Cancel"), new JRadioButton("OK/Cancel") }; RadioButtonPanel buttonLabelPanel = new RadioButtonPanel("Button Labels:", buttonTypeButtons, buttonTypeButtonGroup); DisableListener.addEnabler(dialogTypeButtons[1], buttonLabelPanel); content.add(buttonLabelPanel); selectionValuesField = new JLabeledTextField("Choices to present to user (separate by spaces):", "Choice1 Choice2 Choice3 Choice4"); content.add(selectionValuesField); ignoreSelectionValuesBox = new JCheckBox("Ignore predefined choices and supply textfield to user"); DisableListener.addDisabler(ignoreSelectionValuesBox, selectionValuesField); DisableListener.addEnabler(dialogTypeButtons[2], selectionValuesField); DisableListener.addEnabler(dialogTypeButtons[2], ignoreSelectionValuesBox); content.add(ignoreSelectionValuesBox); buttonLabelsField = new JLabeledTextField("Button labels for \"Option\" dialog:", "Button1 Button2 Button3"); DisableListener.addEnabler(dialogTypeButtons[3], buttonLabelsField); content.add(buttonLabelsField); pack(); setVisible(true); } public void actionPerformed(ActionEvent event) { if (lookAndFeelBoxes[0].isSelected()) { WindowUtilities.setNativeLookAndFeel(); popUpDialog(); } if (lookAndFeelBoxes[1].isSelected()) { WindowUtilities.setJavaLookAndFeel(); popUpDialog(); WindowUtilities.setNativeLookAndFeel(); } if (lookAndFeelBoxes[2].isSelected()) { WindowUtilities.setMotifLookAndFeel(); popUpDialog(); WindowUtilities.setNativeLookAndFeel(); } }

BY Ahmet Tolga Tat

Sayfa 195

private void popUpDialog() { if (dialogTypeButtons[0].isSelected()) JOptionPane.showMessageDialog(this, messageField.getText(), titleField.getText(), getMessageType()); else if (dialogTypeButtons[1].isSelected()) JOptionPane.showConfirmDialog(this, messageField.getText(), titleField.getText(), getButtonType(), getMessageType()); else if (dialogTypeButtons[2].isSelected()) { String[] selections; if (selectionValuesField.isEnabled()) selections = substrings(selectionValuesField.getText()); else selections = null; JOptionPane.showInputDialog(this, messageField.getText(), titleField.getText(), getMessageType(), null, selections, null); } else if (dialogTypeButtons[3].isSelected()) JOptionPane.showOptionDialog(this, messageField.getText(), titleField.getText(), getButtonType(), getMessageType(), null, substrings(buttonLabelsField.getText()), null); } private int getAssociatedType(AbstractButton[] buttons, int[] types) { for(int i=0; i<buttons.length; i++) if (buttons[i].isSelected()) return(types[i]); return(types[0]); } private int getMessageType() { return(getAssociatedType(messageTypeButtons, messageTypes)); } private int getButtonType() { return(getAssociatedType(buttonTypeButtons, buttonTypes)); } private String[] substrings(String string) { StringTokenizer tok = new StringTokenizer(string); String[] substrings = new String[tok.countTokens()]; for(int i=0; i<substrings.length; i++) substrings[i] = tok.nextToken(); return(substrings); } } class CheckBoxPanel extends JPanel { public CheckBoxPanel(String labelString, JCheckBox[] checkBoxes) { setLayout(new FlowLayout(FlowLayout.LEFT)); add(new JLabel(labelString)); for(int i=0; i<checkBoxes.length; i++) { add(checkBoxes[i]); }

BY Ahmet Tolga Tat

Sayfa 196

} }

import javax.swing.*; import java.awt.*; public class JLabeledTextField extends JPanel { private JLabel label; private JTextField textField; public JLabeledTextField(String labelString, String textFieldString, LayoutManager layout) { super(); setLayout(layout); label = new JLabel(labelString); textField = new JTextField(textFieldString); add(label); add(textField); } public JLabeledTextField(String labelString, String textFieldString) { this(labelString, textFieldString, new FlowLayout(FlowLayout.LEFT)); } public JLabel getJLabel() { return(label); } public JTextField getJTextField() { return(textField); } public String getText() { return(getJTextField().getText()); } public void setText(String textFieldString) { getJTextField().setText(textFieldString); } public void setFonts(Font f) { getJLabel().setFont(f); getJTextField().setFont(f); } public void setEnabled(boolean status) { getJLabel().setEnabled(status); getJTextField().setEnabled(status); BY Ahmet Tolga Tat Sayfa 197

super.setEnabled(status); } }

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

public class RadioButtonPanel extends JPanel { public RadioButtonPanel(String labelString, JRadioButton[] radioButtons, ButtonGroup buttonGroup) { setLayout(new FlowLayout(FlowLayout.LEFT)); add(new JLabel(labelString)); for(int i=0; i<radioButtons.length; i++) { buttonGroup.add(radioButtons[i]); add(radioButtons[i]); } } public void setEnabled(boolean state) { Component[] components = getComponents(); for(int i=0; i<components.length; i++) components[i].setEnabled(state); } }

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

public class DisableListener implements ItemListener { private JComponent target; private boolean defaultState; private static void addListener(AbstractButton source, JComponent target, boolean defaultState) { DisableListener enablerOrDisabler = new DisableListener(target, defaultState); source.addItemListener(enablerOrDisabler); } public static void addDisabler(AbstractButton source, JComponent target) { addListener(source, target, true); } public static void addEnabler(AbstractButton source, JComponent target) { addListener(source, target, false); BY Ahmet Tolga Tat Sayfa 198

} public DisableListener(JComponent target, boolean defaultState) { this.target = target; this.defaultState = defaultState; if (!defaultState) target.setEnabled(false); } public void itemStateChanged(ItemEvent event) { if (event.getStateChange() == ItemEvent.SELECTED) target.setEnabled(!defaultState); else target.setEnabled(defaultState); } }

JPassword
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class PasswordDemo { public static void main(String[] argv) { final JFrame f = new JFrame("PasswordDemo"); JLabel label = new JLabel("Enter the password: "); JPasswordField passwordField = new JPasswordField(10); passwordField.setEchoChar('#'); passwordField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JPasswordField input = (JPasswordField)e.getSource(); char[] password = input.getPassword(); if (isPasswordCorrect(password)) { JOptionPane.showMessageDialog(f, "Success! You typed the right password."); } else { JOptionPane.showMessageDialog(f, "Invalid password. Try again.", "Error Message", JOptionPane.ERROR_MESSAGE); } } BY Ahmet Tolga Tat

Sayfa 199

}); JPanel contentPane = new JPanel(new BorderLayout()); contentPane.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); contentPane.add(label, BorderLayout.WEST); contentPane.add(passwordField, BorderLayout.CENTER); f.setContentPane(contentPane); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); f.pack(); f.setVisible(true); } private static boolean isPasswordCorrect(char[] input) { char[] correctPassword = { 'b', 'u', 'g', 'a', 'b', 'o', 'o' }; if (input.length != correctPassword.length) return false; for (int i = 0; i < input.length; i ++) if (input[i] != correctPassword[i]) return false; return true; } }

JComboBox
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComboBoxDemo extends JPanel { JLabel picture; public ComboBoxDemo() { String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; // Create the combo box, select the pig JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); petList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); BY Ahmet Tolga Tat

Sayfa 200

picture.setIcon(new ImageIcon("images/" + petName + ".gif")); } }); // Set up the picture picture = new JLabel(new ImageIcon("images/" + petStrings[petList.getSelectedIndex()] + ".gif")); picture.setBorder(BorderFactory.createEmptyBorder(10,0,0,0)); // The preferred size is hard-coded to be the width of the // widest image and the height of the tallest image + the border. // A real program would compute this. picture.setPreferredSize(new Dimension(177, 122+10)); // Layout the demo setLayout(new BorderLayout()); add(petList, BorderLayout.NORTH); add(picture, BorderLayout.SOUTH); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } public static void main(String s[]) { JFrame frame = new JFrame("ComboBoxDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); frame.setContentPane(new ComboBoxDemo()); frame.pack(); frame.setVisible(true); } }

JTable
import javax.swing.JTable; import javax.swing.table.AbstractTableModel; import javax.swing.JScrollPane;

BY Ahmet Tolga Tat

Sayfa 201

import import import import import

javax.swing.JFrame; javax.swing.SwingUtilities; javax.swing.JOptionPane; java.awt.*; java.awt.event.*;

public class TableDemo extends JFrame { private boolean DEBUG = true; public TableDemo() { super("TableDemo"); MyTableModel myModel = new MyTableModel(); JTable table = new JTable(myModel); table.setPreferredScrollableViewportSize(new Dimension(500, 70)); //Create the scroll pane and add the table to it. JScrollPane scrollPane = new JScrollPane(table); //Add the scroll pane to this window. getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } class MyTableModel extends AbstractTableModel { final String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"}; final Object[][] data = { {"Mary", "Campione", "Snowboarding", new Integer(5), new Boolean(false)}, {"Alison", "Huml", "Rowing", new Integer(3), new Boolean(true)}, {"Kathy", "Walrath", "Chasing toddlers", new Integer(2), new Boolean(false)}, {"Mark", "Andrews", "Speed reading", new Integer(20), new Boolean(true)}, {"Angela", "Lih", "Teaching high school", new Integer(4), new Boolean(false)} }; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; }

BY Ahmet Tolga Tat

Sayfa 202

public Object getValueAt(int row, int col) { return data[row][col]; }

public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { //Note that the data/cell address is constant, //no matter where the cell appears onscreen. if (col < 2) { return false; } else { return true; } } public void setValueAt(Object value, int row, int col) { if (DEBUG) { System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")"); } if (data[0][col] instanceof Integer && !(value instanceof Integer)) { try { data[row][col] = new Integer(value.toString()); fireTableCellUpdated(row, col); } catch (NumberFormatException e) { JOptionPane.showMessageDialog(TableDemo.this, "The \"" + getColumnName(col) + "\" column accepts only integer values."); } } else { data[row][col] = value; fireTableCellUpdated(row, col); } if (DEBUG) { System.out.println("New value of data:"); printDebugData(); } } private void printDebugData() { int numRows = getRowCount(); int numCols = getColumnCount(); for (int i=0; i < numRows; i++) { System.out.print(" row " + i + ":"); for (int j=0; j < numCols; j++) { System.out.print(" " + data[i][j]); } System.out.println(); }

BY Ahmet Tolga Tat

Sayfa 203

System.out.println("--------------------------"); } } public static void main(String[] args) { TableDemo frame = new TableDemo(); frame.pack(); frame.setVisible(true); } }

JScroll
import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class ScrollDemo extends JPanel { private Rule columnView; private Rule rowView; private JToggleButton isMetric; private ScrollablePicture picture; public ScrollDemo() { // Start loading the image icon now. ImageIcon david = new ImageIcon("images/youngdad.jpeg"); // Create the row and column headers. columnView = new Rule(Rule.HORIZONTAL, true); columnView.setPreferredWidth(david.getIconWidth()); rowView = new Rule(Rule.VERTICAL, true); rowView.setPreferredHeight(david.getIconHeight()); // Create the corners. JPanel buttonCorner = new JPanel(); isMetric = new JToggleButton("cm", true); isMetric.setFont(new Font("SansSerif", Font.PLAIN, 11)); isMetric.setMargin(new Insets(2,2,2,2)); isMetric.addItemListener(new UnitsListener()); buttonCorner.add(isMetric); //Use the default FlowLayout // Set up the scroll pane. picture = new ScrollablePicture(david, columnView.getIncrement()); JScrollPane pictureScrollPane = new JScrollPane(picture); pictureScrollPane.setPreferredSize(new Dimension(300, 250)); pictureScrollPane.setViewportBorder( BorderFactory.createLineBorder(Color.black)); BY Ahmet Tolga Tat

Sayfa 204

pictureScrollPane.setColumnHeaderView(columnView); pictureScrollPane.setRowHeaderView(rowView); pictureScrollPane.setCorner(JScrollPane.UPPER_LEFT_CORNER, buttonCorner); pictureScrollPane.setCorner(JScrollPane.LOWER_LEFT_CORNER, new Corner()); pictureScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new Corner()); // Put it in this panel. setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); add(pictureScrollPane); setBorder(BorderFactory.createEmptyBorder(20,20,20,20)); } class UnitsListener implements ItemListener { public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { // Turn it to metric. rowView.setIsMetric(true); columnView.setIsMetric(true); } else { // Turn it to inches. rowView.setIsMetric(false); columnView.setIsMetric(false); } picture.setMaxUnitIncrement(rowView.getIncrement()); } } public static void main(String s[]) { JFrame frame = new JFrame("ScrollDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); frame.setContentPane(new ScrollDemo()); frame.pack(); frame.setVisible(true); } }

BY Ahmet Tolga Tat

Sayfa 205

Networking
Socket programlama
Sockettan okuma ve yazdirma:
import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try { echoSocket = new Socket("localhost", 9999); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader( echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: taranis."); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for " + "the connection to: taranis."); System.exit(1); } BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String userInput;

BY Ahmet Tolga Tat

Sayfa 206

while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("echo: " + in.readLine()); } out.close(); in.close(); stdIn.close(); echoSocket.close(); } }

Basit bir Chat rnegi: import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; public class chatClient extends Frame implements Runnable { private String hostname, message; protected BufferedReader in; protected PrintWriter out;

protected TextArea output; protected TextField input; protected Button b; protected Thread listener;

// Constructor looks after GUI public chatClient() { super("Chat Client"); setLayout(new BorderLayout()); output = new TextArea(); // Panel to arrange two components on BY Ahmet Tolga Tat Sayfa 207

Panel p = new Panel(); p.setLayout(new BorderLayout()); input = new TextField(); b= new Button("S end"); // What happens when we press the button... b.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { // read in text from textField, store as string message = input.getText();

out.println(message); System.out.println("Message is:" + message); //out.flush(); We set the boolean autoflush to true in constructor

// blank the textField for next line input.setText(" "); } }); // ends inner class

// add the textfield and button to the Panel p.add("North", input); p.add("South", b);

BY Ahmet Tolga Tat

Sayfa 208

// add the textArea and the Panel to the Frame add("Center", output); add("South", p);

// what happens if we close the window.... this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) { System.exit(0); } }); //ends inner class

// the 'engine' behind the GUI public void runClient() { // set hostname to 127.0.0.1 for testing hostname="localhost";

// try to create the socket and initialise the Streams try { Socket s = new Socket(hostname,9999); in = new BufferedReader(new InputStreamReader(s.getInputStream())); BY Ahmet Tolga Tat Sayfa 209

out = new PrintWriter(s.getOutputStream(),true); output.append("Connected to Server...\n"); } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } // initialise a listener thread to catch messages from server listener = new Thread(this); listener.start(); System.out.println("Listener started"); } // listener.start() creates a thread which calls run() public void run() { // just loop reading the input stream try { while(true){ String line = in.readLine(); System.out.println("Received from Server:" + line); BY Ahmet Tolga Tat Sayfa 210

output.append(line + "\n"); } } catch(IOException e) { System.err.println(e); } // when the Thread is killed... finally { listener = null; input.setText(" "); out.close(); } }

public static void main(String args[]) { chatClient c = new chatClient(); c.pack(); c.show(); c.runClient(); } }

import java.net.*; import java.io.*; BY Ahmet Tolga Tat Sayfa 211

import java.util.*; public class chatServer{ public chatServer() throws IOException{ // initialise new ServerSocket ServerSocket s = new ServerSocket(9999); while(true) { Socket client = s.accept(); System.out.println("Accepted connection from " + client.getInetAddress()+":"+ client.getPort()); chatHandler c = new chatHandler(client); c.start(); // chatHandler is derived from Thread, so we can call start() } } public static void main(String[] args) throws IOException { chatServer cs = new chatServer(); }

} // end class definition

// define class chatHandler as a derivation of Thread class chatHandler extends Thread { // declare variables protected Socket s; protected BufferedReader in; BY Ahmet Tolga Tat Sayfa 212

protected PrintWriter out; protected static Vector handlers = new Vector();

public chatHandler(Socket s) throws IOException {

this.s = s; in = new BufferedReader(new InputStreamReader(s.getInputStream())); out = new PrintWriter(s.getOutputStream(), true); System.out.println("Readers and Writers initialised"); }

public void run() { System.out.println("run called"); try { // add this thread to class variable vector handlers.addElement(this); System.out.println("Element added to Vector");

// loop reading input and passing it to broadcast method while(true) { System.out.println("About to read inputstream"); BY Ahmet Tolga Tat Sayfa 213

String message = in.readLine(); System.out.println("Input Stream read"); System.out.println(message); broadcast(message); System.out.println("Message passed to broadcast method"); } } catch(IOException e) { System.err.println(e); } // if this thread is killed.... finally { // remove it from the vector handlers.removeElement(this); try { // tidy up debris! s.close(); } catch(IOException e) { System.err.println(e); } BY Ahmet Tolga Tat Sayfa 214

} } protected static void broadcast(String message) { System.out.println("Broadcast called"); synchronized(handlers) {

Enumeration e = handlers.elements();

// returns true if there are other sockets running while (e.hasMoreElements()) { // loop to the next chatHandler in the vector chatHandler c = (chatHandler) e.nextElement(); try { synchronized(c.out) { c.out.println(message); } // end synchronized block

}catch(Exception ex) { System.err.println(ex); c = null; BY Ahmet Tolga Tat Sayfa 215

} } // end while loop } // end synchronized block } // end broadcast

} // ends class

Basit bir Port Scanner rnegi //Kendi bilgisayarinizin Portlarini arar.Denemesi bedava.
import java.net.*; import java.io.*; public class PortScanner { public static void main( String[] args) throws IOException { Socket connection = null; String host = "localhost";//kendi localhostunuz. try { for (int port = 1; port < 65536; port++) { try { connection = new Socket(host, port); System.out.println("Server on port " + port ); } catch (UnknownHostException error ) { System.err.println( error ); } } } catch (IOException error ) { System.err.println( error ); }

finally { if (connection != null ) connection.close(); } } }

InetAddress rnegi:
import java.net.InetAddress; import java.net.InetAddress; import java.io.*; class SimpleDNS {

BY Ahmet Tolga Tat

Sayfa 216

public static void main(String[] args) { String hostName; if ( args.length != 1 ) { System.out.println("Usage: java SimpleDNS hostName"); System.exit(1); } hostName = args[0]; try { InetAddress address = InetAddress.getByName(hostName); byte ip[] = address.getAddress(); for (int octet=0; octet < ip.length; octet++) { System.out.print( ((int)ip[octet] & 0xff) + " " ); } System.out.println(); } catch (IOException DNSerror) { System.err.println(DNSerror); System.exit(1); } } }

Basit bir Client/Server(Istemci/Sunuc) programi

tcpClient.java

import java.net.*; import java.io.*; public class tcpClient {

public static void main(String[] args) {

BY Ahmet Tolga Tat

Sayfa 217

int port = 1500; String server = "localhost"; Socket socket = null; String lineToBeSent; BufferedReader input; PrintWriter output; int ERROR = 1; // read arguments if(args.length == 2) { server = args[0]; try { port = Integer.parseInt(args[1]); } catch (Exception e) { System.out.println("server port = 1500 (default)"); port = 1500; } } // connect to server try { socket = new Socket(server, port); System.out.println("Connected with server " + socket.getInetAddress() + ":" + socket.getPort()); } catch (UnknownHostException e) { System.out.println(e); System.exit(ERROR); } catch (IOException e) { System.out.println(e); System.exit(ERROR); }

try { input = new BufferedReader(new InputStreamReader(System.in)); output = new PrintWriter(socket.getOutputStream(),true); // get user input and transmit it to server while(true) { lineToBeSent = input.readLine(); // stop if input line is "." if(lineToBeSent.equals(".")) break; output.println(lineToBeSent); } } catch (IOException e) { System.out.println(e); } try { socket.close(); } catch (IOException e) { System.out.println(e); }

BY Ahmet Tolga Tat

Sayfa 218

} }

tcpServer.java
import java.net.*; import java.io.*; public class tcpServer { public static void main(String args[]) { int port; ServerSocket server_socket; BufferedReader input; try { port = Integer.parseInt(args[0]); } catch (Exception e) { System.out.println("port = 1500 (default)"); port = 1500; } try { server_socket = new ServerSocket(port); System.out.println("Server waiting for client on port " + server_socket.getLocalPort()); // server infinite loop while(true) { Socket socket = server_socket.accept(); System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort()); input = new BufferedReader(new InputStreamReader(socket.getInputStream())); // print received data try { while(true) { String message = input.readLine(); if (message==null) break; System.out.println(message); } } catch (IOException e) {

BY Ahmet Tolga Tat

Sayfa 219

System.out.println(e); } // connection closed by client try { socket.close(); System.out.println("Connection closed by client"); } catch (IOException e) { System.out.println(e); } }

} catch (IOException e) { System.out.println(e); } } }

BY Ahmet Tolga Tat

Sayfa 220

JDBC
JDBC (Java Database Connectivity)

JDBC nedir?
JDBC Java programlari ile herhangi bir databank arasinda iletisimi saglayan Java JDBC APIsidir(Java kprsdr).JDBC bize herhangi bir veritabanina Java zerinden ulasmamzi ve SQL ile direk olarak programlama yapabilmemezi saglar.SQL bir Sorgulama Script dilidir ve bir programlama dili degildir.

Java Programi

JDBC Kprs

Veritabani (Database)

Java ile veritabani programlamak icin SQL dilini bilmek gerekir.

Nasil baglanti kurulur?


Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); sayesinde Java ile veritabani baglanti kurar.

rnek:
Asagidaki program sayesinde herhangi bir databak ile baglanti kurabilirsiniz.
import java.net.URL; import java.sql.*; class jdbcquery { public static void main (String args[]) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection connection = DriverManager.getConnection ("jdbc:odbc:test", "isim", "sifre"); Statement statement = connection.createStatement();

BY Ahmet Tolga Tat

Sayfa 221

dbout(statement); System.out.println("--- Baska Giris---"); statement.executeUpdate("UPDATE adresler SET TelNr=12345678 WHERE Name='Cuneyt Arkin'"); dbout(statement); System.out.println ("--- Baska bir deger girin---"); statement.executeUpdate("INSERT INTO adresler VALUES ('Hakan Skr', 'Inter Cikmaz sokak',0999988999"); dbout(statement); System.out.println ("--- silme"); statement.executeUpdate("DELETE FROM adresler WHERE TelNr=8764553"); dbout(statement); statement.close(); connection.close(); } catch(java.lang.ClassNotFoundException e) { System.out.println ("JDBC-ODBC-srcs bulunamadi"); } catch(java.sql.SQLException e) { System.out.println ("Databank sorusturmada hata olustu"); } } private static void dbout(Statement statement) throws java.sql.SQLException { ResultSet result = statement.executeQuery ("SELECT Isim, Cadde, TelNr FROM adresler"); while (result.next()) { String Name = result.getString("Isim"); String Strasse = result.getString("Cadde"); int TelNr = result.getInt("TelNr"); System.out.println(Name + ", " + Strasse + ", " + TelNr); } result.close(); } }

BY Ahmet Tolga Tat

Sayfa 222

rnek2:
Asagidaki rnek program bir grafik arayzne sahiptir ve JDBC kprsn kullanarak database ile baglanti kurar. import import import import import javax.swing.*; java.awt.*; java.awt.event.*; javax.swing.event.*; java.sql.*;

public class VLookup1 extends JFrame String dbUrl = "jdbc:odbc:people"; String user = ""; String password = ""; Statement s; JPanel panel = new JPanel();

JTextField searchFor = new JTextField(); JTextField tf1=new JTextField(); JLabel completion =new JLabel(""); JTextArea results = new JTextArea(); JLabel lb1 =new JLabel("");

public VLookup1() { searchFor.getDocument().addDocumentListener(new SearchL());

panel.setLayout(null); searchFor.setBounds(new Rectangle(100,100,150,25)); completion.setBounds(new Rectangle(100,170,50,25)); results.setBounds(new Rectangle(100,200,300,200)); tf1.setBounds(new Rectangle(100,130,150,25)); lb1.setBounds(new Rectangle(100,150,150,25)); lb1.setText("Aranan Soyad:\n"); panel.add(lb1,null); panel.add(searchFor,null); panel.add(completion,null); panel.add(results,null); panel.add(tf1,null); setSize(600,500); setVisible(true); setContentPane(panel); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection c = DriverManager.getConnection(dbUrl, user, password);s = c.createStatement(); }

BY Ahmet Tolga Tat

Sayfa 223

catch(Exception e) { results.setText(e.toString()); } Pencerekapat kapat=new Pencerekapat(); addWindowListener(kapat); }

public class Pencerekapat extends WindowAdapter { public void windowClosing(WindowEvent e) { System.exit(0); } }

class SearchL implements DocumentListener { public void changedUpdate(DocumentEvent e){ } public void insertUpdate(DocumentEvent e){ textValueChanged(); }

public void removeUpdate(DocumentEvent e){ textValueChanged(); } }

public void textValueChanged() { ResultSet r; if(searchFor.getText().length() == 0) { completion.setText(""); results.setText(""); return; }

try { r = s.executeQuery("SELECT FIRST, LAST, EMAIL FROM people " +searchFor.getText());

if(r.next()) completion.setText( r.getString("last")); r = s.executeQuery("SELECT FIRST, LAST, EMAIL FROM people " +completion.getText());

BY Ahmet Tolga Tat

Sayfa 224

catch(Exception e) { results.setText(searchFor.getText() + "\n"); results.append(e.toString()); return; } results.setText("");

try { while(r.next()) { results.append(r.getString("Last") + ", "+ r.getString("fIRST") +": " + r.getString("EMAIL") + "\n"); } } catch(Exception e) { results.setText(e.toString()); } }

public static void main(String[] args) { VLookup1 lookup=new VLookup1(); } }

BY Ahmet Tolga Tat

Sayfa 225

Corba
Bu isten orba cikacaga benziyor.

Corba nedir?
Corba (Common Object Request Broker Arhitecture) heterojen aglardaki daginik
objeler arasindaki haberlesmeyi saglar ve daginik sistemler iin farkli servisler sunar. CORBA mimarisi platform ve programlama dilinden bagimsizligi gibi ok nemli iki zellige sahiptir. CORBA, dagitik, heterogen ve nesneye ynelik uygulamalar iin ortaya konan bir endstriyel standarttir. CORBA yazilim ve donanim saglayicilarinin olusturdugu Object Management Group (OMG) isimli ticari olmayan bir konsorsyum tarafindan olusturturulmustur. CORBAda arayzler OMG Interface Definition Language (IDL) kullanilarak hazirlanir. Bir IDL arayz dosyasi, bir nesnenin uygulanabilmesi iin sunucunun sagladigi veri esitlerini, yntemleri ve operasyonlari aiklar. IDL bir programlama dilinden daha ok arayzleri tanimlayan bir dildir. Object Request Broker (ORB), sistem iindeki nesneler iin bir iletisim merkezidir. Bu merkez, nesnelerin ag zerinde iletisim kurabilmelerini saglayan nesne etkilesimini saglar. Basite indirgendiginde ORBu istasyonlar arasi malzeme tasiyan bir trene benzetebiliriz. COBRA nesne servisleri nesne mr standartlarini, isimleri, devamliligi, olay takibini, muameleleri ve es zamanliligi ierir. CORBA ortak aralari, nesne sitemiminin kullanmasi iin genel amali uygulamalar saglar. Veri tabani erisimi, e-posta, yazicidan baski alma bu uygulamalardan birkaidir. Internet Inter-ORB Protocol (IIOP) CORBA 2.0 sartnamelerinde ortaya konan, internet zerindeki genis dagitik uygulamalara erisimi saglayan bir aik internet protokoldur. Bu protokol TCP/IP zerine kurulu ORB-ORB iletisimini saglar. IIOP farkli makinalar zerindeki uygulamalarin haberlesmelerini saglar ve uygulama alni yerel agdan uluslararasi aga kadar genisletilebilir. BY Ahmet Tolga Tat Sayfa 226

Java'da RMI ile bir client, server'daki bir metodu cagirmakta, hatta iki makine arasinda nesneler gonderilebilmektedir. CORBA, RMI gibidir, fakat farkli dillerde olabiliyor. DCOM da bu teknolojilerin Microsoft esidir(Daha dogrusu Microsoft'un Dagitik sistemler icin gelistirdigi bir teknolojidir.) Yani RMI, CORBA ve DCOM teknolojik olarak birbirine cok benzeyen "middleware" veya "software bus" olarak adlandirilan cok onemli teknolojiler. Bunlar dagitik sistemlerde yaygin kullanilmaktalar. Corba ile Javada arayzler hazirlamak icin http://java.sun.com/products/jdk/idl/. adserinden IDL programini indirmeniz ve buradaki idl.exe programini jdknin bulundugu bin dizinine kopyalamaniz gerekir.

Corba arayz olusturmak icin ise xxx.idl olarak kayt ettiginiz Corba programi

C:>jdk\bin\idlj

xxx.idl yazarak arayz olusturulur.

//rnek bir program // // StockMarketClient // // import org.omg.CORBA.*; import org.omg.CosNaming.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { ORB orb = ORB.init(); NamingContext root = NamingContextHelper.narrow( orb.resolve_initial_references("NameService") ); NameComponent[] name = new NameComponent[1] ; name[0] = new NameComponent("NASDAQ",""); StockMarket market = StockMarketHelper.narrow(root.resolve(name)); System.out.println("Price of MY COMPANY is " + market.get_price("MY_COMPANY")); } catch( SystemException e ) { System.err.println( e ); } } }

// // // StockMarketServer //

BY Ahmet Tolga Tat

Sayfa 227

// import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase { public float get_price( String symbol ) { float price = 0; for(int i = 0; i < symbol.length(); i++) { price += (int) symbol.charAt( i ); } price /= 5; return price; } public StockMarketImpl( String name ) { super( name ); }

// // // StockMarketServer Main // // import org.omg.CORBA.*; import org.omg.CosNaming.*; import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) { try { ORB orb = ORB.init(); BOA boa = orb.BOA_init(); StockMarketImpl stockMarketImpl = new StockMarketImpl("NASDAQ"); boa.obj_is_ready( stockMarketImpl ); org.omg.CORBA.Object object = orb.resolve_initial_references("NameService"); NamingContext root = NamingContextHelper.narrow( object ) ; NameComponent[] name = new NameComponent[1]; name[0] = new NameComponent("NASDAQ", "");

BY Ahmet Tolga Tat

Sayfa 228

root.rebind(name, stockMarketImpl); boa.impl_is_ready(); } catch( Exception e ) { e.printStackTrace(); } } }

BY Ahmet Tolga Tat

Sayfa 229

Kaynakca
1.Go To Java 2 Yazar:GuidoKrger http://www.gkrueger.com 2.Java ist auch eine Insel Yazar:Christian U. Ullenboom http://java-tutor.com/ 3.Thinking in Java Yazar:Bruce Eckel http://www.bruceeckel.com 4.http://java.sun.com 5.http://www.omg.org 6.http://www.javaworld.com 7.http://bilmuh.ege.edu.tr 8.http://www.selfjava.de 9. ve daha aklimda olmayan bir sr kaynak..?? Prentice Hall Computer Books ISBN: 0136597238 Addison-Wesley,1999 ISBN 3-8273-1370-8

------------------------J J J -------------------Bitti------------------JJ J --------------------------J J

BY Ahmet Tolga Tat

Sayfa 230

You might also like