Java
Java
Giri Bu eitimde iyi bir java programcs olmak iin gerekli olan tm bilgileri youn uygulamalar erevesinde inceleyeceiz. Bu bilgileri renirken aslnda bilgisayar programclnn tm temellerini de renecek, almamz tamamladmzda da java programlama dilinin tm szdizimi yapsn, dilin kurallarn ve bu dil ierisinde yer alan temel paketlerin kullanmn rahatlkla kavram olacaksnz. Ayrca temel kavramlar rendikten sonra ileri dzeyde interaktif bir program yazabilmeniz iin gerekli olan kullanc arayz tasarmnn Java ile nasl yaplabileceini de greceiz.
Bu Eitim Kimler in? Teknik detaylara girmeden nce unu belirtmek gerekir ki bu alma daha nce hi bilgisayar programcl ile ilgili almayanlar iin ok iyi bir balang ve az ok bu ii bilenler iin de iyi bir ariv olacak ekilde hazrlanmtr. Eitim ierisinde en temel kavramlar anlatrken hem mevcut bilgilerinizi ilerletecek hem de nceden rendiimizi sandmz temel bilgilerinizi tekrarlam olacaksnz. Ayrca arasra deineceimiz pratik ipular sayesinde de, uzun zaman harcayarak elde edeceimiz baz bilgilere, hemen erime ansna sahip olacaz. Java Platform Bamszdr Doasnda platform bamsz olarak alan Java uygulamalarmz ve uygulamalar oluturmak iin kullanacamz aralar hem Windows hem de Linux iletim sistemlerine ynelik hazrladmzdan herhangi bir kstlama ierisine de girmeyeceksiniz. Bu dersimizde Java programclna giri yapacak ve aada listelenen balklar renmi olacaz: * * * * * * * Java nedir? Nerelerde kullanlr? Nesne ynelimli programclk nasl olur? Java paketleri Kurulum ve ilk ayarlar Java ile bir uygulamann altrlmas Nesne kavram ve snf tasarm Temel yazm kurallar
Eitim boyunca reneceimiz tm bilgileri dikkatlice okumanz ve sklkla tekrar etmenizi neririm. Ayrca anlatm srasnda ve pratik amal verilecek rnekleri de mutlaka kendiniz de yazp denemelisiniz. Unutmaynz ki iyi bir bilgisayar programcs olmak, bir mzik aletini iyi alabilmeye benzer. Bunu baarmann en kolay yolu da saysz pratik yapmaktr. lk balarda anlamsz ve kolay gibi grnen uygulamalar sabrla yazp denediinizde ne kadar ok yere takldnz farkedeceksiniz. Ayrca bu pratiklerin ilerleyen haftalarda nasl bir yetenek kazandrdna inanamayacaksnz :) Nedir Bu Java? lk olarak Java programlama dili ve nesne ynelimli programlama teknii hakknda ksaca bilgi edinmek iyi bir balang olacaktr. Ad Green Project olarak bilinen bir projenin ierisinde yer alan James Gosling, proje iin en uygun dilin belirlenmesi iini stlenmiti. 1984'de Sun Microsystems'de greve balayan Gosling, almalarna C++ ile balam ancak bu dilin proje iin yeterli olmayaca dncesiyle, yine bu dilin bir trevi olan ve ilk ad Oak olan yeni bir dili gelitirmeye balamt. Daha sonra yerel bir kafeden arm yaparak bu dilin adn Java olarak deitirmitir. O gnlerden bu gne Java halen gelitirilmekte olan ve gnmzde pplaritesi tartlmaz olan bir dil olarak kullanlmaktadr. Java nesne ynelimli bir dildir Java nesne ynelimli bir programlama dilidir. Bir programlama dilinin nesne ynelimli olmas, dilin kendi zellii itibariyle ayn amaca ynelik grevlerin snf (class) denilen yaplar ierisinde toplanmasna ve bu prensibe gre kullanmna izin vermesidir. Nesne ynelimli programcln bir ok avantaj vardr. Bunlardan en nemlisi, bir projede birbirinden bamsz olarak tasarlanan snf nesneleri kullanlmasdr. Bylece projeye belli grevlerin eklenmesi veya karlmas projenin btnne dokunmadan mmkn hale gelebilmektedir.
2
Bunu bir rnekle daha kolay kavrayabiliriz: Mesela icq benzeri bir program yazdmz dnelim. Byle bir projede kullancnn karsna gelecek uygulamann grnts ayr bir mdl, sisteme kaydolan kullanclarn kayt ilerinin yrtlmesi ve veri tabannda saklanmas ii ayr bir mdl, a balantlar ve aa giri k kontrollerinin yrtlmesi de ayr bir mdl olarak tasarlanmakta ve daha sonra birletirilmektedir. Bu tasarm srasnda herhangi bir modlde meydana gelen aksama dier mdlleri etkilemeyecektir. Bundan baka, belli bir grevi stlenen bir snf nesnesi temel alnarak bu greve yeni eklemeler yapmak (tretme) Java gibi bir nesne ynelimli programlama dili ile olduka kolaydr. rnein; ileriki konularda bahsedeceimiz ekilde, siz bir pencere uygulamas tasarlam olabilirsiniz. Daha sonra bir bakas sizin tasarladnz bu pencereyi hi bozmadan kullanarak ve zerine eklemeler yaparak internet explorer'a ok benzeyen baka bir pencere uygulamas haline getirebilir. Eitimimiz devam ettike zaten bu tekniin aslnda ne kadar vazgeilmez olduunu daha iyi kavrayacaksnz. Java Multithread Programlamay Destekler Ayn anda birden fazla ii yrtebilecek fonksiyonlarn almas ancak mutlithread destei sayesinde mmkn olacaktr. Java halihazrda bu yetenee sahiptir. Gvenli ve Salamdr Java'da, C ya C++ da olduu gibi pointer kullanm kullancya o kadar ak deildir. Bu nedenle pointer gibi kritik kullanmlar neticesinde doacak gvenlik problemlerine java da rastlanmaz. Ayrca Java'da built-in olarak bulunan birtakm aralar sayesinde hafza ynetimi dinamik olarak ele alnmaktadr. Bylece hafzann bir sre sonra dolmas gibi problemler de Java dili ierisinde engel tekil etmez. Bu aralardan en nemlisi Garbage Collector denilen aratr. Bu ara hafzada tutulan ve artk kullanlmayan nesneleri otomatik olarak temizler. Java'nn gvenli olmasnn bir dier nedeni de ierisinde salad alma mekanizmasdr. Bu mekanizmay yle zetleyebiliriz: Classloader ile gelen gvenlik Yazlan ve derlenen programlar ierisinde gerekli snflar class loader denilen bir arala programa dahil edilirler. Ancak Class Loader a zerinden gelen snflarla lokal makinede yer alan snflar ayr yerlerde tutar. Bylece daha nceden gvenilen lokal snflarn zerine yazlma ihtimali ortadan kalakacaktr. Ayrca JVM tarafndan yorumlanan byte-code larn da gvenilirlii test edilmektedir. Bu testi byte-code verifier denilen bir ara stlenir. Bu ilem alma zaman srasnda (run-time) gerekletirilmektedir.
Enterprise Uygulamalar in Gelitirlmitir. Java salad platformlar sayesinde datk (distrubited uygulamalar gelitirmek iin olduka uygundur. Datk uyuglamardan kast, sunucu-istemci etkileimli, veri taban kullanan ok katmanl yaplardr. Bunun iin Java Teknolojilerini incelemek gerekmetedir. Java Paketleri Paket denilen eyi aslnda daha nce bakalarnn yazp dil ierisinde kullanlacak ekilde hazrlad program paralar olarak dnebilirsiniz. Bu paralar ierisinde ana programnz yazmak iin baz zel ileri yapabileceiniz (dosya ilemleri, a ilemleri, ekran ilemleri v.b.) aralar yer almaktadr. Bu aralar aslnda tm nemli ilerini temelini oluturacak grevleri yapabilmektedir. Daha zel uygulamalar bu temel aralarn zerine gelitirilir. Bu nedenle temel aralar en batan tekrar yazmak yerine paket ierisinden kullanrz. Daha teknik anlamda bu aralar; snflar ve bu snflara ait metod ve deikenlerdir. Bu paketlere ayn zamanda Snf Ktphanleri (Class Libraries) de denilir. JDK (Java Development Kit) Bu ktphanelerden, Pencere Ynetimi (Window Management), Giri/k (I/O) ve A letiimi (Network Communication) uygulamalrna ynelik olan snf ktphaneleri JDK (Java Development Kit) denilen ortam ierisine yerletirilmitir. Bunun dnda Java ierisinde baz ileri kolaylatran aralar da mevcuttur. Bu aralar debug, deployment ve dkmantasyonu kolaylatrmak amacyla kullanlr.
Java Dkmantasyonu Java programlama dilinin yapsn oluturan temel paketler dnda birok farkl alanda program gelitirebileceiniz yzlerce paket mevcuttur. Ayrca bu paketlerde yer alan genel konuya ilikin yzlerce snf nesnesi yer almaktadr. Bu snf nesnelerinin dkmantasyonunu kullanmadan iyi bir Java uygulamas gelitirmenin neredeyse imkansz olduunu syleyebilirim. Bunun iin, yazlm kitaplarn yannda Java ile ilgili hereyi bulabileceiniz [Link] adresini incelemenizi tavsiye ederim. En ksa yoldan bu Java paketlerini incelemek istiyorsanz [Link] adresinde aradnz herhangi bir snfa ilikin tm method ve deikenleri bulabilirsiniz. Java ile gelitirebileceiniz bir ok alanda uygulama olduunu sylemitim. Aslnda bu uygulamalar birbirinden kesin bir izgiyle ayrmak pek doru olmaz. A zerinde ortak bir veri tabann kullanan ve grsel bir kullanc grafik arayzne sahip olan bir projeyi gelitirmek iin veri taban, a uygulamas ve grafik arayz tasarm eklinde ayr uygulama alannda birden almak gerekir. Ancak gzel olan, Java'nn nesne ynelimli bir programlama dili olmas itibariyle, bu uygulamalarn ayr ayr gelitirilip daha sonra tek bir proje ats altnda birletirmenin mmkn olmasdr.
Java Sanal Makinesi (Java Virtual Machine) Java'nn platform bamsz olmas demek, herhangi bri makinede yazlm ve bir ilemci ile derlenmi bir java uygulamasn, tek bir noktasn bile deitirmeden baka bir makine ya da ilemci altnda altrabilmek anlamna gelmektedir. Java'ya bu zellii kazandran mekanizma ise ierisinde barndrd JVM (Java Virtual Machine) dir. Bilgisayarnzda bir java uygulamas altrabilmeniz iin, ierisinde java sanal makinas ve ktphanelerinin de yer ald sdk setini yklemeniz gerekir. Yazdnz uygulama, makinada yer alan bu SDK ile gelen, JVM ierisinde alacandan, program kodunuzda hi bir deiiklik yapmadan ister windows altnda, ister linux altnda, ister Intel, SPARC ya da Alpha ilemcili bir makinada altrabilirsiniz. Java kaynak kodlar .java uzantl dosyalarda yer almaktadr. Her java dosyas altrlmadan nce derlenerek ayn isimle .class dosyasna dntrlr. Bu derleme ilemini yapan program ise javac programdr. Daha sonra derlenmi olan bu .class dosyas yine jvm ierisinde yer alan java program tarafndan yorumlanr ve bylece yazdnz uygulama altrlm olur. Bunu aadaki resimde grmekteyiz:
Kurulum ve lk Ayarlar SDK setinin son versiyonu ve dkmantasyon paketini [Link] adresinden indirebilirsiniz. Ancak bu eitim kapsamnda 1.4.2 versiyonu yeterli olacaktr. Yukarda seti indirebileceiniz adresi ziyaret ettiinizde, indirmek istediiniz seti belirlediiniz zaman karnza gelen ikinci sayfada yine bu set ile ilgili hangi dilde, hangi platform iin ve hangi paketi indireceiniz konusunda bir seim yapmanz istenecektir. Ayrca yine bu sayfada daha nce web adresini verdiim dkmantasyon paketini de indirebileceiniz bir balant bulacaksnz.
Burada Windows (all languages, including English) yazl satrda SDK stunu altndaki balantda yer alan set Windows kullanclar iin uygundur. Dilerseniz ayn ekilde Linux iletim sistemi iin de uygun setleri indirebilirsiniz. ndirme ilemi tamamlandktan sonra Windows kullanclar iin .exe uzantl gelen seti zerine tklayarak kurmaya balayabilirsiniz. Linux kullanclar isterlerse .rpm uzantl kurulum paketini, isterlerse de .bin uzantl kurulum dosyasn ayn yerden indirebilirler. ndireceiniz dosya j2sdk-1_4_1_04-[Link] ya da j2sdk-1_4_1_04-[Link] gibi bir isme sahip olacaktr. Eer .bin dosyas ile kurulum yapacaksanz, aadaki gibi nce bu dosyaya altrma izni verip daha sonra da altrarak kurulumu tamamlayabilirsiniz: $ chmod a+x j2sdk-1_4_1_04-[Link] $ ./ j2sdk-1_4_1_04-[Link] .rpm uzantl paketi kurmak iin ilk once root kullancs olmanz gerekmekteir. Daha sonar da yine aadaki komutu kullanarak kurulumu tamamlayabilirisiniz: $ su # rpm -ivh j2sdk-1_4_1_04-[Link] Not: Yukarda bahsettiim linux ve windows platformlar iin kurulum ilemlerine ilikin aklamalar, kurulum dosyalarn indirdiiniz sayfada da bulabilirsiniz.
PATH Ayar Kurulum ilemi tamamlandktan sonra PATH ayarn yapmamz gerekmektedir. letim sistemlerinde yer alan ve orjinal adyla Environment Variables denilen bir takm anahtar deerler ierisinde eitli bilgiler tutulur. Bu deikenlerden birtanesi de sistem ierisinde yazlan komutlarn aranaca dizinlerin hangi dizinler olaca bilgisini tutan PATH deikenidir. Java uygulamalarmz altrrken kullanacamz komutlarn iletim sistemi tarafndan her yerden tannmas iin bu PATH deikenine java sanal makinasnn komutlarnn yer ald dizinini de ekleyeceiz. Burada bu ilemi hem Windows 2000 iletim sistemi hem de Linux iletim sistemi iin anlatlacam. Ancak yukarda verdiim bilgiyle birlikte siz de ayn ilemi baka sistemlerde de kolaylkla yapabilirsiniz. nk neticede yaplacak ey sadece bu PATH deikenine yeni dizini eklemek olacaktr. Windows kullanclar iin: Masastnde yer alan Bilgisayarm (My Computer) simgesine sa tklaynz ve zellikler (Properties) seeneini seiniz. Daha sonra karnza kan pencerede Gelimi (Advanced ) sekmesini seiniz ve burada yer alan evresel
Deikenler (Environment Variables) seeneini seiniz: Bu sefer karnza kan pencerede Path isimli deikeni greceksiniz. Bu deikeni seip Dzenle (Edit) dmesine basarak eklemek istediiniz yeni dizini karnza kan sz diziminin en sonuna nce bir noktal virgl (;) koyarak yaznz ve deiiklikleri kaydederek sisteminizi yeniden balatnz. Bundan sonra artk java komutlarn rahatlkla kullanabiliriz. (Buradaki rnekte sanal makinann yer ald dizin C:\jdk1.4\bin olarak kullanlmaktadr. Bu bilgi sizin makinanzda farkl olabilir)
Linux kullanclar iin: Bir terminal ierisinde PATH deikenine aada gsterildii gibi java sanal makinasnn yer ald dizini ekleyiniz ve aadaki gibi export komutu ile bu deikeni yeni deeri ile tm kabuklar iin kullanma hazr hale getiriniz (Buradaki rnekte sanal makinann yer ald dizin /usr/local/jdk1.4/bin olarak kullanlmaktadr. Bu bilgi sizin makinanzda farkl olabilir) : $ PATH=$PATH:/usr/local/jdk1.4/bin [academytech@localhost academytech]$ export PATH imdi de deikenin yeni deerini alp almadn kontrol edelim: $ echo $PATH /usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/academytech/bin:/usr/local/jdk1.4/bin/ Grdmz gibi ktnn en sonunda bizim eklediimiz yeni dizin de yer almaktadr. Bu k bize ilemi dzgn yaptmz anlatmaktadr. Ancak unu da eklemek gerekir ki linux altnda yaplan bu ayar sadece o andaki oturum iin geerlidir. Bu bilginin kalc olmasn istiyorsanz home dizininizde yer alan .bash_profile dosyas ierisine u satr ekleyin: PATH=$PATH:/usr/local/jdk1.4/bin Bu anlatlanlar yaptysanz artk sistem ierisinde hangi dizinde olursanz olun java sanal makinanza ait komutlar dorudan kullanabileceksiniz.
Java ile Uygulamaya Giri lk ayarlar ve kurulumu tamamladmza gre artk en temel java uygulamamz yazalm ve altralm. Bu uygulama kullancya aadaki gibi bir mesaj penceresi karacaktr:
Resim 4: Ornek 1 ile yazlan uygulama sonunda ekrana gelecek olan mesaj penceresi
import [Link].*; import [Link].*; public class Mesaj { //1. satr public Mesaj() { //2. satr [Link](null, "java ile hayat guzel :)"); } public static void main(String[] args) { Mesaj A = new Mesaj(); [Link](0); } } //3. satr
imdi de komut satrnda nce bu dosyay kaydettiiniz klasre gidiniz (bu rnekte bu klasr c:\temp olarak yaratlmtr) ve aadaki gibi nce javac [Link] yazp enter tuuna basn. Bunu yaptnzda bilgisayar ksa bir sre yazdnz kodu jvmnin anlayaca ekilde derleyecektir. Daha sonra da yine komut satrnda java [Link] yazp enter tuuna basn. Bu sefer de jvm derlenmi dosyay altracaktr: C:\temp> javac [Link] C:\temp> java Mesaj Not: Linux altnda da bu uygulamay ve bundan sonra gstereceimiz uygulamalar ayn ekilde altrabilirsiniz. Bir java uygulamas en temel ekilde byle altrlmaktadr. Bu ilem linux iletim sistemi altnda da deimeyecektir. Programmza ksaca bir gz atalm: lk satrlarda yer alan import [Link].* ve import [Link].* bildirimleri kullanacam nesnelerin tanml olduu paketleri program ierisinde de eriebilir hale getirmektedir. Eer bu satrlar yazlmasayd program, grdmz mesaj penceresinin olumasn salayan JOptionPane adndaki snf nesnesini tanmayacak ve bu nesneyi bulamadna dair bir hata verecekti. Bu yzden kullandnz nesnelerin hangi kthanelerde olduunuz bilmeniz ve programn en banda import anahtar szc ile koda dahil etmeniz gerekmektedir. Yazdnz java uygulamas da kendi bana bir snf nesnesidir ve bu nesne ad ile (baknz: [Link] - 1. satr) dosya ismi ayn olmak zorundadr. Aksi takdirde programnz dzgn bir ekilde derlenmeyecek ve dolays ile almayacaktr. kinci satrda public Mesaj() eklinde bir metod tanmlandn gryoruz. Nesne ismi ile ayn isme sahip olan bu zel metodlara balang metodlar (constructor) denilmektedir. Yazlan her java program bir snf nesnesi olduuna gre bu nesneyi kullanmak iin nce bu nesne trnden bir deiken yaratmak gerekir. te bu deiken yaratld anda bu zel metodlar otomatik olarak arlrlar. Balang metodlaryla ilgili ayrntl bilgiyi daha sonra reneceiz.
7
nc satrda yer alan ve main adyla tanmlanm metod ise yine zel olarak programn altrld ilk metoddur. Burada yukarda bahsettiim nesne yaratma ilemi yaplmaktadr. Daha genel sylemek gerekirse; yazdnz programn alabilmesi iin, temel programn main metodu ierisinde yazlmas gerekir. Biz burada, Mesaj snf nesnesini eer main metodu ierisinde kullanmasaydk program yine derlenecekti ancak hi bir ey almayacakt. Fakat bu rnekte yazdmz nesne main metodu ierisinde yaratld ve yaratld anda bu nesnenin balang metodu otomatik olarak arld. Bu arm neticesinde de ekrana bir mesaj penceresi km oldu. Her ne kadar daha nce java ile almam olan arkadalar iin main metodunun nesne iindeki bu kullanm biraz tuhaf gelse de, alldnda ne kadar basit ve anlaml olduu anlalacaktr . Amacmz u an iin sadece bir giri yapmak olduundan main metoduna aktarlan parametre yaps ve bundan sonraki rneklerde de greceiniz public, private gibi anahtar szcklerin kullanm hakknda burada hemen bilgi vermeyeceim. imdilik sadece kullandm nesnelerin nasl yazld ve ilerki konularda da greceimiz ekilde nasl ele alndn ve ayrca nesneler arasndaki hiyerarinin nasl salandn incelemenizin daha faydal olacan dnyorum. rnek 1de ad messageDialog olan sadece bir tane nesne kullandk. Bu nesneyi gstermek iin JOptionPane snfnda yer alan showMessageDialog metodunu, mesaj penceresinde grlmesini istediimiz yazy parametre olarak girerek ardk. pucu: Bir java uygulamasn tek bir tklama ilemi ile altrmak da mmkndr. Bunun iin windows altnda aadaki gibi bir dosyay [Link] adyla kaydedersiniz dosya zerine tkladnzda uygulamanz direk olarak alacaktr:
/*--- [Link] ---*/ javac [Link] java Mesaj /*--------------------*/
Ayn ilemi linux altnda yapmak iin [Link] adnda bir dosya ierisine yukardaki satrlarn aynsn yazarak dosyay kaydediniz ve konsol zerinde bu dosyaya aadaki gibi altrma izni vererek dosyay altrnz: $ chmod 700 [Link] $ ./[Link]
Nesne Kavram ve Snf Nesnelerinin Tasarm Java'da her ey bir nesnedir. Nesneler snf denilen yaplar ile meydana getirilir. Her nesne kendisine ait baz bilgileri barndrmaktadr. Bu bilgiler nesneye ilikin eitli deikenler, nesne ile ilgili baz ileri yapacak eitli fonnksiyonlar ve sabitlerdir. Ayrca yine bir nesne ierisinde nesnenin kullanaca baka nesneler de olabilir. Buradan da anlyoruz ki aslnda bir snf nesnesi birden fazla veri tipinin bir arada bulunduu ve belli bir ii yapmaya ynelik hazrlanan birleik bir yapdr. Bir snf nesnesi yaratlrken deimeyen baz kurallar vardr. Bu kurallar neticesinde siz de kendinize ait snflar yaratabilirsiniz. imdi temel olarak bir snf nesnesinin nasl yaratldna bakalm:
public class Kitap { String kitap_adi; String yazar_adi; int sayfa_sayisi; float ucret; ... float ucretiSoyle() { .... } void ucretiDegistir(float yeni_ucret) ....
8
} }
Bu rnekte de grld gibi bir snf nesnesi yaratrken class anahtar szcn kullanmaktayz. Nesnemizin tamam, class anahtar szc ile onu takip eden ve bizim vereceimiz isimden sonra alan kme parantezi ile en sonda kapatlan kme parantezi ierisine yazlmaktadr. Nesne yaratlrken ilk kullanlan public anahtar szc nesnenin baka nesneler ierisinde de dorudan kullanlabileceini belirtmektedir. Bu anahtar szck gibi nesnenin dorudan kullanlamayacan belirtebileceiniz private anahtar szc de mevcuttur. Bunu dnda yeri geldike kullanlabilecek baka anahtar szcklerin olduunu da belirtmeliyim. Ancak u anda yolumuza sadece bu bilgilerle devam etmek daha verimli olacaktr. Grdmz gibi Kitap isimli snf nesnemizin ierisinde kitap_adi, yazar_adi gibi deikenler yer almaktadr. Bu deikenlere snf deikenleri denilir ve nesnenin zelliklerini meydana getirirler. Bu zellikler her Kitap nesnesi iin deiecektir ancak her Kitap nesnesi, deerleri farkl olsa bile bu zelliklere sahip olacaktr. Ayrca yine nesnemiz ierisinde bu deikenlere ek olarak baz metodlarn yazlabileceini de grmekteyiz. Java'da metod olarak isimlendirilen kavramlar C ya da C++ programlama dillerindeki fonksiyon kavram ile ayn eyi anlatmaktadr. Metodlar sayesinde belirli ilerin tek seferde yaplmasn salayabiliriz. Mesela bu rnek snf nesnesini kullanrken snf deikenleri ierisine srasyla kitap adn, yazar adn ve kitabn cretini yklediimizi kabul edelim. Bundan sonra herhangi bir anda kitabn cretini renmek istediimizde nce hangi deikenler olduunu, hangi deikende aslnda kitap cretinin yer aldn renmek yerine bu ii bizim iin yapp bize sadece sonucu retecek bir metod yazmak daha akllca olacaktr. Bu amala yazdmz ucretiSoyle isimli metodu arsak iimizi ksa yoldan halletmi oluruz. Metodlarn yazm ve kullanmna ilikin daha ayrntl teknik bilgileri ilerleyen sayfalarda vereceim. Burada sadece kavram olarak metodlar anlamak konuyu kavramak asndan yeterli olacaktr. Sonu itibariyle yazlan bu snf metodlar bu snf nesnesi ile yaplabilecek operasyonlar tanmlar. Yazm Kurallar zerine Bir Not Bir uygulama yazarken dikkat edilmesi gereken nemli konulardan birtanesi de yazm kurallardr. Aslnda burada bahsedeceim bu kurallarn bazlarna uymak bir zorunluluk olmasa da ileride iyi bir programcnn sahip olmas gereken alkanlklar edinmenize yardmc olur. Parantezlere Dikkat Bahsedilebilecek ilk kural parantezlere dikkat etmeniz gerektiidir. Snf nesnesini yaratrken alan parantezi hemen ayn anda kapatp daha sonra bu iki parantezin arasna yazmaya balamanz, alan bir parantezi kapatmay hatrlama zorunluluunu ortadan kaldrr ve hata yapma riskinizi azaltr. simlendirme kinci kural olarak isimlendirmeden bahsedilebilir. Java'da snf nesneleri genellikle byk harfle isimlendirilir. Ayrca aslnda yazlan her .java dosyasnn bir snf nesnesi olduunu da unutmamalyz. Bir .java dosyasnda baka snf nesneleri de olabilir ancak bunlardan bir tanesi asl nesnedir ve dier nesneler bu ana snf nesnesi tarafndan kullanlr. Dosya ismi de bu snf nesnesi ile ayn isimde olmak zorundadr. Metodlarn isimlendirilmesi, ilk harf kk harf, dier kelimelerin de ilk kelimeye bitiik ve ilk harflerinin byk harf eklinde yazlmas kuralna uymakta yarar vardr. rneimizde yer alan ucretiSoyle ve ucretiDegistir isimli metodlarda bu kurala uyduumuzu grmekteyiz. Deikenlerin isimlendirilmesi kk harflerle yaplmaktadr. Kodlamada Girintiler (Indentation) Son olarak bahsedilebilecek kural ise kod yazm srasnda kullanlan girintilerdir. Dikkat ederseniz yukardaki rnekte ilk satrda alan parantezden sonra dier btn bilgileri bir tab ieriden yazdm. Daha sonra metodlara ilikin parantezleri de atktan hemen sonra yazl kodlar temsil eden noktay da (...) yine bir tab ieriden yazdm. Bylece hangi kodlarn hangi faliyet alanna ait olduklarn daha net bir ekilde grebiliyorum. Yukarda bahsedilen bu kurallara uymak, bize yazdmz kodu daha sonra kolaylkla anlama ans salar. Ayrca yardm almak ya da rapor vermek amacyla kodu inceleyen baka kiiler de bu ii daha rahat yapabilirler. Bu amala bu kurallara zen gstermenizi tavsiye ederim.
imdi u ana kadar edinmi olduumuz bilgiler nda bir rnek daha yazalm. Bu rneimizde bir tane Kitap isimli snf nesnesi yazp bu nesne trnden iki farkl deiken yaratacam. Daha sonra da bu deikenlerin sahip olduklar zellikleri inceleyeceim.
public class Kitap { String kitap_adi; String yazar_adi; int sayfa_sayisi; public int sayfaSayisiniVer() { return sayfa_sayisi; } public void kitabiGoruntule() { [Link]("\nRapor"); [Link]("********"); [Link]("Kitap Adi: " + kitap_adi); [Link]("Yazari: " + yazar_adi); [Link]("Sayfa Sayisi: " + sayfa_sayisi); [Link]("\n"); } public static void main(String[] args) { Kitap kitap1 = new Kitap(); Kitap kitap2 = new Kitap(); kitap1.kitap_adi = "Puslu Kitalar Atlasi"; kitap1.sayfa_sayisi = 238; kitap1.yazar_adi = "Ihsan Oktay Anar"; kitap2.kitap_adi = "Vadideki Zambak"; kitap2.sayfa_sayisi = 307; kitap2.yazar_adi = "Balzac"; [Link](); [Link](); } }
Daha ncede anlatld ekilde kodu yazp altrdnzda aadaki gibi bir k alacaksnz:
Rapor ******** Kitap Adi: Puslu Kitalar Atlasi Yazari: Ihsan Oktay Anar Sayfa Sayisi: 238 Rapor ******** Kitap Adi: Vadideki Zambak Yazari: Balzac Sayfa Sayisi: 307
imdi gelin neler olduunu inceleyelim: rnek programmzda daha nce de dediimiz gibi Kitap isimli snf nesnesini eitli deikenleri ve metodlaryla yarattk. Ayn zamanda nesne ierisine yazdmz main metodu sayesinde de programmz derlendi ve altrld. unu hatrlatmakta fayda var: Bir snf nesnesi yazlp derlendiinde aslnda almaz. Sadece o nesne kullanlabilir durumdadr. Bir java programnn almas demek
10
aslnda sadece main metodunun almas demektir. Bu rnekte de Kitap isimli snf nesnesini yine Kitap snf nesnesi ierisinde yazdmz main metodu ierisinde kullanyoruz. Bu kullanmda Kitap nesnesi trnden iki farkl deiken yaratyoruz. Bunun anlam bu iki farkl deikenin kendine ait olan ama ayn niteliklerde deiken ve metodlar olduudur. Daha farkl bir deyile; aslnda kitap1 deikeninde de kitap2 deikeninde de kitap_adi isimli bir String trnden deiken vardr ancak ierdikleri deerler farkl olabilir. Zaten main metodunun son iki satrnda da [Link]() ve [Link]() metodlarnn retecekleri deerler her iki deiken iin farkl olacaktr. Ancak her iki deiken de aslnda bir Kitap nesnesi olduundan kendilerine ait bir kitabiGoruntule() metoduna sahipler demektir. Buradan karacamz sonu snf nesneleri aslnda birer modeldir ve bu nesneler trnden yaratlan deikenler de bu modelin birer rneidir. Bugnk almamz burada noktalyoruz. Yukarda anlatlan nesne kavramlar, snf nesnesi tasarm ve metodlara ilikin aklamalar aslnda sadece iyi bir giri yapabilmeniz amacyla inceledik. lerleyen dersler boyunca bu konular tek tek kendi ilerinde detaylandracaz. Deiken Kavram Tm programlama dillerinde olduu gibi Java'da da deikenler kullanlmaktadr. Deiken; program yazlmas srasnda, ierisinde birtakm deerleri tutan ve kendine ait bir tr olan yapdr. Bir deikenin ierisinde tuttuu deer, program ak srasnda deitirilebilir. Ayrca her deikenin bir tr vardr ve deikenlerin ilerinde tuttuklar bu deerler de ayn trden olmaldr. Kullanlmadan nce deikenlerin zellikleri hakknda derleyiciye bilgi verilmesi ilemine bildirim denir. Bir deiken nesnesi u zelliklere sahip olur: deiken ismi deiken tr deiken ierisindeki deer deikenin faliyet alan
Deiken simlendirme Deiken ismi, deiken nesneyi temsil eden karakterlerdir. Bu isim belli kurallar dahilinde verilmektedir. Bu kurallar ksaca yle aklanabilir: deiken isimlerinde boluk olmamaldr, sayfa sayisi -> yanlis sayfa_sayisi -> dogru sayfaSayisi -> dogru deisken isimlendirmede trke karakterler kullanlmamaldr, zelDeisken -> yanlis OzelDegisken -> dogru Deikenin tr aslnda ierisinde tutaca deerin zelliidir. Mesela ierisinde tamsay deerleri tutan bir deiken ile ondalk say deerleri tutan deiken ayn trden deildir. Bir deikenin ierisinde deerler saklanarak aktarlr ve kullanlrlar. Deikenler ierisinde saklanan deerlerin de bir tre ilikin olduklarn ve ilerinde saklanacak deikenin tr ile ayn trden olmak zorunda olduklarn unutmaynz. Aadaki rnekte integer trnden bir deiken yaratp ierisinde de 200 sayisini saklayacaz:
public class Degisken { public static void main(String arg[]) { int a = 200;
11
Kodun almas sonucunda ekranda u yazy greceksiniz: a degiskeninin sakladigi deger: 200 degeridir
Javada primitive type denilen deiken trleri vardr. Bu trlere biz ilkel ya da temel trler diyoruz. Daha sonraki derselerimizde greceiz ki temel trlerin dnda bir de nesnel trler vardr. Kullanlan temel veri tiplerini inceleyelim:
Snrlar -[Link], +[Link] -32.768, +32.767 -[Link].854.775.808L , +[Link].854.775.807L -128, 127 -+ 3.40282347E+38F -+ 1.79769313486231570E+308
n Eklere likin NOT: Yukardaki tabloda grld gibi baz veri tiplerinin sonuna F ve L gibi ekler getirilmitir. Bunun nedeni bu veri tiplerinin eklerle birlikte ifade edilmesidir. Bu durum tr bilgilerinin birbirine karmasn engeller. Saysal Olmayan Veri Tipleri Yukardaki tabloda incelemi olduumuz veri tipleri saysal bilgiyi ifade etmek iin kullanalr. Saysal olmayan bilgiyi ifade etmek iin kullanlan veri tipleri de vardr. imdi bunlar incleyelim:
char Veri Tipi: char veri tipi karakterleri temsil etmek amacyla kullanlr. Bir karakter klavye ile sisteme tek tu ya da birka tu kombinasyonu ile ama tek seferde girdiimiz sembollerdir. Hafzada 2 byte yer kaplarlar. Karakter Kmeleri ve Unicode Aslnda tm dillerdeki sembolleri iine alan en gei karakter kmesi Unicode karakter kmesidir. Bu kme ierisinde kullanlabilecek tm karakterler yer alr ve her karakter hexadecimal olarak ifade edilir. 65536 tane karakteri ierecek genilie sahiptir. Ancak halihazrda 35000 karakter kullanr. \u0008 (backspace), \u0009 (tab) gibi... ASCII karakter kmesi aslnda Unicode karakter kmesinin bir alt kmesidir ve ASCII karakterleri 128 tanedir. Hafzada 1 byte yer kaplarlar. Bunun dnda bildiimiz ISO8859-9 (latin-5) gibi karakter kmeleri ASCII nin uzantlar olup aslnda yine unicode karakter kmesinin bir alt kmesidir.
12
boolean Veri Tipi: Bu veri tipi mantksal bilgiyi ifade eder ve alaca deer true ya da false olabilir. Bu deerler ileride greceimiz mantksal operatrler ierisinde ve if, while, for gibi deyim ve dngler ierisinde kullanlabilir. Deiken Bildirimi: Deiken bildiriminde, ilk nce bu deikenin ierisinde tutaca deerlerin hangi trden olaca ve deikenin hangi isimle anlaca bildirilir. rnein: int a; double benim_degiskenim; String isim; [Link]() metodu zerine bir not: Bu metod java tarafndan tannan ve daha nce yazlm bir metoddur. Bu metodu kullanrken parantezler ierisine yazlan (parametre olarak yazlan) deiken ve sabitler ekranda grntlenir. Eer parantez ierisine bir deiken yazlm ise bu deikenin ierisindeki deer ekrana yazlacaktr. Ayrca + operatr yardmyla parantez ierisine birden fazla tr yanyana yazilabilir. rnein: [Link] public class Degiskenler {
public static void main(String arg[]) { int a; //satr 1 a = 200; //satr 2 int b, c; //satr 3 b = 100; //satr 4 c = 400; //satr 5 int d = 0; //satr 6 [Link]("a nin degeri: " + a); [Link]("a nin degeri: " + a + " b nin degeri: " + b); d = a + b + c; [Link]("Toplam deger: " + d); } }
Program altnda unu greceksiniz: a nin degeri: 200 a nin degeri: 200 b nin degeri: 100 Toplam deger: 700 Bu rnekte aslnda deiken bildirimine ilikin farkl yntemleri grmekteyiz. Bir deiken satr 1'de olduu gibi ilk nce yaratlp daha sonra satr 2'de olduu gibi ierisine deer verilebilir. Ya da satr 6'da olduu gibi ayn anda yaratlp ilk deer verilir. Bunun yan sra virgl kullanlarak ayn tre ilikin olmak zere satr 3'de olduu gibi tek satrda birden fazla deiken yaratlabilir. Bu rnekte ayn zamanda [Link] metodunun kullanmn grmekteyiz. zel Karakterler likin Bir Not: C ve C++ programla dillerinde de olduu gibi Java'da klavyeden girilen bir takm zel karakterlerin karl vardr. Bu zel karakterler bip sesi, enter tuu, alt satr ba, tab tuu gibi karakterlerdir. Bu karakterler kullanlrken balarna \ iareti koyulur ve uygun sembol yerletirilir. Buna gre: \n : alt satr bana \t : tab tuu \\ : \ iareti
13
\ : iareti \b : backspace (bir nceki karakteri silme) \r : kendisinden nce gelen tm karakterleri satr bana kadar silme anlamna gelmektedir. imdi kullancdan bir takm bilgileri alan ve daha sonra bu bilgileri ekranda gsteren bir program yazalm. Bu program altnda Resim 6'daki gibi JOptionPane snfnn showInputDialog isimli metodu yardmyla meydana gelen bir pencere araclyla bilgiler kullancdan istenecek ve sonra bundan nceki dersimizde de grdmz JOptionPane snfnn showMessageDialog isimli metodunun meydana getirdii mesaj penceresi araclyla girilen bilgiler ekranda tekrar gsterilecektir.
Programmz yazalm:
[Link]
import [Link].*;
//s1
public class IsimGir { public static void main(String arg[]) { String isim, yas; //s2 isim = [Link](null, "Lutfen isminizi giriniz: "); //s3 yas = [Link](null, "Simdi de yasiniz giriniz: "); //s4 String rapor = "Adiniz: "+isim+"\nYasiniz: "+yas; //s5 [Link](null, rapor); //s6 //[Link](null, "Adiniz:\t"+isim+"\nYasiniz:\t"+yas);s7 [Link](0); } }
Bu rnekte grld gibi ilk olarak kullancnn girecei bilgilerin tutulaca deikenler s2'de yaratlmaktadr. Eer bu deikenler olmazsa kullancnn girecei bilgiler bir yerde saklanamayaca iin kullanlamazd. Daha sonra s3 ve s4'de [Link]() metodu yardmyla ekranda giri yaplacak olan input dialog penceresi kartlmaktadr. Ancak bu metodun zellii, arldktan sonra geriye, kendisine girilen yazy deer olarak retir ve bu deer s3 ve s4'de srasyla isim ve yas deikenlerine aktarlmtr. s5'de ekranda en son bilgilerin gsterilecei pencereye yazlacak olan yaz hazrlanm ve rapor isimli deikene aktarlmtr. Daha sonra String trndeki bu rapor deikeni [Link]() metoduna parametre olarak gnderilerek mesaj penceresi hazrlanmtr. Ayn ekilde ekranda belirecek mesaj, s5'de olduu gibi nceden hazrlanabilecei gibi hemen o anda s7'deki gibi parametre olarak da hazrlanabilir. Bu rnekte s5 ve s6 yerine sadece s7'de kullanlabilir. Not: Banda // olan satrlarn Java derleyicisi tarafndan es geildiini ve programn sanki bu satrlar yokmu gibi alacan hatrlaynz.
Sabitler: Deiken nesnelerin ilerindeki deerlerin deiebileceinden bahsetmitik. Baz durumlarda tm program boyunca yanllkla da olsa deerinin deitirilmemesi gereken nesnelere ihtiya duyabiliriz. Bu talebi karlamak iin sabitler kullanlmaktadr. Sabitlerin bildirimi aynen deiken bildiriminde olduu gibidir ancak tek fark sabitlerin bildiriminin bana final anahtar szc getirilmesidir:
[Link]
public class Sabitler { public static void main(String arg[]) {
14
final double BIRIM_UCRET = 200.5; double sure = 2.3; //BIRIM_UCRET = 200.8; //s1 [Link](Bu ay odeme bedeli: + BIRIM_UCRET * sure + liradir.); } }
Bu rnekte grdmz gibi BIRIM_UCRET adnda ve tr double olan bir sabit ile sure adnda ve tr double olan bir deiken tanmladk. Bu durumda siz isteseniz bile bu sabiti s1'de olduu gibi deitiremezsiniz. Eer s1'in bandaki // ifadesini kaldrrsanz programn hata verdiini greceksiniz. Sonu itibariyle sabitleri program ierisinde bir deerle yaratp, ierisinde hep bu deeri tutmasn garanti edebilirsiniz. Sabitin ierisinde tutaca deer ancak bilinli olarak ve ilk defa verildii yerde deitirilebilir. Operator Kavram ve Operatrlerin ncelenmesi: Operatrler saysal ya da mantksal ifadelerin birbirleri ile ileme sokulmasn salayan aralardr. Program yazarken bir ok defa hesap yapmak gerekecektir. Bu saysal hesaplarn yaplabilmesi iin eitli saysal operatrler kullanlmaktadr. Ayrca yine operatrler yardmyla bazen de saysal olmayan ve kelimelerin karlatrlmas, eitliklerin salanmas ve bunun gibi birbirinden farkl mantksal ilemler de yapmak gerekmektedir. Not: unu kesinlikle unutmaynz ki; az sonra bazlarn reneceimiz operatrler, kullanldklar zaman geriye mutlaka bir deer retirler. retecekleri bu deerler bir say, true ya da false gibi boolean bir deer veya bunun gibi operatre gre deien deerler olabilir. Ama sonuta operatrn bir deer rettiini ve ilem sonucunda ortada sadece bu deerin kaldn anlamaya alnz. imdi bu operatrleri inceleyelim: = operatoru Bilinen en genel operatrlerden olan eitlik operatr ift tarafl kullanlr. Sa tarafnda yer alan deeri sol taraftaki deikene atamaya yaramaktadr. Daha nce yaptmz IsimGir isimli rnekte s3 ve s4'de de olduu gibi, bazen metodlardan gelen deerleri de deikenlere aktarmaya yarar. Aslnda mantk hep ayndr. Sadaki deer soldaki deikene aktarlr. Bu operatr kullanldgnda, ilk once sa taraf hesaplanmaktadr. +, -, *, / operatorleri: Bu operatrler klasik matematik ilemlerinin hesabnda kullanlmaktadr. Ancak istisna olarak + operatornn daha nce de grdmz IsimGir rneindeki s5'de olduu gibi Stringleri birbirleri ile ya da String ve deikenleri birbirleri ile balamak gibi ilemlerde de kullanlmas mmkndr.
+=, -= /= ve *= operatrleri: Bu operatrler birleik operatrlerdir. Genellikle bir deikenin deerini eski deeri ve yeni bir sabit artmnn toplam, fark, blm veya arpm eklinde deitirmek iin kullanlr. rnegin: int x = 10; x = x + 4; ileminde x deikeninin son deeri 14 olacaktr. Bu ilem ayn ekilde += operatoru kullanlarak da yaplabilir. yle ki: int x = 10, sayi = 6; x += 4; //x = x + 4 ile ayn anlamdadr. sayi = sayi 6; //sayi -= 6; ++ ve - operatorleri: Bu operatorlerin her ikisi de tamamen ayn mantkta olup verinin deerini 1 artrmak ya da1 eksiltmek amacyla kullanlr. Ornegin x = x +1; yazmak yerine x++; yazabilirsiniz. Ayn ekilde x = x -1; yazmak yerine x--; yazabilirsiniz. boolean Operatrleri :
15
Daha nce de belirttiimiz gibi eer bir deiken boolean trnde ise alabilecei sadece iki tane deer vardr. Bu deerler true ya da false deerleridir. Bu iki deeri bilgisayar mantnda 1 ya da 0 a benzetebiliriz. Bu iki deeri ierisinde saklamak amacyla kullanlan deikenler de boolean trnden olacaktr. Baz operatrler kullanldklar zaman sonu olarak bu iki deerden birtanesini retirler. Bu operatrlere mantksal operatrler denilir. == ve != operatorleri: Bu operatr aslnda eit mi? sorusunun cevabn reten mantksal bir operatrdr. ift tarafl olarak kullanldnda sadaki ve soldaki deerlerin eit olmas durumunda true sonucunu retir. Eitlik yok ise false sonucu retilecektir. Mesela 3 == 5 ilemi false deerini retir. == operatorune benzer olan, ancak tam tersini yapan dier bir operatr de != operatrudur. Bu operatr de yine ift tarafl olarak alr ve her iki tarafn birbirine eit olmamas durumunda true, eit olmalar durumunda da false deerini retir. rnein 3 != 5 ilemi true deerini retir. && ve || (and ve or) Operatorleri: Bu iki operator mantk ilemlerinde kullandmz and ve or operatrleridir. Bunlar da ift tarafl kullanlr. && operatoru her iki tarafndaki deer true ise true sonucunu retecek ama sa ya da sol taraftan bir tanesi false olmas durumunda false deerini retecektir. || operatoru de iki tarafndaki deerlerden en az bir tanesi true olmas durumunda true deerini retecek, her iki tarafn da false olmas durumunda false deerini retecektir.
[Link]
import [Link].*; public class AnaSinif{ public static void main(String arg[]){ boolean deger1 = true; boolean deger2 = false; boolean sonuc1 = deger1 && deger2; [Link](null, "deger1: " +deger1+"deger2: "+deger2+ "deger1 && deger2 ->"+ sonuc1); boolean sonuc2 = deger1 || deger2; [Link](null, "deger1: " +deger1+"\ndeger2: "+deger2+ "\ndeger1 || deger2 -> "+ sonuc2); deger2 = true; sonuc1 = deger1 && deger2; [Link](null, "deger1: " +deger1+"\ndeger2: "+deger2+ "\ndeger1 && deger2 -> "+ sonuc1); deger1 = false; deger2 = false; sonuc1 = deger1 || deger2; [Link](null, "deger1: " +deger1+"\ndeger2: "+deger2+ "\n\ndeger1 && deger2 -> "+ sonuc1); } }
>, <, >=, <= operatleri: Bu operatrler de ift tarafl alrlar ve eer sa sol deerleri gereklenirse true aksi taktirde false deerini retirler. rnein: 3>5 //false
16
() Tr Dntrme Operatr u ana kadar rendiimiz kadaryla belli bir tre ilikin deerleri ayn trden deikenler ierisinde saklyor ve kullanabiliyorduk. Ancak baz durumlarda farkl trlerin birbirleriyle ileme girmeleri ve bir tre ilikin bir deerin ayn olmayan trde bir deikene atanmas gibi ilemler gerekebilir. te bu gibi durumlarda bir tr dnm sz konusu olabilir. Tr dnmleri de belirli kurallar dahilinde ve belirli bir hiyerari ile olmaktadr. Tr dnmleri srasnda bazen bilgi kaybnn da olabileceini unutmamak gerekir. Bunun nedenin her trn ifade ettii bilginin snrlarnn ve hafzada kaplad alann farkl olmasndan kaynaklandn hatrlaynz. Aada bilgi legal olan tr dnmleri zetlenmektedir: byte -> short (bilgi kayb yok) short -> int (bilgi kayb yok) char -> int (bilgi kayb yok) int -> long, double (bilgi kayb yok), float (bilgi kayb olabilir) long -> float, double (bilgi kayb olabilir) float -> double (bilgi kayb yok) Bilgi kayb, dnmlerde hedef veri tipinin snrlarnn dar olmasndan kaynaklanr. Mesela int n = 123456789; float f = n; //f in degeri 1.2345692E8 olur.
Yukardaki dnler otomatik olarak gerekleen dnmlerdir. Ancak kastl olarak da tr dnm [Link] deerin trn dntrmek iin deerin soluna parantez ierisinde deitirmek istediiniz trn adn yazmanz gerekir.
public class AnaSinif{ public static void main(String arg[]){ double k = 12.96; [Link]("k nin deeri: "+ k); int c; c = (int)k; //burada double trnden bir deer int trnden bir degiskene atanyor. [Link]("c nin degeri: "+c); } }
Bu rnekte grdmz gibi k deikeninin ierisindeki deer c deikenine atand iin c nin deerinin de 12.96 olmasn beklerdik. Ancak atama srasnda ( ) operatr ile bir tr dnm yaptk ve bilgi kaybndan dolay c nin deeri 12 oldu. nk int trnden bir deiken virglden sonra deer alamaz.
Tr Dnmlerine likin zel Metodlar Tr dnmlerini ( ) operatr ile yapabileceimiz gibi bu i iin yazlm baz zel metodlar da kullanabiliriz. Mesela String olarak verilmi olan 12 deerini 12 says gibi kullanamayz. nk bu deer ift trnak ierisinde
17
verilmitir ve bir String'dir. Yani siz bu deerle bir sayy toplamaya kalkarsanz sonu da otomatik tr dnmnden dolay bir String olacaktr. u rnee dikkat edelim:
public class AnaSinif{ public static void main(String arg[]){ String a = "12"; int b = 13; String c = a + b; [Link]("Sonuc: "+c); } }
Grdnz gibi java a+b ileminin sonucunu bir String tr olarak belirlemek konusunda bizi zorlamaktadr. Sonucu string olarak hesapladmzda da bu sefer cevap 25 olmas gerekirken 1213 tr. Aslnda bu sonu bir say deil bir Stringdir. Yani bir grntdr. O halde say gibi verilmi bir Stringi nasl sayya evireceiz? Bunun iin kullanlacak metod Integer isimli bir snfn parseInt() isimli metodudur. Mesela kullancdan [Link]() metodu ile yan isteylelim ve girdii ya ile 3 saysn arpp sonucu bulalm. Ancak biliyoruz ki bu ekilde alnan giriler say olarak deil String olarak alglanyorlar. O halde bu String'i de [Link]() metodu yardmyla int trne dntrelim: import [Link].*; public class AnaSinif{ public static void main(String arg[]){ String yas = [Link](null, "Yasinizi giriniz: "); int sonuc = [Link](yas) * 3; [Link](null, "Hesap sonucu: "+sonuc); } }
Buna benzer dier metodlar: [Link](12); --> parantez ierisinde verilen int trn String'e evirir. [Link](12); --> parantez ierisinde verilen int trn double trne evirir. [Link](12.45); --> parantez ierisinde verilen double trn String'e evirir. Bunlar gibi daha birok metod vardr. Bunlarn kullanm yeri geldike dkmantasyon yardmyla renilebilir.
Stringler Daha nce szdizimi olarak da bahsettiimiz bu tr aslnda bir karakter dizisidir. Stringler ift trnak ierisinde yazlr ve kendilerine ait bir takm zel metodlara sahiptir. Bu bakmdan dier trlerden biraz daha farkldr. Burada istenen, Stringlerin metodlara sahip olduu kavramn vurgulamak ve gerektike bu metodlar kullanabileceimizi gstermektir. Bu amala btn metodlar burada anlatlmayacaktr: [Link] Deikeni Bu deiken bir stringin ka karakterden olutuunu yani uzunluunu verir. [Link](diger string) Metodu ki String trne ilikin deerlerin eitliini saysal deerlerde kulandmz == operatr ile kontrol edemeyiz. Bunun yerine [Link] metodunu kullanrz. Bu metod, kendisine parametre olarak verilen diger string deeri eer string degerine eitse true, degilse false degerini retir. [Link](diger string) Metodu:
18
Bu metod kendisine parametre olarak verilen diger string ile string deerini kyaslar. Eer iki string eitse metod 0 deerini, string bykse 1 deerini, dier string bykse de -1 deerini retir. import [Link].*; public class AnaSinif{ public static void main(String arg[]){ String isim = [Link](null, "Lutfen adnizi giriniz"); int uzunluk = [Link]; String mesaj = "Isminiz "+uzunluk+" tane karakterden olumaktadir"; [Link](null, mesaj); String gercekSifre = "kkVVuuNN"; String girilenSifre = [Link](null, "Sifreyi giriniz: "); boolean sonuc = [Link](girilenSifre); [Link](null, "Girdiiniz sifre: "+sonuc); } } Yukardaki rnekte, JOptionPane snfnn showInputDialog() isimli metodu yardmyla kullancnn klavyeden girdii string, isim deikenine atlmakta ve daha sonra da girilen bu stringin uzunluu ntanml [Link] deikeni ile alnp uzunluk deikenine atanmaktadr. Biz aslnda length isminde bir deiken yaratmadmz halde, yukarda anlatld gibi isim deikeni aslnda bir String olduu iin, kendi bnyesinde otomatik olarak bu length deikenini ve dier String metodlarn barndrmaktadr. Nitekim rnekte de grdmz gibi; gercekSifre isimli String deikeni ile equals isimli ntanml metodu kullanarak, iki stringi birbirleriyle kyaslayabilmekteyiz. Vazgeilmez Kaynanz: Java Dkmantasyonu! Daha nce de sk sk Java'da bir ok snfn kullanm amac ile daha nceden yazlm olduuna ve bu snflarn ierisinde de, kullanabileceimiz bir ok deiken ve metod olduuna deinmitik. Hangi snflarn ne ie yaradklarn, ve ilerinde hangi metod ve deiken barndrdklarn ve bunlar nasl kullanabileceimizi ezbere bilmek imkanszdr. te bu yzden, her java programcsnn vazgeemeyecei java dkmantasyonunu kullanmak gerekir. Dkmantasyonu online olarak [Link] adresinde bulacanz ilk dersimizde sylemitik.
19
Bu sayfay atnzda karnza ereveden olumu bir ekran gelmektedir. Bu ekranda, sol st ksmda All Classes isimli balanty tkladnzda, sol at ksma Java'da ntanml tm snflar temsil eden balantlar yklenecektir. Hakknda bilgi almak istediiniz snf ismini bulup zerine tkladnzda da sadaki ksma bu snf hakkndaki tm metodlar, deikenler ve bilgiler gelecektir. Resim 7'de ok sk kullandmz JOptionPane isimli snfn showMessageDialog isimli metoduna ilikin blm grmekteyiz. Bu dkmantasyonu online olarak grntleyebileceiniz gibi, bilgisayarnza indirip offline olarak da kullanabilirsiniz. Bu ilem iin [Link] sayfasndan dkmantasyonu indirebilir ve yine ayn sayfada bulacan kurulum talimatlar ile (Installation Instructions) sisteminize ykleyebilirsiniz.
20
Java ile Programlama Blm 3: Bundan nceki dersimizde Java programlama dilinde deikenlerin nasl kullanldklarn operatrleri ve vazgeilmez kaynanz olan Java Dkmantasyonu'nu nasl kullanacamz renmitik. Bu saymzda ii biraz daha ileri gtrecek ve program akn kendi isteimiz dorultusunda ynlendirebileceimiz deyimler ve dngleri reneceiz. Yeni bir dil renmenin en zor yan, dilin temel kurallarn renme aamasnn olduka you ve skc gemesidir. Bunun nedeni de renme aamasnda snrl bilgiyle henz ele avuca sar uygulamalar gelitiremiyor olmamzdr. Sizlerin de u aamada ayn sknty ektiinizi tahmin ederek, motivasyonunuzu artrmak amacyla java ierisinde yer alan demolar gstermek istiyorum. Az sonra nasl altrabileceinizi anlatacam bu uygulamalar inceleyerek, ileride varacanz noktay grme ansna sahip olacaksnz: Okumaktan Sklanlar in Demolar sdk ana dizini ierisinde bulunan demo isimli dizinde bulunmaktadr. Sdk ana dizininiz sizin java'y ilk yklediiniz yerdir ve ismi de muhtemelen j2sdk.1.3.1 ya da j2dk1.4.2 eklinde olacaktr. Benim linux sistemimde ana dizinin tam yolu: /opt/j2sdk_nb/j2sdk1.4.2/ eklindedir. Buradaki demo isimli dizinin iinde de, jfc ve onunda iin de [Link] adndaki uygulamay nce jfc dizini ierisine girerek u ekilde altrabilirsiniz: java -jar [Link] Bu uygulamay dilediiniz gibi kartrabilir hatta j2sdk dizini ierisindeki demo dizinin ve altndaki dier tm uygulamalar da inceleyebilirsiniz.
Java'da Deyim ve Dngler: Program yazarken, yazdmz kodlarn yukardan aaya doru srasyla altrldn biliyoruz. Ancak bazen bu kodlarn bu srada deil de belirli artlara bal olarak birka satrn atlanp ileriden devam edilmesi ya da ayn satrlarn birden fazla sayda altrlmas gibi isteklerimiz olabilir. te bunun iin kullnacamz baz deyimler ve dngler vardr. Bu deyim ve dngler sayesinde normalde her satrdan bir defa geen ve yukardan balayarak aa satrlara doru ilerleyen program akn, baz satrlar belli durumlarda okumadan, ya da baz satrlar birden fazla defa okuyacak ekilde ynlendirmemiz mmkn hale gelir. Ancak bu deyim ve dnglerin daha iyi anlalmas asndan ncelikle faliyet alan kavramna deinmekte yarar var.
21
Faliyet Alan Nedir Ne e Yarar? Faliyet alan, yazdmz program ierisinde belirli blgeleri temsil eden ve nesnelerin etkin olduu snrlar belirleyen alanlardr. Bir nesnenin etkin olduu blgeye, o nesnenin faliyet alan denilmektedir. Faliyet alan kod ierisinde { ve } ile belirlenmektedir. Bu iki parantez arasnda mevcur bir faliyet alan vardr. Bir deiken eer { ve } arasnda tanmlanmsa bu deiken bu iki parantez dnda kullanlamaz. Buna gre deikenin faliyet alan da bu iki parantez ierisinde ya da yaratld alan ierisinde snrldr. /**** [Link] ****/ import [Link].*; class Main { public static void main(String[] args) { int k = 10; { int c = 20; [Link](null, "k nin degeri: "+k+ "\nc nin degeri: "+c); } [Link](0); } } /*******************/
Bu rnekte iki tane faliyet alan grmekteyiz. Birinci faliyet alan snfmzn kendisidir ve snf ad Main yazldktan hemen sonra { ile alm ve tm satrlardan sonra da } ile kapatlmtr. Bu faliyet alannn iinde de k deikeni tanmlandktan sonra yine { ile baka bir faliyet alan alm ve bu yeni faliyet alannda da sadece c deikeni yaratlmtr. Ancak dikkat ederseniz bu rnekte, snfn faliyet alan, ieride alan faliyet alann kapsamaktadr. Bu yzden k deikeni tanmlanmam olduu ierideki faliyet alan ierisinde de kullanlabilir. Ancak tersi mmkn deildir. Yani c deikenini k'nin tanml olduu faliyet alannda kullanmaya kalksaydk hata mesaj alacaktk. /**** [Link] ****/ import [Link].*; class Main2 { public static void main(String[] args) { int k = 10; { int c = 20; } [Link](null, "k nin degeri: "+k+ "\nc nin degeri: "+c); /*c degiskeni bu faliyet alannda tanml degildir*/ [Link](0); } } //bu program almayacaktr /*******************/
22
Faliyet alanna ilikin unutulmamas gereken bir ey daha vardr: Ayn faliyet alan ierisinde, ayn isimli birden fazla deiken tanmlanamaz. Bu rnekte k nn faliyet alan, c nin faliyet alann da kapsadndan, c nin tanmland yerde k adnda baka bir deiken daha tanmlayamazsnz. nk baka faliyet alan olsa da, ierideki faliyet alannda yukarda tanmlanan k deikeni hala geerlidir. Buna dikkat ediniz. Faliyet alanna ilikin bu bilgilerle artk deyim ve dngleri inceleyebiliriz. if Deyimi: if deyimi belli bir art salanmas durumunda program akn kendi faliyet alan ierisine ynlendirir. Kendi faliyet alannn en son satrna kadar kodlar altrr ve daha sonra da program ak if deyiminin faliyet alannn bittii yerden devam eder.
/***** [Link] ********/ import [Link].*; class Deyimler1 { public static void main(String[] args) { String notStr; int not; notStr = [Link](null, "Notunuzu giriniz: "); not = [Link](notStr); if(not > 50) { [Link](null, "Tebrikler. Bu dersten gectiniz :)");
23
} [Link](0); } } /**********************/ Daha teknik sylemek gerekirse, artn salanmas demek, aslnda if deyiminin kontrol parantezleri ierisindeki ifadenin true olmas demektir. (Bundan nceki sayda anlattmz, boolean tr ve boolean operatrleri konusunu hatrlaynz!). Ayn ekilde bu artn salanmamas ise ifadenin false deerini retmesi anlamna gelir. Yukardaki rnekte not > 50 ifadesi eer false olursa ekrana hi bir mesaj gelmeyecektir. Ancak true olursa Tebrikler. Bu dersten getiniz mesajn alrsnz. Burada girdiiniz notun aslnda bir String trnde olduunu ve bu deerin Integer snfnn parseInt metoduyla sonradan integer trne dntrlp kullanldna dikkat ediniz. (Bundan nceki sayda yer alan Tr Dnmlerine likin zel Metodlar konusunu hatrlaynz.) Peki ya eer kullanc notu 50'den kk olsa da bir mesaj almak istiyorsa ne yapacak. te bu durumda ..... if(ifade) { .... } else { .... } kalbn kullanmak gerekecektir. Bu kalba gre program ak, eer if ierisindeki ifade true ise if deyiminin, deilse else deyiminin faliyet alan ierisine ynlencektir. Az nceki rnei genelletirelim: /***** [Link] ********/ import [Link].*; class Deyimler2 { public static void main(String[] args) { String gectiMesaji = Tebrikler! Bu dersten gectiniz!; String kaldiMesaji = Malesef bu dersten kaldiniz.; String notStr; int not; notStr = [Link](null, "Notunuzu giriniz: "); not = [Link](notStr); if(not > 50) { [Link](null, gectiMesaji); } else { [Link](null, kaldiMesaji); } [Link](0); } } /**********************/ Aktif olarak projelerde altnz zaman kullanc isteklerinin bitmediini greceksiniz :) Diyelim ki bu sefer de kullanc programa girdii nota gre bir harf ile derecesini renmek istiyor olsun. Bu durumda girilen not belli aralklara gre belli dereceler alacaktr ve bu dereceler 2 taneden fazla olabilir. O zaman da if else kalb ie yaramayacaktr. Bu durumlarda if, else if, else if, .... , else kalbn kullanmak gerekir. rnei inceleyiniz:
24
/****** [Link] ******/ import [Link].*; class Deyimler3 { public static void main(String[] args) { String kaldiMesaji = "Dereceniz F: Bu dersten kaldiniz."; String yanlisNot = "Yanlis not girisi! Tekrar deneyiniz."; String notStr; int not; notStr = [Link](null, "Notunuzu giriniz: "); not = [Link](notStr); if(not > 100 || not < 0) { [Link](null, yanlisNot ); } else if(not <= 100 && not > 86) { [Link](null, "Dereceniz: A"); } else if(not <= 85 && not > 71) { [Link](null, "Dereceniz: B"); } else if(not <= 70 && not > 66 ) { [Link](null, "Dereceniz: C"); } else if(not <= 65 && not > 50) { [Link](null, "Dereceniz: D"); } else { [Link](null, kaldiMesaji); } [Link](0); } } while Dngs: Kullanc istekleri hala bitmiyor :) imdi de kullancmz bizden program altnda srekli notu sormasn ve buna karlk den dereceyi bize vermesini istiyor. Ne zaman ki giri Q karakteri olur, o zaman program sonlansn diyor. Bu durumda not girii bir dng ierisine sokulmaldr. Bu dngnn en banda nce giriin Q olup olmadna baklmal sonra ya dng tekrar dnmeli ya da sonlandrlmaldr. Bunun iin en uygun dng while dngs olacaktr. while, eer ierisindeki ifade true ise program akn kendi iine ynlendirir. Program while faliyet alannn en sonuna geldiinde tekrar while dngsnn ilk satrna dner ve ifadeyi yine kontrol eder. Bu ilem, while ierisindeki ifade false olana kadar devam eder.
25
Not: Bu tr dnglerde, eer dngnn faliyet alan ierisindeyken, while ierisideki ifadeyi deitirecek bir komut yazmazsanz, ilk durumda bu ifade hep true olduu iin ve dng iinde de hi deimedii iin sonsuz bir dngye girersiniz. while(ifade) { satir 1 satir 2 ... satir n /*Simdi akis tekrar while(ifade) satirina ynlenecek ve kontrol yaplacaktr. eer ifade false olmussa program ak satir n+1 den devam etmektedir.*/ } satir n+1
26
if (not > 100) { [Link](null, yanlisNot); } else if (not <= 100 && not > 86) { [Link](null, "Not: " + not + " Derece: A"); } else if (not <= 85 && not > 71) { [Link](null, "Not: " + not + " Derece: B"); } else if (not <= 70 && not > 66) { [Link](null, "Not: " + not + " Derece: C"); } else if (not <= 65 && not > 50) { [Link](null, "Not: " + not + " Derece: D"); } else { [Link](null, "Not: " + not + " Derece: F"); } notStr = [Link](null, giris ); not = [Link](notStr); } [Link](null, "Program Sonlandi."); [Link](0); } } /**************************/ break Anahtar Szc: Bazen bir dng ierisindeyken, aslnda dngnn bitmesine neden olacak art salanmad halde zel olarak dngy sonlandrmak istediimiz durumlar doacaktr. Bu durumlarn salanmas neticesinde program break komutunu grd yerde ierisinde bulunduu ilk dngy (nk i ie dngler de olabilir) sonlandracak ve dngden sonraki satrdan itibaren almaya balayacaktr. /**** [Link] ****/ import [Link].*; public class Sifre { public static void main(String arg[]) { String kontrol_isim = "elvantasbas"; String k_adi = [Link](null, "Lutfen kullanici adini giriniz:"); boolean x_flag = false; while(!k_adi.equals(kontrol_isim)) { if(k_adi.equals("x")) { [Link](null, "Islem sonland?r?l?yor.."); x_flag = true; break; } k_adi = [Link](null, "Girdiginiz isim yanlis. Tekrar
27
giriniz:"); } if(x_flag) { [Link](null, "Hoscakalin"); } else { [Link](null, "Merhaba "+k_adi); } [Link](0); } } /********************************/ Programda while parantezi ierisinde yazl olan while(!k_adi.equals(kontrol_isim) komutuna gre eer k_adi kontrol_isim'e eit olursa k_adi.equals(kontrol_isim) metodu true deerini retecektir. Ancak bu metodun banda yazl olan ! operatr bu deerin deilini alacak ve false deeri retecektir. Demek ki kullanc ad doru girilmedii srece bu while parantezi ierisinde true deeri olacak, doru girldii zaman ise false deeri olacak ve dolays ile while blouna girilmeyecektir. Bu rnekte kullanc, kullanc adn yanl girdii ama x girmedii srece while dngs bloklarnda kullancdan tekrar isim girmesi istenecektir. sim yanl girildiinde ve x girildiinde program while ierisindeki if blouna girecek ve burada ilem sonlandrlyor mesaj ile dngden break sayesinde kacaktr. Dngden kmadan hemen nce x_flag deikeninin deeri de true yapacaktr. Bu deiken dngden x ile klp klmad bilgisini tutmak iin kullanlan bir ara deikendir. Dngden kldktan sonra eer x deikeninin deeri true ise while bloklar bitimindeki if bloklarna girilecek ve ekrana hoakaln mesaj yazlacaktr. Eer dngden x yazld iin deil de kullanc ad doru girildii iin klm ise x deikenin deeri false kaldd iin if blouna girilmeyecek onun yerine else blouna girilecektir. Buradaki mesaj ekrana geldikten sonra else bloundan da klacak ve [Link](0) metodu altrlarak program sonlandrlacaktr. for Dngleri: u ana kadar bir koul saland srece otomatik olarak dngye girilmesini while deyimi ile yapabileceimizi grdk. Ancak bu dng koul saland srece, belli bir tekrar says kadar deil her zaman devam ediyordu. Koul salansa bile belirli bir tekrar says da belirlemek istiyorsak o zaman for dngsn kullanmak gerekir. for dngs yle almaktadr: for( <ilk deger> ; <kosul> ; <ifade> ) {
... }
Buna gre ilk deer ile balayan dng ile program for blouna girdikten sonra bloun sonuna geldiinde koulun salanp salanmadn kontrol edecek ve koul salanyorsa ifade yi gerekleyip tekrar dngye girecektir. rnein: /**** [Link] ****/ public class ForDongusu { public static void main(String arg[]){ for(int i = 0; i < 10; i++) { [Link]("i nin degeri: "+i); } } } /***********************/
28
Bu program altnda ekrana 10 satr boyunca i nin degeri: 0 i nin degeri: 1 ... i nin degeri: 9 yazacaktr. Program ak her dngye giriinde i nin deeri ekrana yazlmakta ve blok sonunda i++ ifadesinden dolay bu deer bir artrlmakta ve koulun salanp salanmadna baklmaktadr. switch Deyimi: switch deyimi kullanm da, birden fazla else if kullanmna alternatiftir. Mesela yazdnz programda kullancdan bir giri isteyebilirsiziniz. Kullancnn girecei bu deer 4 tane deerden birtanesi olabilir ve siz olas her deer iin bir ilem yapmak istiyor olabilirsiniz. Bunun iin if(deger 1) { } else if(deger 2) { } ... else { } yapsn kullanabilirsiniz. Ancak byle durumlarda switch daha iyi bir alternatif olacaktr. switch deyimi de yle almaktadr: switch( <degisken> ) { case deger1: ifade ya da islemler; break; case deger2: ifade ya da islemler; break; ... ... case deger n: ifade ya da islemler; break; default: ifade ya da ilemler; break;
}
Bu yapya gre program ak, degisken iindeki deere gre case anahtar szc ile belirlenmi uygun satra atlar. O satudaki ifade ya da ilemler gerekletirilikten sonra switch deyiminden klr. Aadaki rnek programmzda kullancya bir men sunalm ve bu menden bir seenei semesini isteyelim. Bu seim neticesinde de seime uygun bir mesajn ekrana gelmesini salayalm. rneimizde ilk bata yaratlan secim_flag adndaki boolean deiken ilk deer olarak true olduu iin, program aknn ilk seferde while dngsne gireceini garanti etmi oluyoruz. Eer kullanc listede olmayan bir seim girecek olursa, secim_flag deikeni tekrar true deerini alacak ve kullancdan tekrar bir giri yapmas istenecektir. Kullanc listede olan bir giri yaparsa program sonlanacaktr. Bu durumda listede olmayan girler girldii srece program almaya devam edecektir.
29
/**** [Link] ****/ import [Link].*; public class Menu { public static void main(String arg[]){ boolean secim_flag = true; while(secim_flag) { String secim = [Link](null, "Bir sayi giriniz: (1, 2, 3, 4)"); int sayi = [Link](secim); secim_flag = false; switch(sayi) { case 1: [Link](null, break; case 2: [Link](null, break; case 3: [Link](null, break; case 4: [Link](null, break; default: secim_flag = true; [Link](null, girdiniz"); break; } } [Link](0); } } /****************************/ continue Anahtar Szc Herhangi bir dng ierisine girildinde, daha dng blounun sonuna gelinmeden o andaki adm iin ilemleri sonlandrp bir sonraki dng admna hemen geilmek isteniyorsa continue anahtar szcn kullanmak gerekir. Mesela yazdmz programda 1'den 10'a kadar olan saylar toplamak istiyoruz ama bu toplam ierisine 3 ve n katlarn eklemek istemiyoruz. Bunun iin bir for dngs kullanmak gerekir. Ancak bu dngy 3 ve 3'n katlarna gelindiinde durdurup bir sonraki deerle dngye devam etmek gerekmektedir: /**** [Link] ****/ public class Toplama { public static void main(String arg[]){ int toplam = 0; for(int i = 0; i < 10; i++) { if(i % 3 == 0) { continue; }
"Sectiginiz sayi: bir"); "Sectiginiz sayi: iki"); "Sectiginiz sayi: uc"); "Sectiginiz sayi: dort");
30
Bu rnekte % operatrn kullandk. Bu operatr soldaki saynn sadaki sayya blmnden kalan deeri retir. Yani i says o anda hangi deere sahipse, bu deerin 3'e blmnden kalan saynn 0'a eit olup olmad kontrol edilmektedir. Eer bu kalan say 0'a eit ise demek ki saymz ^ya da 'n bir katdr. Bu yzden if parantezi ierisindeki == kontrol salandndan dolay true deeri retilecek ve dolays ile if blou ierisine girilecektir. If blou ierisinde continue anahtar szc sayesinde o andaki for adm sonlanacak ve bir sonraki i deeri ile for blounun en bana dnlecektir.
Diziler Bu ana kadar programla ierisinde kullanacamz deikenler olduunu ve bu deikenlerin de belirli trelere sahip olduklarn grmtk. Ancak biliyoruz ki her deiken sadece bir deer tutmaktadr. erisinde deer tutan bu deikenler de bellekte farkl yerlerde saklanmaktadr. Dizi denilen deikenler ise ilerinde birden fazla deer tutarlar ve dier deikenler gibi belirli bir tre sahiplerdir. Ayrca bu deerler de bellekte ardl biimde saklanrlar ve hepsi ayn tre ilikin olmak zorundadr. Buna gre bir diziyi aslnda arka arkaya sralanm bir deiken paketi olarak dnebiliriz. Ancak unu unutmamalyz: Dizilerin ilerinde tutacaklar eleman says sahiptir. Baz elemanlara siz deer vermesseniz bile bu elemanlar iin bellekte yer ayrlr. Ayrca dizinin ierisinde saklanan deerlerin tr ile dizinin tr ayn olmak zorundadr. Dizilerin Yaratlmas: Normalde deikenleri yaratrken deikenin trn ve sonra da adn yazyorduk. (int b; ya da double a; gibi) Dizilerin yaratlmas ise biraz daha farkldr. Bir dizinin yaratlmas iki admdan oluur. Birinci adm bildirim dediimiz ve dizinin trn ve dizi deikeninin adn belirlediimiz admdr: int [] sayilar;
Burada sayilar adinda ve ierisinde integer deerler tutacak olan bir dizi bildirimi yapm olduk. Ancak bu dizi bildiriminin deiken bildiriminden farknn [ ] karakterlerinin eklenmesi eklinde olduuna dikkat ediniz. kinci adm ise tahsisat denilen ve dizi deikenin ka tane deer tutacan belirlediimiz admdr: sayilar = new int[10]; Bu rnekte, daha nce bildirimini yaptmz sayilar dizisine 10 tane integer say tutabilecek kadar alan tahsis etmi olduk. Bu ilem aslnda new anahtar szc sayesinde yaplm oldu. Ancak, bu admdan sonra dizi deikenimiz belirlenmi ve deerleri saklayabilecei alan tahsis edilmi olsa bile, dizimizin ierisinde hala hi bir deer saklanmamaktadr. Dizilerin ierisinde elemanlara erimek ve yeni elemanlar eklemek iin indeks numaras denilen bir kavram kullanlmaktadr. Indeks operatr [ ] ile gsterilir ve dizinin adnn yanna ekleneek kullanlr. Bir dizinin ilk elemann indeks numaras 0 dr. Buna gre dizimize deer atamak iin: sayilar[9] = 12; sayilar[0] = 3;
31
eklinde [ ] ve bir indeks numaras kullanlarak atama yaplabilir. NOT: Burada dikkat edilmesi gereken ey, dizimizin uzunluundan daha fazla eleman atamas yapmamaktr. Bu rneimize gre sayilar dizisinin son elemanna sayilar[9] ile eriebiliriz. Sayilar[10] = 23; hatal bir atama olacaktr nk 10 nolu indekste 11. eleman olur. Ancak dizimiz sadece 10 eleman tutacak alan tahsis edilmiti! imdi kullancdan gelecek olan isimleri bir dizide saklayan bir program yazalm: /**** [Link] ****/ 1 import [Link].*; 2 3 public class Kayit { 4 public static void main(String arg[]){ 5 6 String kayit_str = [Link](null, "Kac tane kayit gireceksiniz:"); 7 String cikisMesaji = "Hernagi bir anda cikmak icin " 8 int kayit = [Link](kayit_str); 9 10 String isimler[] = new String[kayit]; 11 for(int i = 0; i < [Link]; i++) { 12 int sayi = i+1; 13 String giris = [Link](null, sayi + ". kaydi giriniz:"); 14 if([Link](X)) 15 break; 16 else 17 isimler[i] = giris; 18 } 19 20 String mesaj = "isim Listesi\n********"; 21 22 for(int i = 0; i < [Link]; i++) { 23 if(isimler[i] != null) 24 mesaj += "\n"+i+" --> "+isimler[i]; 25 } 26 27 [Link](null, mesaj); 28 [Link](0); 29 } 30 } /******************/ Bu programda nce kullancnn ka kayt girecei sorulmaktadr. nk dizilerin uzunluu sabittir ve nceden bir defa yer ayrldndan bu uzunluk bilinmelidir. Uzunluu deien dizileri iin baka algoritmik zmler vardr ancak deimeyen er bir dizinin uzunluu sabittir ve sonradan uzatlp ksaltlamaz. Bu rnekte kullancnn girecei kayt kadar yer tahsisati yapldktan sonra for dngs ile her admda girilecek olan kayt istenmekte ve diziye atlmaktadr. Eer kullanc bata belirledii kadar kayt girmekten vazgeip o anda ilemi sonlandrmak isterse isim yerine X girii yapabilecektir. Programda her giri yapldktan sonra bu deerin X olup olmadna baklmaktadr (14. satr). Eer giri X olursa dng break ile sonladrlr (15. satr). Deilse giri diziye yazlr ve dng devam eder (16. satr). NOT: String trnde diziler iin tahsis edilen yerlerin iine birey doldurulmaz ise, bu yerler otomatik olarak null denilen zel bir deerle doldurulur. null deeri , gibi bo bir String ya da 0 deildir. Kendi bana anlamldr. Bu dng bittikten sonra yeni bir for dngs ile de diziden her kayt tek tek okunmakta (22. satr) ve mesaj adndaki String deikeni ierisine atlmaktadr (24. satr). Daha sonra bu mesaj isimli deiken ekrana yazlacaktr
32
(27. satr). Eer kullanc diziye ayrlan yer kadar kayt girmeyip arada X ile k yapmsa, bu durumda diziye girilmemi olan elemanlar yerine null deeri olacaktr. Bu deerler varsa mesaj ierisine eklenmemektedir. Bu yzden o andaki admda, diziden gelen deerin null olup olmad kontrol edilmekte, deer null deilse mesaj deikeninine eklenmektedir (23. satr).
Dizilere ilikin temel bilgileri renmeyi burada sonandryoruz. Siz de kendi yeteneklerinizi snamak icin dier dersimize kadar tm rendiklerinizi kullanarak aadaki uygulamay yapmaya alnz. Bu uygulamann cevabn dier dersimiz ierisinde bulabileceksiniz :
Dizi Yaratma ekilleri 1) int a[]; a = new int[3]; a[0] = 1, a[1] = 2, a[2] = 3; int a[] = {12, 3, 6, 7} new int[] {1,4,5,6}
2) 3)
33
Java ile Programlama: Blm 4: Dersimize son dersimizde verdiimiz uygulamann zm ile balayacaz. Uygulamamz tekrar hatrlatalm: Uygulama: Kendi banza ierisinde isimler saklayan bir dizi yaratnz ve daha sonra bu dizide kullancdan aldnz bir ismi aratnz. Eer isim dizinin ierisinde bulunursa bu ismin indeks numarasn ekrana yazdrnz. Bulunamazsa ismin bulunamadna dair bir mesaj yazdrnz. import [Link].*; import [Link].*; public class Ara { public static void main(String arg[]) { String []isimler = {"Hakan Aykac", "Murat Akar", "Cenk Gndz", "Cem Daggeen"}; String aranacak = [Link](null, "Aradiginiz ismi giriniz: "); int index = -1; for(int i = 0; i < [Link]; i++) { if(isimler[i].equals(aranacak)) { index = i; break; } } if(index == -1) [Link](null, aranacak+" ismi dizide mevcut degildir."); else [Link](null, aranacak+" isminin index numarasi: "+index); [Link](0); } }
Metod Kavram ve Javada Metodlar Daha nce baz noktalarda metodlara deinmitik. Metod denilen kavramn, program ierisinde yazlm kk program paralar olduunu syleyebiliriz. Metodlar aslnda nceden tanmlanm birtakm ilem ekilleridir. Bu ekilde grevleri metodlar attnda oluturarak gerektiinde arabiliriz. Bunu yle bir rnekle hayalimizde canlandralm: Yazm olduumuz programmz bir robota benzetelim. Bu robota eitli grevler ykleyelim. Bunlardan bir tanesi de su getir grevi olsun. Bu grev u ekilde tanmlansn: Mutfaa git Bardaa su doldur Su dolu barda sahibine getir te siz her su isteme ilemi iin bu komutu robota vermek yerine, sadece 1 defa su getir grevini tanmlayabilirsiniz. Daha sonra da su istediinizde, sadece bu grevi robota vermeniz, bu komutun altrlmas iin yeterli olacaktr. Sonuta, Javada da metodlar bu ekilde birden fazla komutu tek seferde ve istenildii zaman altrabilmek amacyla tasarlanr.
34
Aadaki rnekte ([Link]), ekrana sadece Merhaba yazan bir metod gsterilmektedir:
[Link] rneinde de grld gibi MesajGoster isimli metod, main metodunun bittii yerde yaratlmtr. Ancak bu metodun da tpk main metodu gibi snfn ierisinde yaratldna dikkat ediniz. Metodun yaratlmas srasnda ilk satrda public static void MesajGoster() eklinde metodun ad ve daha sonra da { } parantezleri ierisinde bu metodun gerekletirecei komutlar yazlmaktadr. Metodun adn yazdmz bu ilk satra metod bildirimi denilir. Metod bildirimine ilikin ayrntlar bilgilerimiz arttka tamamlayacaz. Not: Metodlar isimlendirirken boluk braklmaz. (Mesaj Goster geersiz ancak Mesaj_Goster gecerli bir metod ismidir) Not: Main metodu ve snf kavramlarna sonraki derslerimizde deineceiz. Metodlarn arlmas imdi bu [Link] dosyasn altrmaya kalktmzda, dosyann dzgn bir ekilde altn ancak ekranda hi bir mesaj yazlmadn greceksiniz. Sakn armayn! Byle olmas ok normal. Bir metod yazld zaman bu onun ayn zamanda alaca anlamna gelmez. Metodun almas iin sizin onu armanz gerekmektedir. Bunu robota su getir emrini vermenize benzetebiliriz. Siz bu emri daha nce tantm olsanz bile, emri vermeden robot size su getirmez. Ayn ekilde yazlm bir metodun almas iin de metodun program aknn olduu yerde arlm olmas gerekir. Bir metodu armak iin metodun yaratld ekilde adn ve adn yanna da ( ) parantezlerini eklememiz gerekir: ... MesajGoster(); ... gibi... O halde rneimizde de metodun almasn grmek iin main metodu ierisinde MesajGoster isimli metodumuzu aralm:
35
Programmz ilk altrldnda her zaman main metodu otomatik olarak arlr Daha sonra main metodu ierisinde yazlan her satrdaki komutlar srasyla altrlr. Program ak MesajGoster(); eklinde yazlm olan metod arma komutuna geldiinde MesajGoster metodunun yazld yere atlar ve buradaki komutlar srasyla altrrarak tekrar main metodunda kald yerden almaya devam eder. Tabi ki metod ismi MesajGoster den baka bir isim de olabilir. Sadece buradaki rnekte bir metod yazlm ve ad yle konulmutur. Bu ak prensibi her metod iin geerlidir.
imdi ilerimizi daha da genelletirelim ve ekrana sadece Merhaba deil de, istediimiz bir mesaj gnderen bir metod oluturalm. Aslnda bu ii zaten JOptionPane snfnn showMessageDialog isimli metodu ile yapabiliyorduk. Ancak bu metodun ad ok uzun olmakla beraber program ierisinde birden fazla yerde ardmzda ok fazla yer kapladn grmekteyiz. Bu yzden ayn ii yapan ve ad sadece M olan bir metod yazalm. Ancak bu metoda her seferinde hangi mesaj yazacan da gndermemiz gerekecektir. nk her seferinde ekrana baka bir mesaj yazlmasn isteyebiliriz. te bu noktada karmza parametre kavram kar. Metodlarn Parametreler ile Kullanm Parametreler yardmyla metodlara birtakm deikenler gndermemiz mmkndr. nceki rneklerimizde MesajGoster isimli rnek metodumuzu parametresiz olarak kullandk. Aadaki rnekte M isimli metod parametre ile alan bir metod olup, ekrana, kendisine parametre olarak gnderilen mesaj basmaktadr.
36
Burada dikkat edilirse 6. satrda arlan M metodu 10. satrda parametre ile bildirilmitir. Metod bildiriminde parametreler metodun ( ) parantezleri arasnda nce tr ad ve daha sonra da parametre ad yazlarak ve birden fazla parametre arasnda da virgul kullanlarak tantlabilir. Yani: public static void Metod_Adi(<tr> parmaetre1, <tr> parametre2) { ... } eklinde bildirimi genellemek mmkndr. rnein: public static void M(String mesaj): Sadece String trnde bir parametre alan ve bu parametreyi metod ierisinde mesaj ile temsil eden bir metod bildirimi. public static void Metod2(int x, double y): Ad x olan ve int trnde bir parametre ile ad y olan ve double trnde bir parametre alan ve kendi ad da Metod2 olan bir metodun bildirimi. Bu ekilde bildirimi yaplan bir metodu arken de metodun ad ve daha sonra da ( ) parantezleri ierisine bildirimde verilen srada ve trlerde deerle gndermemiz gerekir. Mesela M isimli rnek metodumuza her seferinde String trnde farkl mesajlar gnderebiliriz. Gnderilen b her String deeri, metod bildiriminde mesaj isimli deikene kopyalanr ve metodun ierisinde de bu deiken araclyla ele alnr. Mesela bildirimi public static void Islem(int sayi, String mesaj) eklinde yaplm olan bir metodu u ekillerde arabiliriz: Islem(6, Bugun hava guzel); Islem(12, ok almak lazm); Islem(4, Java renmek Lazm); ... Burada yaplan ey aslnda metodun arlmas neticesinde gnderilen deerler, metod bildirimi ile tanmlanan deikenlere srasyla kopyalanr (ya da atanr.) yle ki; Islem(6, Bugun hava guzel); eklinde metodu ardmzda 6 deeri sayi deikenine ve Bugn hava gzel deeri de mesaj deikenine atanr ve metod iinde bu ekilde kullanlr. Ancak Islem(Selam, 12); gibi bir arm geerli deildir. lem isimli metodun bildiriminde nce int trnde sonra da String trnde parametre yazlmtr. Metodu arrken de ayn sraya uymamz gerektiini unutmayalm.
37
NEML NOT: zetle, metodlar bildirirken metodun alaca parametreleri tr ve parametre isimlerini yazarak, metodlar arken de parametreler yerine deer gndererek ilem yapmaktayz. Bu iki ilemi birbirine kartrmamalyz.
Metodlarda Geri Dn Deeri Kavram Yukarda da anlattm gibi, metodlara birtakm parametreler gndererek baz ilemler yapmalarn salarz. Bu ilemler kendi ierisinde uygulanp tamamlanan ilemler olabilecei gibi, sonunda bir sonu retilen ilemler de olabilir. te sonuta elde edilen bu deerleri kullanabilmemiz iin, metodun bu deerleri bize geriye gndermesi gerekir. Metodlarn ilemlerinin tamamlamas neticesinde geriye gnderdikleri bu deere geri dn deeri denilmektedir. Aadaki rnekte parametre olarak bir emberin yarap deerini alan alanHesapla isimli metod, emberin alann hesaplayarak geriye bu deeri bize gndermektedir:
rnekte de grld gibi, 9. satrda kullancdan istenen yarap deeri 10. satrda metoda parametre olarak gnderilmektedir. Ama aslnda parametre olarak gnderilmeden hemen nce [Link]() metodu ile bu String trndeki yarap deeri double trne dntrlmekte ve dnm sonucu gelen deer alanHesapla isimli metoda parametre olarak gnderilmektedir. Gnderilen bu parametre, metod bildiriminde belirtilen yaricap isimli deikene aktarlmaktadr. NOT: Bu aktarm neticesinde, gelen parametre artk metod ierisinde yaricap ismiyle kullanlacaktr. Eer metod, 1'den fazla parametreli bir metod olsayd, bu durumda gnderilen parametre deerleri ayn sra ile, metod bildiriminde tanmlanan parametre deikenlerine aktarlacakt. Daha sonra alanHesapla metodu kendisine gelen bu parametre'nin, Math snfnn power metodu yardmyla karesini alarak 3.14 (pi says) ile arpmakta ve retilen sonucu da 17. satrda olduu gibi alan deikenine atamaktadr. NOT: [Link] metodu 1. parametre ile kuvveti alncak sayy, 2. parametre ile de bu saynn kanc kuvvetini alacan belirler. Geri dn deeri olarak da hesaplad sonucu gnderir. return Anahtar Szc [Link] rneinde, 18. satrda kullanlan return ifadesi, nndeki deiken deerini metodun arld yere gndermektedir. Bu durumda hesaplanan alan deeri, return ifadesi ile metodun arld 9. satra gnderilmektedir. Buraya geriye gnderilen deer de sonuc isimli deikene atanarak tutulmu olur.
38
Eer 9. satrda sonuc = alanHesapla( [Link](yrcp) ); ifadesi yerine sadece alanHesapla( [Link](yrcp) ); eklinde metodu arsaydk, metod ierisinden alan deeri gnderilecek, ancak bu deeri tutacak sonuc gibi bir deiken olmad iin geriye gelen deer boa gidecekti ve ele alnamayacakt. Bu rnekte dikkat edilmesi gereken bir dier konu da; geri dn deeri olan metodlarn bildirimlerinde void yerine bir tr ad yazlmas gerektiidir. rneimizde geriye gnderilen deerin tr double trnde bir deer olduu iin olduu iin, 16. satrda yaplan metod bildiriminde metod isiminden hemen nce geri dn deerinin trnn yazldn grmekteyiz. Fakat nceki rneklerimizde geri dn deeri olmayan metodlarda bu ksma void yazmtk. Dizilerin Metodlara Parametre Olarak Gnderilmesi Daha nce dizilerin ne amala yaratldklarn ve nasl kullanldklarn grmtk. Dersimizin bu ksmnda hem metod kullanmn biraz daha pekitirmek, hem de diziler zerinde pratik yapmak amacyla dizilerin metodlara aktarlmasn inceleyeceiz. Aadaki rnekte eitli isimlerden oluan bir diziyi alfabetikSirala isimli metoda gnderiyoruz. Bu metod kendisine parametre olarak kark srada isimlerden oluan bu diziyi alfabetik srada yeni bir dizi ierisinde oluturarak geriye de bu yeni diziyi gnderiyor. import [Link].*; import [Link]; import [Link]; class DiziSirala { public static void main(String[] args) { String liste[] = {"Evren Akar", "Ahmet Ayka", "Fatih Demir", "Ender Ukun"}; String gelenDizi[] = alfabetikSirala(liste); diziGoruntule(liste, "Orjinal Dizi"); diziGoruntule(gelenDizi, "Sirali Dizi"); [Link](0); } public static String[] alfabetikSirala(String [] dizi) { String sirali_dizi[] = new String[[Link]]; [Link](dizi, 0, sirali_dizi, 0, [Link]); [Link](sirali_dizi); return sirali_dizi; } public static void diziGoruntule(String []dizi, String dizi_adi) { String mesaj = dizi_adi+" Ierigi\n***************\n\n"; for(int i = 0; i < [Link]; i++) mesaj += "dizinin "+i+". elemani: "+dizi[i]+"\n"; [Link](null, mesaj); }
39
Diziler metodlara parametre olarak aktarlrken sadece isimlerinin aktarlmas yeterlidir. rneimizde 5. satirda yaratilan liste isimli dizimiz, 6. satrda metod arlmas srasnda, parantez ierisinde sadece ismi yazlarak alfabetikSirala isimli metoda aktarlmaktadr. Diziyi parametre olarak alan metod bildiriminde ise, parametre ksmnda gelecek olan dizinin tr, [ ] sembol ve bir parametre ad yazlmas gerekir. rneimizde yarattmz alfabetikSirala isimli metodun 12. satrdaki bildiriminde de, gelecek olan dizi parametresi dizi isimli deikene aktarlacaktr. Ancak bu deikenin de bir String dizisi deikeni olarak tanmlandna dikkat ediniz. alfabetikSirala isimli metoda gelen bu dizi, parametre aktarmndan dolay artk metod ierisinde dizi ismiyle kullanlacaktr. System snfnn arrayCopy isimli metodu, 1. parametre ile ald bir dizinin, 2. parametre ile ald indeksinden itibaren, 3. parametre ile ald dizinin, 4. parametre ile ald indeksine, 5. parametre ile ald sayda eleman kopyalar. Bu metod yardmyla, 14. satrda olduu gibi metod ierisinde dizi ismiyle tutulan orjinal dizimizin tm elemanlar, sirali_dizi ismiyle yarattmz diziye kopyalanmaktadr. Arrays isimli snfn sort isimli metodu, kendisine parametre olarak verilen bir diziyi sralamaktadr. Biz de rneimizde bu metodu kullanarak sirali_dizi ierisinde bir kopyasn aldmz dizi isimli dizimizi sralamaktayz.
Dizilerin Geri Dn Deeri Olarak Kullanlmas Bir diziyi geri dn deeri olarak gnderirken benzer ekilde return anahtar szc nnde dizinin isminin yazlmas yeterlidir. Ancak dikkat edilmesi gereken nemli nokta geriye gelen diziyi tutacak deikenin de bir dizi deikeni olmas gerektiidir. rneimizde 16. saturda yazlan return ifadesi ile yeni sral dizimizi 6 satrda metodu ardmz yere geri dn deeri olarak gndermekteyiz. 6. satra gelen bu yeni dizi gelenDizi isimli dizi deikenine aktarlmaktadr. rnekte 19. satrda yazm olduumuz diziGrntle isimli metod kendisine 1. parametre ile gnderilen bir dizinin 2. parametre ile gnderilen bal kullanarak ieriini grntlemektedir. Bu metod yardmyla orjinal ve sralanm dizilerimizin ieriklerini de grntlemkteyiz. Bu rnekler sayesinde metod ve dizi kullanmna ilikin teknikleri daha iyi anlayacanz umuyorum. Ders ierisinde verilen rnekleri mutlaka satr satr yazmanz neririm. Bylece hi farknda olmadan Java'da birok eyin pratik hale geldiini greceksiniz. imdi dizilere ilikin son bir rnekle metod ve dizilerin birlikte kullanmn toparlayalm.
import [Link].*; import [Link]; import [Link]; class HistogramSinifi { public static void main(String[] args) { int uzunluk = [Link]([Link](null, "Dizi uzunlugu ne olsun?")); String []liste = diziYarat(uzunluk); Histogram(liste); [Link](0);
40
} public static String[] diziYarat(int boyut) { String isimler[] = new String[boyut]; for(int i=0; i < [Link]; i++) isimler[i] = [Link](null, i+". ismi giriniz"); [Link](isimler); return isimler; } public static void Histogram(String dizi[]) { JTextArea cikisEkrani = new JTextArea(15, 15); String cikis = "isim \t uzunluk \n -------------------\n"; for(int i = 0; i < [Link]; i++) { cikis += dizi[i] + "\t"; for(int k = 0; k < dizi[i].length(); k++) cikis += "*"; cikis += "\n"; } [Link](cikis); [Link](null, cikisEkrani); } }
rneimizde 5. satrda JOptionPane isimli snfn showInputDialog isimli metodu, geri dn deeri olarak kullancnn girecei String bir deer gndermektedir ve bu deer de Integer snfnn parseInt isimli metodu ierisine parametre olarak verilerek integer bir sayya dntrlr. Dntrlen bu say da uzunluk isimli deikene atanr. Daha sonra 7. satrda liste ismiyle yaratlan dizimiz de, bu uzunluk deeri kadar olacaktr. Ama dikkat ederseniz bu sefer dizi yaratma ilemi bizim yazdmz diziYarat isimli metod ierisinde yaplmaktadr. 13. satrda tanmlanan diziYarat isimli metod kendisine parametre olarak verilen uzunlukta bir String dizisi yaratr. Daha sonra 16. satrda yazlan for dngs ile bu dizinin elemanlarn kullancdan alarak diziye yerletirir. Bu ilemi 17. satrda olduu gibi, for dngsnn her i admnda, kullancdan istedii giri deerini dizinin i. elemanna atayarak yapmaktadr. Daha sonra 19. satrda yaratlan ve ierisine isimler yerletirilen dizimiz Arrays isimli snfn sort isimli metodu ile sralanmaktadr. En son olarak da 20. satrda, yaratlan bu dizi return ifadesi ile metodun arld 7. satra gnderilir. Bu gnderme neticesinde de yaratlan ve sralan bu dizi, liste isimli dizi deikenine atanm olur. 8. saturda, Histogram isimli metod altrlmaktadr. Bu metod kendisine parametre olarak verilen bir dizinin her elemannn kendisini ve bu elemann karakter uzunluu kadar * simgesini ekrana basar. Metod bu ilemi yapmadan nce ilk olarak JTextArea denilen zel bir java nesnesi yaratmaktadr. Bu nesne 25. satrda yaratlmaktadr. Java nesneleri ve nesnelerin yaratlmas konusunu sonraki dersimizde ayrntl olarak greceiz. 26. satrda cikis isimli String deikeni de en son ekranda belirecek mesaj tutmak amacyla oluturulmaktadr. Ancak bu deiken ilk yaratldnda ii bo bir ekilde oluturulmaktadr. 28. satrdaki for dngs ile dizinin her eleman tek tek ele alnacaktr. 29. satrda, i. admdaki eleman ve bir tab boluk karakteri cikis deikenine yazlr. 30. satrdaki for dngs, i. admda ele alnan dizi elemannn her karakteri iin adm adm * iaretini yine cikis isimli deikene yazar. En son olarak da 33. satrda cikis isimli deikenin sonuna \n eklide alt satra geme karakteri eklenerek 28. satrdaki dngnn bir sonraki admna geer ve ayn ilemler dier dizi elemanlar iin de tekrarlanr. Tm dizi elemanlar bu ekilde ele alndktan sonra, 35. satrda olduu gibi cikisEkrani isimli nesnenin ierisinde yer alacak yaz, yine bu nesneye ait ntanml setText isimli metod yardmyla cikis isimli deikenin ierisinde saklanan deere set edilir. (Java'da nesnelerin ntanml metodlarn sonraki derslerimizde inceleyeceiz.) En son olarak da metod 36. satrda olduu ekilde bu nesneyi showMessageDialog isimli metoda vererek ekranda grnmesini salar.
41
Dikkat ederseniz daha nceki rneklerimizde [Link] isimli metoda hep bir mesaj yazyorduk. Ama bu sefer metoda, ierisinde yazlm bir String mesaj yerine, bir nesne gnderdik ve tm mesajmz da bu nesne ierisinde yazdk. Uygulama: Bir dizinin ierisindeki elemanlar sraya dizen static bir metod yaziniz ve main metodu icerisinde yazdiginiz bu metoda diziyi gondererek siralayiniz. UYGULAMA: Kendi banza ierisinde isimler saklayan bir dizi yaratnz ve daha sonra bu dizide kullancdan aldnz bir ismi aratnz. Eer isim dizinin ierisinde bulunursa bu ismin indeks numarasn ekrana yazdrnz. Bulunamazsa ismin bulunamadna dair bir mesaj yazdrnz. Dizilerin Kopyalanmasna likin NOT: Bir dizi yaratldktan ve ierii gncellendikten sonra bunu aynen baka bir diziye kopyalamak iin [Link] metodu kullanlr. Bu metodun kullanm: [Link](kaynak_dizi, baslama_noktasi, hedef_dizi, hedef_baslama_noktasi, kopyalancak_eleman_sayisi); eklindedir:
42
Java ile Programlama: Blm 5: nceki dersimizde hatrlarsanz Java'da metodlarn nasl kullanldn ve yaratldnu ayrntl olarak inceleyerek, devamnda da dizilerin metodlara parametre olarak gnderilmesine ilikin birtakm rnekler zerinde almtk. nceki derslerimizi iyice tekrar ettiinizi ve verilmi rnekleri de teker teker yazarak denediinizi umuyorum. Bilinen rnekleri bile sabrla yazmak inann ok ey retecektir. Bugnk dersimizde artk nesne ynelimli programcln en nemli kavram olan snflar inceleyeceiz. nmzdeki derslerin birou artk bu snflar kullanmak ve gelitirmek zerine olacak. Bu yzden burada basitletirerek anlatmaya altm bu temel kavramlar iyice anlamaya ve irdelemeye almanz neririm. Snf Kavram: Biliyoruz ki genel anlamda program yazabilmek iin eitli deikenler yaratp kullanyoruz. Yaratlan her deikenin bir tr olduunu ve yaratldktan sonra bu deikenlerin de artk birer nesne olduunu grmekteyiz. rnein "int a;" dediimizde a isimli deikeni ierisinde tamsaylar tutacak biimde, "double b; " dediimizde b isimli deikeni ierisinde virgll saylar tutabilecek ekilde ya da "String c[]; " dediimizde c isimli deikeni ierisinde String trnde deerler tutan bir dizi eklinde yaratm oluyoruz. Yani deikenleri bilinen nesne trlerinden birtanesi cinsinden yaratyoruz. te bugn reneceimiz ekilde, snflar yazarak nce yeni bir nesne tr yaratyor ve daha sonra da yaratm olduumuz bu "nesne tr cinsinden" snf deikenleri yaratarak bu snflar kullanabiliyoruz. Ya da bir bakasnn yaratm olduu bir snf trnden yeni bir deiken yaratabiliyor ve yine bu deikeni kullanabiliyoruz. Aslnda bundan nceki derslerde, nceden yaratlm baz snflar zaten kullanmtk. rnein "JOptionPane" isimli snfa ait "showMessageDialog" ya da "showInputDialog" gibi metodlar kullanrken aslnda JOptionPane isimli snf kullanm olduk. Snf Nedir? imdi biraz daha genel olarak snflarn ne olduundan bahsetmekte fayda var. Snf denilen ey aslnda birden fazla metod ve deikeni birarada tutan bir yapdr. Ancak bu deiken ve metodlarn da ayn greve ilikin olmas beklenir. rnein icq benzeri bir uygulamada en kaba ekilde grsel ksm ve a balantlar olmak zere iki ksm olduunu kabul edelim. Bu uygulamann pencere ekli, rengi, dmelerin yeri v.b. ileri stlenecek birok metod ve deikeni olsa da hepsinin amac aslnda grsellii salamaktr. Yine benzer ekilde arka planda balantlar ayarlayan, kontrol eden bir ok metod ve deiken de a ayarlar iin kullanlr. Bu durumda ayn projeye ilikin ama ayr grevleri stlenen tm metod ve deikenleri bu iki ana snf altnda toplamak hem organizasyonda hem de tasarmda kolaylk salar. Bu iki ksm birbirinden bamsz tasarlanarak bir araya getiriliebilir. Bu da projeye esneklik salar. Snflarn Yaratlmas Bundan nce yazdmz rneklerde aslnda biz hep bir snf ve bu snfn ierisinde de birtakm metod ve deikenler yaratyorduk. imdi yine rnek bir snf yaratalm. Bu snf kendi ierisinde sadece bir deiken tutsun ve bu deikenin deerini elde edebilecek ya da deitirebilecek baz metodlar olsun:
43
[Link] dosyasndaki rnekte, bahsettiimiz bu snf yine snf ile ayn isimde olan "[Link]" dosyas ierisinde yarattk ve kaydettik. Biz aslnda burada "DegiskenTutan" isimli yeni bir nesne tr yaratm oluyoruz. DegiskenTutan snfnn 2. satrnda yaratlan "x" isimli bir global deikeni bulunmaktadr. Bu deikenin global olmasnn nedeni yaratld yerin herhangi bir metodun iinde deil de en d faliyet alannda olmasdr. Bu nedenle snf ierisinde tanml dier tm metodlar bu deikene eriebilir ve deikeni kullanabilirler. this Anahtar Szc Snf ierisinde yazlm olan "getX" isimli metod, bu "x" deikeninin ierisindeki deeri geri dndrmektedir. Yalnz dikkat edilirse 9. satrda gerekleen bu geri dndrme ilemi srasnda sadece deikenin ad deil, onun yerine "this.x" eklinde bir kullanm grmekteyiz. "this" anahtar szc zel bir anahtar szck olup noktadan sonra gelen deiken isimlerinin snfa ait olduunu ifade etmektedir. Yani 9. satrda yazlan return this.x; ile kastedilen ey, ilgili snfa ait olan "x" isimli deikeninin geri dndrleceidir. Yine snf ierisinde yazlm olan "setX" isimli metod da kendisine parametre olarak gelen ve c deikeninde tutlan deeri "this.x" deikenine, yani snfa ait olan "x" deikenine atamaktadr. Grdmz gibi yazm olduumuz bu yeni snf ierisinde baka deiken ya da metod bulunmamaktadr. Peki ya madem artk bu snf yazld ve kullanma hazr, snf nasl kullanabiliriz? imdi bu sorunun cevabn verelim:
Yazlm Snflarn Kullanlmas Baz zel durumlarn dnda, en genel biimiyle bir snf nesnesi ya da bildiimiz ekliyle bir snf trnden deiken, u ekilde yaratlr: SinifAdi degisken = new SinifAdi(); Mesela, az nce yazm olduumuz "DegiskenTutan" isimli snf trnden bir deiken de: DegiskenTutan a = new DegiskenTutan(); eklinde yaratlmaktadr. Bu yaratma ilemini baka bir snf ierisinden yapabilirsiniz. Burada vurgulanmas gereken en nemli nokta, yaratlan her snf deikeninin (ann) aslnda gerek snfn bir kopyas olduudur (instance). Yani biz yukardaki gibi a isimli ve DegiskenTutan trnde bir snf nesnesi ve yine ayn ekilde DegiskenTutan b = new DegiskenTutan(); b isimli baka bir DegiskenTutan isimli snf nesnesi yarattmzda, bu iki nesne de artk kendilerine ait birer "setX" ve "getX" metodlar ile bir "x" deikeni barndrmaktadr. A nesnesinin "x" deikeni ile b nesnesinin "x" deikeni artk farkldr. Ama ikisinin de bir "x" deikeni vardr. Yine ayn ekilde "a" nesnesi ile "b" nesnesinin "setX" ve "getX" metodlar vardr ama her metod kendi nesnesine ait olan "x" deikeni zerinde ilem yapabilir.
44
imdi "[Link]" dosyas ile ayn klasr ierisinde yer alan "GenelSinif" isimli yeni bir snf daha yaratalm ve bu yeni snf ierisinde de "DegiskenTutan" isimli snf kullanalm:
import [Link].*; public class GenelSinif { public static void main(String arg[]) { DegiskenTutan a = new DegiskenTutan(); DegiskenTutan b = new DegiskenTutan(); [Link](10); [Link](20); String message = "a daki x degeri: "+[Link](); message += "\nb deki x degeri: "+[Link](); [Link](null, message); [Link](0); } } imdi yazm olduumuz bu snflar kaydettikten sonra altrabilmek iin u ilemleri yapmamz gerekmektedir.: ncelikle komut satrnda bu snf dosyalarn yazm olduunuz dizin ierisine cd komutu yardmyla giriniz. rnein bu dizin linux kullanclar iin "/home/academytech/kodlar" ya da windows kullanclar iin "C:\kodlar" ise, dizin ierisine girmek iin: $cd /home/academytech/kodlar ya da C:\> cd kodlar yazmanz gerekmektedir.
2 imdi srasyla "[Link]" dosyasn ve "[Link]" dosyasn derleyelim: javac [Link] javac [Link]
45
3 Son olarak da [Link] dosyasn altralm: java GenelSinif Not: Burada gryoruz ki "[Link]" dosyas sadece derleniyor ancak [Link] gibi sonra da altrlmyor. Bunun nedeni asl alan programn "GenelSinif" olmas "DegiskenTutan" snfnn ise sadece kullanlyor olmasdr. nk "GenelSinif" snf ierisinde "main" metodu vardr. Bununla ilgili ayrntl aklamay yaznn ilerleyen ksmlarnda zaten bulabileceksiniz. rneimizde 7. ve 8. satrlarda DegiskenTutan snf trnden "a" ve "b" isimli 2 deiken ya da iki "DegiskenTutan" snf nesnesi yaratlmaktadr. Daha sonra 9. satrda a nesnesinin "setX" metodu "a" nesnesinin "x" deikeni deerini 10, "b" nesnesinin "setX" metodu da "b" nesnesinin "x" deikeninin deerini 20 yapmaktadr. Dikkat ederseniz "a" ve "b" nesneleri de "setX" ve "getX" metodlarna sahiptir ve bu metodlar kullanmak iin nesne adndan sonra "." iareti ve sonra da metod adn yazmak gerekir. "a" ve "b" nesnelerinin tpk "DegiskenTutan" snf gibi metodlara ve deikenlere sahip olmalarnn nedeni, bu nesnelerin de yaratlrken "DegiskenTutan" snf trnden yaratlm olmalardr. 12. ve 13. satrlarda hazrlanan "message" isimli String deikeni ierisine ekranda grlecek yaz ve "getX" metodlar yardmyla "a" ve "b" nesnelerinin "x" deikenlerinin ierisindeki deerler hazrlanmaktadr. En son olarak da "message" isimli deiken ierisinde hazrlanan bu son grnt "JoptionPane" isimli snfn "showMessageDialog" isimli metodu yardmyla ekrana gnderilmektedir. Bu rnekten karacamz sonu udur; Genel olarak yazlm snflarn kullanlabilmesi iin ncelikle bu snflar trnden deikenler yaratlarak bu snflarn birer kopyas ya da nesnesi karlmal ve snfa ait deiken ve metodlar bu nesneler araclyla kullanlmaldr. Ayrca grdmz gibi bir snfa ait metodlar kullanlrken snf nesnesinden sonra "." iareti ve daha sonra da metodun ad yazlmaktadr. Bu rneimizde "a" ve "b" isimli snf nesneleri yaratldktan sonra, sahip olduklar "x" deikenlerine "setX" metodu ile deerler verilmektedir. Peki eer biz daha nesneyi yaratorken hemen o anda "x" deikenine deer vermek istersek ne olacak? Bunun iin "balang metodu" kavramn bilmemiz gerekir. Snflarn Balang Metodlar (Constructors): Snflarn balang metodlar bizim bildiimiz anlamda metodlardan biraz daha farkldr. Bu metodlarn en nemli zellii, bir snf nesnesi yaratlrken otomatik olarak arlmalardr. Mesela "DegiskenTutan" snf trnden bir nesne yaratlrken aslnda "new" anahtar szcnden sonra bir metod arldn grmekteyiz: DegiskenTutan a = new DegiskenTutan(); te bu "DegiskenTutan()" isimli metod, "DegiskenTutan" isimli snfn balang metodudur. Peki o zaman balang metodlarnn normal metodlardan fark nedir? 1 Balang metodlar kesinlikle ve kesinlikle snf ismiyle ayn olmak zorundadr. Eer balang metodunun ismini verirken snf isminden farkl bir isim kullanrsanz bu metod artk baka bir metod olarak kabul edilir. rnein: DegiskenTut -> Yanl. Snf ismi DegiskenTutan o halde balang metodunun ismi bu olamaz
Degiskentutan -> Yanl. Snf isminde T harfi de byk. sim, byk kk harf baznbda da ayn olmak zorundad?r. 2 Balang metodlar geri dn deerine sahip deildir. Yalnz burada geri dn deeri void demek istemiyorum. Balang metodlarnn geri dn deeri gibi bir kavramlar yoktur. void ile yok baka anlamlara gelir. 3 Bir snfn birden fazla balang metodu olabilir. Btn balang metodlar da snf ismiyle ayn olmak zorundadr ancak her birinin parametreleri birbirlerinden farkl olmak zorundadr.
46
Biz balang metodlarn genelde bir snf trnden bir nesne yaratrken, bu nesnenin deikenlerine birtakm ilk deerler vermek amacyla yazarz. Aslnda tasarladmz bir snfa balang metodu yazmak zorunda deiliz. Ancak balang metodu yazmamsak, nesne yaratlrken Java otomatik olarak bizim yerimize bo bir hayali balang metodu yazar ve onu arr. Eer yazmsak bizim yazdmz balang metodunu armaktadr. imdi tm bu anlattklarmz "DegiskenTutan" snfmza balang metodlar ekleyerek irdeleyelim. Ama bu sefer "DegiskenTutan" ve "GenelSinif" isimli snflar "DegiskenTutan2" ve "GenelSinif2" olarak deitirelim. Tabi ayn deiiklii dosya isimlerinde de yapmay unutmayalm: /*** [Link] ***/ class DegiskenTutan2 { int x; public DegiskenTutan2() { this.x = 0; } public DegiskenTutan2(int c) { this.x = c; } public void setX(int c) { this.x = c; } public int getX() { return this.x; } }
/*** [Link] ***/ import [Link].*; public class GenelSinif2 { public static void main(String arg[]) { DegiskenTutan2 a = new DegiskenTutan2(); DegiskenTutan2 b = new DegiskenTutan2(2); String message = "a daki x degeri: "+[Link](); message += "\nb deki x degeri: "+[Link](); [Link](null, message); [Link](0); } } Bu rnekte gryoruz ki; "GenelSinif2" dosyasnn 7. satrnda, "a" isimli "DegiskenTutan2" trnden snf deikeni, "DegiskenYutan2" snfnn 5. satr?nda tanmlanan bo olan balang metodu ile yaratlyor ve bu metodun ierisinde de "a" nesnesinin "x" deikenine 0 deeri veriliyor. Ancak "GenelSinif2" erisinde 8. satrda yaratlan "b" isimli ve "DegiskenTutan2" trndeki nesne, "DegiskenTutan2" isimli snfn 9. satrda tanmlanm ve int parametre alan balang metoduyla yaratld iin bu "b" nesnesine ait olan "x" deikeni nesne yaratlrken verilen 2 deerini alyor. Bu rnekte, bir snf trnden nesne yaratlrken yaplmasn istediimiz birtakm ilk ilemleri balang metodlar yardmyla yaptrabildiimizi gryoruz. NOT: Balang metodlar sadece nesne yaratlrken arlr. Baka bir zamanda bu metodlarn arlmasna izin verilmez.
47
main Metodu u ana kadar dikkat ederseniz "main" metodu ile ilgili ok az ayrntdan bahsettim. Aslnda bu metod da birtakm zelliklere sahip zel bir metoddur. imdi yukarda yapm olduumuz rneklere bir gz atmanz istiyorum. Bu rnekler de "GenelSinif" isimli snf ierisinde "main" metodu varken "DegiskenTutan" isimli snfn ierisinde byle bir metod yok. Ama her iki rnek de dzgn bir ekilde alabiliyor. Bunun nedenini yle aklayalm: Bu ana kadar grdk ki bir snf nesnesi ilk nce yazlmakta ve daha sonra da kullanlmaktadr. Ancak kullanlmadan nce tm nesneler ncelikle "javac" komutu ile derlenmelidir. te bir java dosyasnn "javac" ile derlenmesi ileminden sonra bir de "java" komutu ile altrlabilmesi iin, o java dosyas (ya da snf) ierisinde "main" metodu olmas gerekir. Yani altrlabilir snflarn main metodunu sahip olmalar gerekir. Aksi takdirde java <Sinif_adi> komutundan sonra ekranda aadaki gibi "main" metodunun bulunamadna dair bir mesaj ile karlarsnz: "[Link]: main" Ancak "DegiskenTutan" gibi sadece baka bir snf ierisinde kullanlmak zere tasarlanm snflar dorudan altrlmayaca iin, onlarn ierisinde main metodu olmasna gerek yoktur. Bu tr snflarn yukardaki rnekte de grld gibi sadece derlenmesi, kullanlabilmeleri iin yeterli olacaktr. zetle; yazdmz programlarda birbirinden farkl grevleri stlenmi bir ok snf barndran java dosyalar ve hepsini en son olarak tek at altnda toplayacak ve asl programn almasn salayacak genel bir snfmz olacaktr. Ve tm bu snflar ierisinde sadece ana program altracak olan bu genel snf ierisinde "main" metodu olmaldr. Dier snflar kullanabilmeniz iin, genel snf da dahil olmak zere hepsini java ile derlemelisiniz. Ancak program altrmak iin sadece genel snf java komutu ile altrmanz yeterlidir. Sonu olarak; bir snf java ile altrld zaman, otomatik olarak ierisindeki main metodu arlacaktr. Eer snf ierisinde main metodu yoksa, byle bir snf "javac" ile derlenebilir ancak "java" ile altrlamaz!
main Metodu parametreleri: "main" metodunun u ana kadar hi deinmediimiz bir zellii de ald parametrelerdir. Bu metod yazlrken grmekteyiz ki public static void main(String arg[]) eklinde bir String dizisini parametre olarak almaktadr. " yi de bu parametre ne ie yaryor?" diye merak ettiinizi tahmin ediyorum. Artk bunu renme zamanm?z geldi. ncelikle aada verilen "[Link]" isimli snf yazp kaydediniz: class MainParametreleri { public static void main(String arg[]) { [Link]("1. parametre:"+arg[0]); [Link]("2. parametre: "+arg[1]); [Link](0); } } imdi aada gsterildii gibi bu snf nce javac komutu ile derleyip daha sonra java komutunun bu zel kullanm ile altrnz: javac [Link] java MainParametreleri bir iki
48
Bu ekilde snf altrdnzda ekranda yle bir k greceksiniz. 1. parametre:bir 2. parametre: iki te burada, java komutu ile "MainParametreleri" snfn altrrken srasyla verdiiniz "bir" ve "iki" isimli bu iki String deeri, main metodunun pototipinde tanmlanm olan "arg" isimli String dizisine atulmtr. "main" metodunun paramtresi olan bu "String arg[]" dizisi bu rnekte olduu gibi bir snf altrlrken kullancnn vermek istedii parametreleri alr ve daha sonra program ierisinde kullanlabilmesi iin saklar. rnek programmzn 5. ve 6. satrlarnda "arg[0]" ve "arg[1]" ile bu girilen parametreleri kullanabildiimzi grmekteyiz. Buradaki kullanma eklimiz bu parametreleri sadece ekrana yazmak gibi anlamsz bir ilem gibi grnse de daha sonra ie yarar ekillerde kullanabileceimizi dnebiliriz. 1. parametre: bir 2. parametre: iki Snflarn public ve private Metod ve Deikenleri u ana kadar belirli ileri yapabilmek amacyla metod ve deikenleri birarada tutan nesneleri yaratmay ve kullanmay, yani snflarn genel olarak kullanmn grm olduk. Bir snf ierisinde eitli metod ve deikenler tutuyor ve daha sonra biz de bu snf trnden nesneler yaratarak bu metod deikenleri kullanabiliyoruz. Bazen bir snf ierisinde yazlan metod ya da deikenleri sadece snfn ierisinde kullanmak isteyebiliriz. Yani baka bir yerde bu snf trnden yaratlan bir deiken ile kullanmayacamz ancak snfn kendi iinde kullanlmas gereken metod ve deikenler olabilir. Bunu anlamak iin "DegiskenTutan" snfna tekrar dnelim. Biz "DegiskenTutan" snf trnden bir "a" nesnesi yarattmzda "a" nesnesi kendisine ait olan "x" deikenini: a.x = 10; eklinde deitirebilir. Ancak biz bu ekilde bir mdaheleye izin vermek istemiyor olabiliriz. Eer "a" nesnesinin "x" deikeni deitirilecekse, byle bir ilemin "setX" gibi bir metodla yaplmasn, deikene "a.x" diyerek dorudan eriilememesini istiyor olabiliriz. te bu durumlarda snf ierisine "x" deikeninin bana bir "private" anahtar szc eklememiz gerekir. Yani "DegiskenTutan" snfnda "x" deikeninin bildirimi: class DegiskenTutan { private int x; public Degiskentutan() { ... eklinde olursa, artk "DegiskenTutan" trnden "a" gibi bir nesne yaratlsa bile, "a.x" gibi bir eriim yasaklanm olur. Ancak snf ierisindeki bir metod "x" deikenine yine de ulaabilir. Eer genel olarak zetlemek gerekirse; snflar ierisinde bildirilen "private" trndeki deikenlere dardan eriilemez, ancak snfn dier metodlar ile eriilebilir. Bu durum snfn private metodlar iin de geerlidir. Eer snf yazlrken bir metodun bana "private" anahtar szc eklenirse, bu metod da artk dardan eriilemez, sadece snf ierisindeki dier metodlar tarafndan kullanlabilir bir hale gelir. Mesela "DegiskenTutan" isimli snfa aadaki gibi bir "private" metod ekleyelim: class DegiskenTutan { private int x; ... private void resetX() { this.x = 0; } ...
49
public setX(int c) { [Link](); this.x = c; } } Bu ekilde "private" olarak bildirilmi "resetX" metodu artk bu snf trnden yaratlm nesneler ile dardan kullanlamaz. Yani aadaki gibi bir kullanm geersizdir:
class BaskaSinif { public static void main(String arg[]) { DegiskenTutan a = new DegiskenTutan(2); [Link](); /* YANLI! resetX private bir metoddur Bu ekilde dardan kullanlamaz.*/ ... } } En son rnekte grdnz gibi "[Link]()" gibi bir arm geerli deildir. nk "DegiskenTutan" snfnn "resetX" isimli metodu "private" bir metoddur. Bu nedenle, bu snf trnden yaratlm olan "a" nesnesi araclyla bu metoda dardan eriilemez. Ancak nceki rnekteki gibi "resetX" metodunu snfn dier bir metodu olan "setX" metodu kullanabilmektedir. Deiken ya da metodlarn "private" ya da "public" olmas, bu metod ya da deikenlerin sadece dardan kullanm etkileyen bir durumdur. Snf ierisindeki dier metodlar bu "private" deiken ya da metodlara eriebilirler. Tm bunlarn bir sonucu olarak da , snflar yazlrken yaratlan "public" metod ve deikenler, snf nesneleri araclyla dardan eriilebilirler. Statik Metod ve Deikenler u ana kadar rendiklerimizi ele aldmzda neden JOptionPane snfnn showMessage isimli metodunu kullanmak iin JOptionPane snf trnden bir nesne yaratmyoruz? diye sormamz gerekir. Baz metodlar yazldklar snflar ierisinde statik olarak yazlrlar. Bu trden statik olarak yazlm metodlar kullanmak iin snf nesnesi yaratmak gerekmez. Bu metodlar kullanmak iin yazldklar snf isminden sonra "." iareti koyarak dorudan metodu arabilirsiniz. Ancak tahmin edersiniz ki bir metod statik olarak yazlmsa genel amal bir metod olmaldr. Mesela JOptionPane isimli snfn showMessageDialog ya da showInputDialog isimli metodlar genel amal olup her zaman kullanlabilmektedir. Ekrana bir mesaj penceresi karmak ya da kullancdan bir giri deeri almak iin bir nesne yaratmaya gerek yoktur. Siz de kendi tasarladnz snflar ierisinde bu ekilde genel amal metodlar yazmak isterseniz bunlar statik olarak yaratabilirsiniz. Bir metodun statik olarak yaratlabilmesi iin, metodun prototipinin bana "static" anahtar szc eklenir. Aadaki iki rnei yazp kaydediniz: import [Link].*; class StatikTest { String mesaj; public StatikTest() { mesaj = ""; } public StatikTest(String m) { [Link] = m; } public static void ozelMesaj(String m) { [Link](null, m);
50
} public void kayitliMesaj() { [Link](null, [Link]); } } class GenelSinif3 { public static void main(String arg[]) { [Link]("Bu mesaji dogrudan gosterdim"); StatikTest a = new StatikTest("Bu mesaj icin nesne yarattim"); [Link](); } } Bu rnei altrdnzda ekrana iki tane mesajn geldiini greceksiniz. Bu mesajlardan ilki, "GenelSinif3" isimli snfn 5. satrnda, "StatikTest" snfnn statik metodu dorudan arlarak ekrana gelmitir. Grdmz gibi, bir snfn statik metodunu kullanmak iin ilk nce o snf trnden bir nesne yaratmaya gerek yoktur. nk statik metodlar snf ismi ve sonra ". " iareti yazldktan sonra dorudan arlabilirler. Ancak ikinci mesaj "StatikTest" snfnn "kayitliMesaj" isimli ve statik olmayan metodu sayesinde ekrana geldiinden, bu metodu kullanabilmek iin ilk nce "StatikTest" snf trnden bir nesne yaratlmas ve metodun da bu nesne araclyla arlmas gerekir. Uygulama Sorusu: erisinde tarih tutan ve tarihlerle ilgili ilemler yapabilen metodlar barndran bir snf tasarlaynz. Yaplmas gereken ilemler: a. b. c. d. iki tarihin birbiriyle kyaslanmas, tarih zerine belirli bir gn says eklenebilmesi, tutulan tarihin gsterilmesi, tutulan tarihin deitirilmesi eklinde olmaldr.
Bu ilemlerin her biri iin snf ierisinde bir metod tasarlamanz gerekmektedir. Byle bir snfn gn, ay ve yl tutan deikenleri olmaldr. Snf tasarladktan sonra, bu snf kullanan ve bu snf trnden rnek nesneler yaratarak bunlar kullanan baka bir genel snf yaznz ve tasarmnz bu nesneler zerinde test ediniz. Nihayet bu dersimizin de sonuna gelmi bulunuyoruz. Nesne ynelimli programlama tekniinin zn oluturan snflar ve snflarn kullanmn rendiimiz bu dersimizi iyice sindirmenizi ve rnekleri de tekrar yazarak kendi banza denemenizi srarla neririm. Uygulama Sorusu2: Icerisinde array tutan (int turunden) bir sinif yaratiniz (IntArray). Bu sinif icerisinde tuttugu bu array i dinamik olarak genisletebilmelidir. Ozetle bu sinifta asagidaki metdolar yer almalidir. void add(int toAdd); void add(int []toAddArray); int findMax(); int findMin(); int remove(int index); int display(); int reverseDisplay(); public IntArray(int a); public IntArray(int []a); public IntArray();
51
Sort yontemleri (bubble sort ve selection sort) anlatlacak. ODEV: String diziyi sort eden bir metod ornegi (Bir sonraki derste inceleyecegiz) Uygulama Sorusu (Derste yapilacak): Snflarn dizilere parametre olarak gnderilmesine iliskin ornekler - Person turunden bir sinif yarat (isim, yas) - Bu sinif turunden elemanlari olan bir array yarat - Bu arrayi bir metoda gonder ve ekranda goruntule - Sonra compareTo metodunu Person sinifina ekle ve sort bilgisiyle bu sefer bu listeyi sirala public class Person { private String name; private int age; public Person() { [Link]("No person"); [Link](0); } public Person(String name, int age) { [Link](name); [Link](age); } public String toString() { return "Person Name: " + [Link]() + "\nPerson Age: " + [Link](); } public static void sortPersonArray(Person p_array[]) { /*for(int i = 0; i < p_array.length; i++) for(int j = 0; j < p_array.length; j++) if(p_array[i].compareTo(p_array[j]) > 0) swap(p_array[i], p_array[j]);*/ for(int i = 0; i < p_array.length; i++) for(int j = i+1; j < p_array.length; j++) if(p_array[i].compareTo(p_array[j]) > 0) swap(p_array[i], p_array[j]); } private static void swap(Person p1, Person p2) { Person temp = new Person(); [Link]([Link]()); [Link]([Link]()); [Link]([Link]()); [Link]([Link]()); [Link]([Link]()); [Link]([Link]()); }
52
/** * @return Returns the age. */ public int getAge() { return age; } /** * @param age The age to set. */ public void setAge(int age) { while(age < 0) age = [Link]( [Link](null, "Yas bilgisi 0 ya da daha kucuk olamaz!\nTekrar giriniz")); [Link] = age; } /** * @return Returns the name. */ public String getName() { return name; } /** * @param name The name to set. */ public void setName(String name) { [Link] = name; } public static void main(String[] args) { Person array[] = {new Person("ali", 12), new Person("ahmet", 24), new Person("zeren", 13)}; [Link](array); for(int i = 0; i < [Link]; i++) [Link](array[i]); } } Bu derse kadarki derslerimizde artk nesne ynelimli programlama tekniinin merkezinin oluturan snflarn ne anlama geldiklerini ve nasl tasarlandklarn renmitik. Bugn tasarmn ayrntl olarak rendiimiz snflarn kullanmna ilikin baz rnekler zerinde duracaz. Ayrca Java'da ntanml olarak bulunan ve kendi zeli ilerimiz iin kullanabileceimiz snflarn bazlarn da grm olacaz. Size tavsiyem burada anlatlan ekleri mutlaka kendi banza da yazp denemenizdir. Snflarn Kendi Kendilerini Kullanmalar: Bundan nceki rneklerimizde bir snfn yazldktan sonra, baka bir snf ierisinde ya da rneklerde yaptmz gibi main metodu ierisinde kullanlabildiini grmtk. Baz snflar otomatik olarak altrlabilmek amacyla da
53
yazlabilirler. Bir snfn otomatik olarak alabilmesi iin ierisinde main metodu olmas gerektiini zaten biliyoruz. te bu ekilde main metodu ierisinde bir snf, kendisi trnden nesne yaratp bunu kullanabilir. in z aslnda udur: Bir snf yazldktan sonra, bu snf trnden nesneleri istediimiz her metod ya da her snf ierisinde artk yaratp kullanabiliriz. Bu genel kural bilirsek, zaten snf nesnelerinin ne zaman ve nerede yaratlacana dair bir problemimiz de kalmaz. Aadaki rneimizde, matematikte kullanlan karmak saylara ilikin deer ve metodlar barndran bir snf yazacaz. Bu snf ayn zamanda main metodu ierecek ve kendisi trnden nesneler yaratarak bu nesneler zerinde ilemler yapacak:
imdi bu rneimizi biraz inceleyelim. Snfmzn iki adet balang metodu olduunu grmekteyiz. Bu metodlardan birtanesi, 6. satrda tanmlanmakta ve hibir parametre almadan yaratlan KarmasikSayi nesnesinin gercel ve imajinel isimli deikenlerini 0.0 deerine eitlemektedir. Dier balang metodu ise 11. satrda tanmlanmaktadr
54
ve nesne yaratlrken kendisine verilen parametreleri kullanarak gercel ve imajinel deikenlerinin deerlerini atamaktadr. NOT: Snfn kendisine ait olan deiken ve metodlarn snf ierisinde kullanrken, bu deiken ve metodlarn bana this. eklemi olduuma dikkat ediniz. Daha nce de sylediim gibi this anahtar szc snfn kendisini temsil eder. rnein 12. satrda [Link] ifadesi, o anda ierisinde bulunduumuz snfa ait olan gercel isimli degiskeni temsil etmektedir. 16. satrda tanmlanan topla isimli metod parametre olarak baka bir KarmasikSayi nesnesi alarak, bu saynn gercel ve imajinel deikenleri ile snfn kendi gercel ve imajinel deerleri toplamn elde eder ve bu deerlerle, sonuc adnda yeni bir KarmasikSayi nesnesi yaratarak bu deikeni 19. satrda geri dndrr. Buna benzer ekilde 22. satrda yazlm olan cikart metodu da ayn ilemi kartma iin yapar. Ancak bu metod biraz daha ilgin bir yntemle deer dndrmektedir. Bu sefer sonucu tutacak ayr bir deiken yaratmak yerine, 23. satrda olduu gibi return anahtar szcnn nnde yeni bir KarmasikSayi nesnesi yaratlarak hemen o anda dndrlr. Bu yntemde arada sonuc gibi baka bir deiken ierisinde KarmasikSayi nesnesi yaratma ihtiyac ortadan kalkmaktadr. Yazdmz Snflarn toString metodu: Dikkat ederseniz 35. satrda toString adnda ilgin bir metod yer almaktadr. Bu metod aslnda main metodu ierisinde hi arlmamtr. Ancak ilgintir ki, 47. satrdaki sayi1 isimli snf deikeni ekrana yazlmak istendii zaman sanki bu metod arlmaktadr. nk ekranda toString metodunun dndrd String ifadesi yazlmaktadr. Aslnda gerekten de 47. satrda sayi1 deikeninin ekrana basld noktada otomatik olarak bu metod arlr. Yazlan tm snflara aslnda toString metodu da eklenebilir. Eer String toString() prototipini bozmadan snfnz ierisinde bir toString metodu yazarsanz, bu snfa ilikin bir snf deikenini ekrana basmak istediinizde bu metod otomatik olarak arlmaktadr. Ancak metodun iini istediiniz gibi yazabilirsiniz. Eer yazdnz snf ierisinde bu metodu eklemez ve bu snf trnden bir deikeni ekrana basmak isterseniz, o zaman Java otomatik olarak bir toString metodunu kendisi yazacak ve buna ilikin bir String deeri de ddrecektir. Ancak bu deer olduka anlalmaz bilgiler iermektedir. zetle snfnz nasl ifade etmek istiyorsanz, buna ilikin String toString() prototipli bir metod yazabilirsiniz. ntanml Java Snflarnn Kullanm: Dersimizin bundan sonraki ksmnda yeni bir konuya gemeden nce, Java'da ntanml baz snflara ilikin rnekler yapmakta yarar gryorum. Greceimiz bu snflar, yazacamz programlarda birok yk zerimizden almakta ve bize baz yararl hazr metodlar sunmaktadr. Bu nedenle iimizi grecek ve daha nceden yazlm bu hazr snf ve metodlar kullanarak zaman kayb ve zahmetten kurtulabiliriz. Bir konuda sizleri uyarmak isterim: Burada bu ntanml java snflarnn tm metodlarn detayl bir ekilde gstermek yerine, bu snflar hakknda bilgi sahibi olmanz ve sadece birka metod kullanmyla snf sizlere tantmay hedefledim. Kendi uygulamalarnz iin burada genel olarak renmi olduunuz bu snflarn size uygun metodlarn ve burada gsterilmeyen baka ntanml snflar java dkmantasyonu ve internette yapacan aramalar ile bulabilirsiniz. Java dkmantasyonunun online halini: [Link] adresinde bulabilirsiniz. zetle buradaki rnekleri sizlere sadece neyi nerede arayacanz bilmeniz asndan veriyorum. imdi bu snflar incelemeye balayalm.
Math Snf: Bu snf eitli matematiksel ilemleri yapabileceimiz metodlar sunmaktadr. Bu metodlar ierisinde sin, cos, tan, kuvvet alma, kk alma v.b. metodlar bulunmaktadr. Bu snf kullanabilmeniz iin uygulamalarnzn banda herhangi bir ktphaneyi import etmenize gerek yoktur. Aada Math snfnnn baz metodlarnn kullanmna ilikin bir rnek verilmektedir. Bu rnek, daha nce yapm olduumuz karmak say snfnn biraz daha gelitirilmi hali ve Math snfnn fonksiyonlarnn kullanld bir rnektir. Ayrca bu snfa aciHesapla adnda yeni bir metod daha eklenmi ve snfn ierisinde saklanan karmak saynn a deerleri bu metod yardmyla hesaplanmtr.
55
imdi rneimizi daha detayl inceleyelim. Hereyden nce genel bir noktay vurgulamak istiyorum. Dikkat ederseniz KarmasikSayi2 snfnn 23, 24, 27 satrlarnda, gercel ve imajinel deerlerini [Link] diyerek dorudan almak yerine bu deerleri 13 ve 16. satrlarda yazlm olan gerceliVer ve imajineliVer metodlar yardmyla alyoruz. Bunun nedeni snfn veri elemanlarn korumak ve bylece snf hiyerarisini dzgn bir ekilde kurmak iindir. Bu teknik bizlere olduka nemli ve salam bir mekanizma sunar. Zaten dikkat ederseniz gercel ve imajinel isimli veri elemanlar da dardan dorudan eriimin engellenmesi amac ile 7. satrda private olarak tanmlanmtr. Veri elemanlarna eriimin bu ekilde kontroll olarak yaplmas gerekir. Eer bu elemanlara eriilmek gerekiyorsa, bu ii dorudan deil de set ve get metodlar gibi metodlar yardmyla yapmak gerekir. Kullancya sadece bu metodlar sunulmal, snfn veri elemanlarna eriim ise metodlar ierisinde ve gerektii gibi yaplmaldr. 23. satrda kullanlan [Link] isimli metod 1. parametre ile ald saynn, 2. parametre ile ald say kadar kuvvetini hesaplar ve sonucu geri dndrr. Bu metodu gercel ve imajinel ksmlarn karelerini hesaplamak iin kullandk. Bu karelerin toplamnn da karekkn, tahmin ettiiniz gibi [Link] metodu ile elde ettik. Yani zetle;
56
[Link] deerleri ile elde edilen gercel ve imajinel ksmlarn karelerinin toplamn, [Link] metoduna paramtere olarak dorudan gndererek sonucu da dorudan geri dndrdk. Sizler de bol bol program yazdka bu tip hzl yazm tekniklerinizi gelitireceinizden emin olabilirsiniz. Ancak pratik olmas amacyla ksa kodlar yazarken bile kodunuzun okunabilir olmasna dikkat ediniz. rneimizin 27. satrnda kullandmz Math.atan2 isimli metod kendisine parametre olarak verilen y ve x gibi iki saynn polar koordinatlarda sahip olduu a deerini hesaplayan bir metoddur. Yani aslnda yapt ilem y/x deerinin arktanjant deerini hesaplamaktr. Fakat geri dnen bu deer radyan cinsindendir. Bu nedenle, radyan olarak elde edilen a deeri 29. satrda yazlan aciyiDereceVer metodu ile derece olarak da elde edilebilir. Hzl bir ekilde listelemek gerekirse Math snfnn baz dier metodlar unlardr: int [Link](int a) double [Link](double a) double [Link](double a) double [Link](double a) int [Link](int a, int b) a saysnn mutlak deerini geri dndrr. Ayn metodun float, double ve long trler iin de versiyonlar vardr. a saysnn ters kosins deerini dndrr. Benzer ekilde asin ve atan metodlar da vardr. a saysnn cosinz deerini geri dndrr. Benzer ekilde sin metodu da vardr. a saysnn e saysn kuvveti olarak hesaplar ve bu deeri dndrr. a ve b saylarndan byk olann deerini geri dndrr. Benzer ekilde bu metodun double, int, float ve long versiyonlar da vardr. 0 ile 1 arasnda rastgele pozitif bir say retir ve bu deeri dndrr.
double [Link]()
DecimalFormat Snf: Java ile yazdmz programlarda saysal deerler ou zaman anlalmas zor ve gereksiz uzunlukta retilir. Ancak Java bizim iin saynn ne kadar uzunlukta olmas gerektiini otomatik olarak bilemez ve bu nedenle en doru ve orjinal ekilleriyle bu deerleri retmektedir. Eer yukardaki rnei yazp altrdysanz, elde edilen sonularn (a deerleri gibi) virglden sonra olduka fazla miktarda basmak ierdiini grmsnzdr. DecimalFormat snf, saylar istediimiz gibi ifade edebilmemize olanak salar. Bu snfn kullanmna ilikin bir rnek yazalm:
rneimize dikkat edersek, DecimalFormat snfn kullanmadan nce 4. satrda olduu gibi [Link] ktphanesini programa dahil etmeliyiz. 9. satrda yaratlan bir DecimalFormat nesnesi yapmak istediimiz ifade biimini String bir deer olarak tutmaktadr. Bu nesne yaratldktan sonra, nesne
57
araclyla istenilen bir say format metodu kullanlarak 13. satrda olduu gibi biimlendirme yaplabilir. format metodunun geri dn deeri String bir deerdir. Sarg Snflar: Java'da yaygn olarak kullanlan snflar arasnda sarg snflar da vardr. Bu snflar aslnda genel olarak ayn prensiple kullanlr. B snflar kullanmaktaki ama bilinen temel trleri (integer, float, double gibi) String trne ya da tersine, String trndeki bir ifadeyi temel trlere dntrmektir. Aslnda bu tr snflara olan ihtiyac rnek zerinde aklarsak daha anlalr olacaktr. Mesela en son yaptmz OndalikKisim snf rneinde, 10. satrda tanmlanan a deikeni ierisindeki deerin biimlendirilmi hali String trnde elde edilmektedir. Ancak biz bu biimlendirilmi hal ile baka matematiksel ilemler yapmak istediimizde String trndeki bu sonu iimize yaramayacaktr. Bu sonucun tekrar double trnde elde edilmesi gerekir. Bunun iin String trnde elde edilen bu deer [Link] metodu ile tekrar double trne dntrlebilir. Bu metodun rnek kullanm: ... double yeniBicim = [Link]([Link](a)); .. eklinde olacaktr. Bu dnmleri yapan dier baz sarg snflar ve metodlar da unlardr: int [Link](String str) String [Link](int a) double [Link](String str) String [Link](double a) float [Link](String str) String [Link](float a) String [Link](int a) str ile gelen String biimindeki sayy integer biiminde geri dndrr. integer trndeki a saysnn String trnde deerini geri dndrr. str ile gelen String biimindeki sayy double biiminde geri dndrr. double trndeki a saysnn String trnde deerini geri dndrr. str ile gelen String biimindeki sayy float biiminde geri dndrr. float trndeki a saysnn String trnde deerini geri dndrr. integer trndeki a saysnn String deerini geri dndrr. Ayn metodun double, float, ve long trnde parametre alan versiyonlar da vardr
ArrayList Snf: Daha nce renmi olduumuz diziler konusundan bildiimiz gibi bir dizi yaratldktan sonra artk otomatik olarak boyutu deimiyordu. Siz diziyi belirli bir uzunlukta atktan sonra dizinin tm alanlar doluysa, yeni bir eleman eklemek iin birtakm algoritmik yntemler uygulamanz gerekir. Ya da diziden bir eleman kardnz zaman, dier elemanlar birer basmak geri kaydrmak gibi birtakm ileri de yapmanz gerekir. ArrayList snf bu tr grevleri otomatik olarak yapan ve bize dinamik olarak kullanabileceimiz bir dizi mekanizmas sunan bir snftr. Eer byle bir diziye sahip olmak istiyorsanz aadaki ekilde bir ArrayList nesnesi tanmlamanz gerekir: ArrayList dinamikDizi = new ArrayList(); Daha sonra bu nesneyi artk kendi dizinimi gibi dnerek ArrayList snfnn sunduu metodlar yardmyla eleman ekleme, kartma ve bulma gibi ilemler yapabilirsiniz. Mesela dinamikDizi nesnesine eleman eklemek iin: [Link](merhaba); ya da int a = 3; [Link](a);
58
ArrayList snfnn yukarda grdmz gibi add isimli metodunun yansra dier metodlarndan bazlar da unlardr:
Dizinin verilen indeks numarasndaki elemann kartr ve diziyi buna gre dzenler. rnek kullanm: int a = [Link](2); //[Link] siliniyor Dizinin ierisindeki elelman saysn verir. rnek kullanm: int a = [Link](); Dizinin index nolu elemann geri dndrr. rnek kullanm: String str = [Link](0); o ile temsil edilen nesnenin dizi ierisindeki indeks nuaarasn geri dndrr. Eer eleman dizide yoksa -1 geri dndrr.
Aadaki [Link] uygulamamzda hem byle bir dinamik dizi kullanmn, hem de bugne kadar rendiklerimizle geree olduka yakn bir java uygulamasnn yazmn grmekteyiz. Bu uygulama altnda, ekrana resimdeki gibi bir men sunulmakta ve kullancnn yapt seimlerle kayt ekleme, silme, kaytlar listeleme gibi ilemler yapldktan sonra tekrar ayn men ekrana gelmektedir. Kullancya istedii zaman programdan kabilecei bir seenek de sunulmaktadr.
59
60
[Link] Uygulamasndaki Nesne Ynelimli Programclk zleri Uygulamamz ierisinde , her seime ilikin bir metod uygun ii stlenmektedir. Ayrca tm alt grevleriyle ve deikenleriyle birlikte bu uygulama tek bir snf altnda ve tek bir ama iin oluturulmutur. Programlarnzda bu ekilde i blm yapma ilemi nesne ynelimli programcln balca presiplerinden birisidir. Yazm olduumuz bu uygulama tek bir snf nesnesi olarak tasarlanm ve 106. satrdaki main metodu ierisinde de bir deiken araclyla altrlmtr. Ayrca dikkat ederseniz uygulamamzn baz metodlar private olarak tasarlanmtr. Bunun nedeni; bu metodlarn i mekanizma ileyii iin kullanlyor olmasdr. Yani 109. satrda olduu gibi kullanc, bu snfn uygulamaBaslat metodunu arabilmeli ancak dier metodlarn aramamaldr. Bu metodlarn hangi srada ve ne zaman arlaca program ierisinde snfn kendisi tarafndan ve uygun bir hiyerari ile belirlenmektedir. Bu nedenle, bir deiken zerinden eriilmemesi istenen metodlar private olarak tasarlanmtr. Bylece bu metodlara, sadece snfn dier metodlarnn eriebilmesine izin verilmektedir. Kullancnn hizmetine ise sadece public metodlar sunulmaktadr. StringBuffer Snf: Daha nceki derslerimizde rendiimiz zere String snf baz yararl metodlara sahiptir. Hatta bu metodlardan equals ve matches isimli olanlarn da, [Link] uygulamamzda [Link] ve toUpperCase isimli olan da 37. satrda kullanmaktayz. Bu metodlar sayesinde eitli kolaylklar olan String trnde deikenlerin ierikleri sabit uzunluktadr. Bu nedenle ierii de dinamik olarak deitirilebilen bir snf trne ihtiya duyulmaktadr. Bu amala StringBuffer isimli snf kullanlabilir. StringBuffer snf kullanlmadan nce bu snf trnden bir nesne yaratlmaldr: StringBuffer strbuffer = new StringBuffer(); Bu ekilde, ierisinde hi karakter tutmayan ve 16 karakter kapasiteli bir StringBuffer nesnesi yaratlabilir. Bu snfn baka balang metodlar da vardr. Mesela 20 karakter kapasiteli bir nesne yaratmak iin: StringBuffer strBuf = new StringBuffer(20); Ya da hazr bir String deikenini StringBuffer halinde yaratmak iin: StringBuffer str = new StringBuffer(Merhaba); yazmak gerekir. Bu snf ierisinde tutulan String deerinin String olarak kullanlabilmesi iin, snfa ait olan toString metodu kullanlabilir. Mesela az nce Merhaba String deeri ile yaratm olduumuz str isimli StringBuffer nesnesinin String deeri: String a = [Link](); eklinde elde edilebilir. Bu snfn sahip olduu baz metodlar unlardr: StringBuffer append(String) StringBuffer nesnesi ierisinde tutulan String sonuna parametre ile verilen String deerini ekler ve bu yeni hali StringBuffer nesnesi olarak geri dndrr. Bu metodun int, float, double, char [] parametreli versiyonlar da vardr. Nesnenin sahip olduu karakter kapasitesini verir. Nesnenin kapasitesini minCapacity parametresi ile verilen deer haline getirir. Nesnenin tuttuu String deeri ierisinde verilen indekste yar alan karakteri geri dndrr. Nesnenin ierisinde tutulan String deerininin ters evrilmi halini geri dndrr.
int capacity() void ensureCapacity(int minCapacity) char charAt(int index) StringBuffer reverse()
61
Ancak yine de hatrlatmak isterim ki StringBuffer snfnn daha birok metodu vardr. Dier metodlar her zaman sylediim gibi Java dkmantasyonu ierisinde bulabilirsiniz.
NumberFormat ve DecimalFormat Snf: kn Biimlendirilmesi Aadaki gibi bir numerik hesap yaptktan sonra x = 10000.0/3; [Link](x) metodu yardmyla bu sonucu ekranda grntleyebiliriz. Ancak ekrana gelecek olan bu grnt 3333.333333335 eklinde olacaktr. Oysa biz kn daha anlaml olmasn isteyebiliriz. Bunun iin DecimalFormat snfndan yararlanyoruz. import [Link]; public class Main { public static void main(String[] args) { DecimalFormat formatter = new DecimalFormat("0.0000 YTL"); double x = 100.0/3.0; [Link](x); [Link]([Link](x));
} }
Ayrca sistemde tanml olan yerel say, para birimi (currency) gibi deerleri kullanmak iin de NumberFormat snfndan yararlanabiliyoruz. import [Link]; import [Link].*; public class Main { public static void main(String[] args) { NumberFormat formatter = [Link](); [Link](4); [Link](6); [Link](6);
GregorianCalendar Snf Javada tarihlerle ilgili ilemler yapmak iin kullanlabilecek 2 tane snf vardr. Tarihte herhangi bir noktayi ifade etmek iin Date snf kullanlabilir. import [Link]; public class Main { public static void main(String[] args) {
62
Date d1 = new Date(); [Link](1999-1900); [Link](12); [Link](0); Date d2 = new Date(); [Link]([Link]()); //1,1,1970 den bugune kadar gecen milisaniye if([Link](d2)) [Link](d1 + " tarihi, geliyor"); [Link](d1 + "\n" + d2);
} }
GregorianCalendar snf, Date snfndan daha fazla metoda sahiptir. GregorianCalendar ile kullanabileceiniz balang metodlar: new GregorianCalendar() new GregorianCalendar(1999, 11, 31); new GregorianCalendar(1999, [Link], 31, 23, 59, 59) GregorianCalnedar kullanarak zaman elde etme ve istediimiz gibi deitirmeye ilikin temel metodlar unlardr: GregorianCalendar simdi = new GregorianCalendar(); int month = [Link]([Link]); [Link]([Link], 3); [Link]([Link], 3);
import [Link]; import [Link]; public class Main { public static void main(String[] args) {
GregorianCalendar simdi = new GregorianCalendar(); int int int int int int int + " " + yil); [Link]("Saat: " + saat + ":" + } dakika + ":" + saniye); ay = [Link]([Link]); gun = [Link](Calendar.DAY_OF_WEEK); yil = [Link]([Link]); tarih = [Link]([Link]); saat = [Link]([Link]); dakika = [Link]([Link]); saniye = [Link]([Link]); hangiAy(ay) + " " + hangiGun(gun)
63
switch (n) { case 0: return case 1: return case 2: return case 3: return case 4: return case 5: return case 6: return case 7: return case 8: return case 9: return case 10: return case 11: return }
"Ocak"; "Subat"; "Mart"; "Nisan"; "Mayis"; "Haziran"; "Temmuz"; "Agustos"; "Eylul"; "Ekim"; "Kasm"; "Aralk";
switch (n) { case 1: return case 2: return case 3: return case 4: return case 5: return case 6: return case 7: return }
ODEV: Dinamik buyuyen int array dizisini double, String ve int turleri icin genellestirip gerekli tum metodlari da barindiran bir DinamicArray nesnesi yaratiniz. nmzdeki derste Snflarn Tretilmesi konusunu detayl bir ekilde inceleyeceiz.
64
Stringler Daha nce de ska kullandmz String trnde deikenler aslnda ilkel deikenlerden biraz daha farkldr. Burada ilkel kelimesinden kast her dilde tanml olan ve javada da yer alan en temel deikenlerdir. Javada Stringler bu temel olma durumunun biraz daha stnde nesnelerdir. Zaten String nesnelerinin kendilerine ait baz metodlarn olmas da bu durumu aka gstermektedir. Teknik olarak Stringler karakter dizileridir. Bir String nesnesi ile kullanlabilecek zel metodlar yle listelyebiliriz: int length(): Nesnenin ierisindeki karakter uzunluunu verir. char charAt(int index): Nesne ierisinde istenen indexteki karakteri verir. String substring(int start, int end): start ve end indeksleri arasndaki kk string parasn verir. String toUpperCase(): String nesnesinin tm karakterlerini byk harfe evirir. String toLowerCase(): String nesnesinin tm karakterlerini kk harfe evirir. String trim(): String nesnesi iersindeki boluklar ortadan kaldrr ve yeni bvir string retir. int indexOf(String str): String nesnesi ierisinde str string parasn arar ve bulduu ilk indexi gnderir. h) boolean equals(String str): String nesnesini parametre olarak verilen str ile karlatrr. Eitlik durumunda true, dier durumda false deerinin retir. i) boolean equalsIgnoreCase(String str): equals ile ayn ii yapar ama byk kk harf durumuna dikkat etmez. j) String valueOf(int a): Verilen ilkel tipi Stringe evirir. Parametresi dier trleri de alabilir. ok Boyutlu Diziler ok boyutlu diziler aslnda her eleman baka bir dizi olan dizilere ok boyutlu diziler denilir. a) b) c) d) e) f) g)
ODEV 1) Bir ift boyutlu dizinin tm elemanlarinin toplamini bulan bir metod yaziniz: a. nt findTotal(int arr[][]); 2) Verilen bir ift boyutlu diziyi dortgn haline getiren bir metod yaziniz. Verilen dizinin her elemani ayni uzunlukta olmayabilir. a. nt [][] makeSquare(int arr[][]);
65
Odev: Magic Square bulma Bir cift boyutlu dizi eger her satirinin toplami, her sutunun toplami ve her iki ana diagonalin toplami esitse ve dizi kare ise (satir ve sutun sayisi esit) bu dizi magictir. Bu islemi yapan ve prototipi public static boolean isMagic(int array[][]) bir metod yaziniz. pucu: Programi parcalara bolunuz. Mesela sadece tek boyutlu bir dizinin toplamini bulan ya da bir cift boyutlu dizinin sadece i. Sutunun toplamini bulan ya da bir cift boyutlu diznizn sadece 1. ya da sadece 2. ana diagonalinin toplamini bulan metdolari ayri ayri tasarlayiniz ve daha sonra bunlari ana programda kullaniniz.
Snflarn Tretilmesi Snflarn tretilmesi kavramn yle bir rnekle aklamaya alalm: Diyelim ki ok byk bir programlama projesinin bir ksmnda grev aldnz. yle ki sizin yapmanz gereken ksm bir ekran zerine yerletirilecek olan seenek dmelerinin tasarm olsun. Ancak bu ilemi yapabilmeniz iin elinizde hereyden nce bir ekran grntsnn olmas lazm. O halde ncelikle bir ekran grnts oluturan program paras, ya da artk yeni rendiimiz kavramlara dayanarak, temel ekran ilemlerini barndran snf olmas gerekmektedir. Ancak sizin asl iiniz olmadndan, ekran ilemlerine ilikin bir snf yazmanz ve daha sonra da kendi dmelerinizi de bu snf ierisine eklemeniz gereksiz bir i olacaktr. Ayrca bu ekran ilemleri gibi temel nitelie sahip ve sizin dnzda dier kiilerin de baka ilemler iin ihtiya duyabilecei bir snf kendi bana ayr bir ekilde tasarlanmaldr. Eer bu snfn temel zelliklerini koruyarak, zerine herkesin ihtiya duyaca yeni zelliklerle birlikte yeni bir snf haline getirilecei bir mekanizma olursa, nceden harcanan emek de yeni ilemler iin temel tekil edecek nitelikte olup, gereksiz i gc kayb engellenmi olacaktr. te Java'da bu mekanizmaya snflarn tretilmesi denilir. ekilde tretme iilikisine ilikin bir rnek yer almaktadr.
66
Buna gre ekildeki TemelSiniftan tretilen Sinif 1 ve Sinif 2 isimli snflarn ilevleri Temel Snfn ilevlerini de iermektedir. Buna gre Sinif 1; kendi ierisinde yer alan x, y ve z deikenleri ile X metodunun yan sra, TemeSinif dan tredii iin a,b deikenleri ile A, B metodlarna da sahip olmaktadr. Benzer ekilde Sinif 2, kendisinde yer alan k deikeni ile K, L ve metodlar ve tretme ilikisi yznden a, b deikenleri ile A ve B metodlarna da sahip olmaktadr. ekilde bu tretme ilikisinin Sinif 1 ve Sinif 2 den TemelSinifa doru giden oklarla gsterilmesi bir yanllk deil, kasten yaplmaktadr. Nesne ynelimli programlamada tretme ilikisi genellikle bu ekilde, yani, tretilmi snftan tretilen snfa doru gsterilmektedir. rnek Uygulama 1 O halde kavramsal olarak incelediimiz tretme ilemini bir de uygulamal olarak grelim. [Link], [Link] ve [Link] dosyalarndan oluan klasik rnekte bir kii kaydn temsil eden bir snftan, bir renci kaydn temsil eden farkl bir snf tretilmektedir. class Kisi { String isim; String adres; char cinsiyet; public Kisi(String gelenIsim, char gelenCinsiyet, String gelenAdres) { [Link](gelenIsim); [Link](gelenAdres); [Link](gelenCinsiyet); } public void isimSetEt(String yeniIsim) { [Link] = [Link](); }
67
public void adresSetEt(String yeniAdres) { [Link] = [Link](); } public void cinsiyetSetEt(char gCinsiyet) { if(gCinsiyet != 'e' && gCinsiyet != 'k') { [Link]("Cinsiyet bilgisi \"e\" ya da \"k\" olmali."); [Link]("Yanlis bir deger girdiniz..."); [Link]("Program sonlaniyor"); [Link](0); } else [Link] = gCinsiyet; } public String ismiGetir() { return [Link]; } public String adresiGetir() { return [Link]; } public char cinsiyetiGetir() { return [Link]; } public String toString() { String str=""; str str str str } } rnekte, tretme ilemine maruz kalan snfn Ogrenci isimli snf olduunu grmekteyiz. Bu nedenle Ogrenci isimli snf yaratlrken snf bildiriminin devamna extends anahtar szc ve daha sonra da bu snfn tretildii temel snf olan Kisi snfnn ad yazlmaktadr. class Ogrenci extends Kisi { String bolum; int donem; public Ogrenci(String ad, char cns, String adr, String blm, int dnm) { super(ad, cns, adr); [Link](blm); [Link](dnm); } public String bolumuGetir() { return [Link]; } += += += += "Kisi Bilgileri\n"; "Isim: "+[Link]()+"\n"; "Cinsiyet :"+[Link]()+"\n"; "Adres: "+[Link]()+"\n";
return str;
68
public void bolumSetEt(String yBolum) { [Link] = [Link](); } public int donemiGetir() { return [Link]; } public void donemiSetEt(int yDonem) { [Link] = yDonem; } public String toString() { String str = [Link](); str += "Bolum: "+[Link]()+"\n"; str += "Donem: "+[Link]()+"\n"; return str; } } Bylece Ogrenci snf artk ayn zamanda bir Kisi snf haline gelmi ve kendi deiken ve metodlarnn yan sra, Kisi snfnn deiken ve metodlarna da sahip olmutur. Bu nedenle Ogrenci snfn yazarken bir daha isim, cinsiyet ve adres deikenleri ve bu deikenler ile ilgilenen gerekli metodlar yazmaya gerek yoktur. class KisiDeneme { public static void main(String arg[]) { Ogrenci o1 = new Ogrenci("Dogac Berkun", 'e', "Kurtulus Cd. No 24", "Bilgisayar Bilimleri", 2); [Link](o1); [Link](3); [Link](o1); } } [Link] dosyasndaki main metodu ierisinde en son oluturduumuz Ogrenci snfn kullanarak bir nesne yaratmaktayz. Daha sonra da nceden rendiimiz toString metodu ilevinden yararlanarak (bkz. Blm 6) oluturduumuz bu Ogrenci trnden nesneyi ekrana basmaktayz. Snflarda super Metodu: En son yazdmz Ogrenci snfnn balang metodu ierisinde super isimli ilgin bir metod kullanlmaktadr. Oysa Ogrenci isimli snfn byle bir metodu yoktur. O halde hi yazlmam olan bu metod nedir? Baka bir snftan tretilmi olan snflarda, super ile temsil edilen metod, tretmenin yapld snfn balang metodunu temsil etmektedir. O halde bizim rneimizde [Link] dosyasnn 7. satrndaki super(ad, cns, adr); kullanm ile Ogrenci snfnn tredii Kisi snfnn uygun parametreli balang metodunun arldn syleyebiliriz. Bylece [Link] dosyasnda kullanc Ogrenci nesnesini yaratrken, aslnda arka planda, bu Ogrenci nesnesinin ierisinde yer alan Kisi nesnesine ait ksmlar, Kisi nesnesinin balang metodu ile oluturulmakta ve daha sonra da Ogrenci nesnesinin kendisine ait olan ksmlar oluturulmaktadr. Fakat bu ilemlerin hepsi neticede Ogrenci nesnesinin balang metodu ierisinde yaplmaktadr. Ogrenci nesnesi Kisi nesnesinden tredii iin, bnyesinde Kisi nesnesine ait ksmlar da barndrmakta ve dolays ile super metodu yardmyla gerektiinde Kisi nesnesinin balang metodlarna ya da [Link] dosyasnn 29. satrnda olduu gibi Kisi nesnesini baka metod ve deikenlerine erime hakkna sahip olmaktadr.
69
rnek Uygulama 2 imdi rneimizi biraz daha genelletirelim ve bu sefer ierisinde renci2 snf trnden nesneleri tutan ve bu nesneler ile ilgili eitli ilemler yapan bir Kayitlar isimli bir snf tasarlayalm.
class Kisi2 { String isim; char cinsiyet; public Kisi2(String gelenIsim, char gelenCinsiyet) { [Link](gelenIsim); [Link](gelenCinsiyet); } public void isimSetEt(String yeniIsim) { [Link] = [Link](); } public void cinsiyetSetEt(char gCinsiyet) { if(gCinsiyet != 'e' && gCinsiyet != 'k') { [Link]("Cinsiyet bilgisi \"e\" ya da \"k\" olmali."); [Link]("Yanlis bir deger girdiniz..."); [Link]("Program sonlaniyor"); [Link](0); } else [Link] = gCinsiyet; } public String ismiGetir() { return [Link]; } public char cinsiyetiGetir() { return [Link]; } public String toString() { String str=""; str += "Kisi Bilgileri\n"; str += "Isim: "+[Link]()+"\n"; str += "Cinsiyet :"+[Link]()+"\n"; return str; } }
class Ogrenci2 extends Kisi2 { String bolum; int donem; int ogrenci_no; String ortalama;
70
public Ogrenci2(String ad, char cns, String blm, int dnm, int ogrNo, double ort) { super(ad, cns); [Link](blm); [Link](dnm); [Link](ogrNo); [Link](ort); } public String bolumuGetir() { return [Link]; } public void bolumSetEt(String yBolum) { [Link] = [Link](); } public int donemiGetir() { return [Link]; } public void donemiSetEt(int yDonem) { [Link] = yDonem; } public int numarayiGetir() { return this.ogrenci_no; } public void numaraSetEt(int ogrNo) { this.ogrenci_no = ogrNo; } public String ortalamayiGetir() { return [Link]; } public void ortalamaSetEt(double yeniOrt) { if(yeniOrt < 1.0) [Link] = "F"; else if(yeniOrt >= 1.0 && yeniOrt < 1.5) [Link] = "D"; else if(yeniOrt >= 1.5 && yeniOrt<2.0) [Link] = "C"; else if(yeniOrt >= 2.0 && yeniOrt<3.6) [Link] = "B"; else if(yeniOrt >= 3.6 && yeniOrt <= 4.0) [Link] = "A"; } public String toString() { String str = [Link](); str += "Bolum: "+[Link]()+"\n"; str += "Donem: "+[Link]()+"\n"; str += "Ogrenci No: "+[Link]()+"\n"; str += "Ortalamasi: "+[Link]()+"\n"; return str; } }
71
class Kayitlar { Ogrenci2 dizi[]; public Kayitlar() { } public Kayitlar(Ogrenci2 yeniEleman) { [Link] = new Ogrenci2[1]; [Link][0] = yeniEleman; } public void ekle(Ogrenci2 eklenecekOgr) { if([Link] == null) { dizi = new Ogrenci2[1]; [Link][0] = eklenecekOgr; } else { Ogrenci2 tmp[] = new Ogrenci2[[Link]+1]; for(int i=0; i < [Link]; i++) tmp[i] = dizi[i]; tmp[[Link]-1] = eklenecekOgr; [Link] = tmp; } } public void cikart(int id) { Ogrenci2 tmp[] = new Ogrenci2[[Link]-1]; int indeks=-1; for(int i=0; i < [Link]; i++) if(dizi[i].numarayiGetir() == id) indeks = i; for(int i=0; i < indeks; i++) tmp[i] = dizi[i]; for(int i = indeks; i < [Link]-1; i++) tmp[i] = dizi[i+1]; dizi = tmp; } public void listele() { [Link]("Kayitlar listeleniyor:"); [Link]("--------------------"); for(int i=0; i < [Link]; i++)
72
[Link](""+dizi[i]); } public Ogrenci2 enBuyukOrtalamaliOgrenci() { Ogrenci2 max=dizi[0]; for(int i=0; i < [Link]; i++) { if(dizi[i].ortalamayiGetir().compareTo([Link]()) == -1) max = dizi[i]; } return max; } } class KayitlarDeneme { public static void main(String arg[]) { Kayitlar x = new Kayitlar(); [Link](new [Link](new [Link](new [Link](new [Link](new [Link](new [Link](); Ogrenci2 sonuc = [Link](); [Link]("En buyuk ortalamali ogrenci: \n"+sonuc); } } Bu snf daha nceki derslerimizde yazm olduumuz KayitListesi snfn andrmakla beraber, bu sefer snfn veri eleman bu kaytlar tutacak Ogrenci2 trnden bir dizi olacaktr. Bu arada , Ogrenci2 snf da bir nceki rnekte kullandmz Ogrenci snfna ok benzer olup sadece baz metodlar deitirilerek yeniden yazlmtr. zetle bu rnek [Link], [Link] ve [Link] dosyalarndan olumakta ve en son olarak [Link] dosyasnda altrlmaktadr. imdi de gelelim bu uygulamann detayl bir incelemesine: [Link] dosyasndaki main metodu ierisinde Kayitlar snf trnden bir nesne yaratlm ve bu nesneninin ekle isimli metodu yardmyla birtakm Ogrenci2 snf trnden nesneler hemen o anda parametre olarak yaratlarak listeye eklenmitir. Bu Ogrenci2 trnden nesneleri nce deiken olarak yaratp daha sonra ekle metdouna parametre olarak gnderebilirdik. rnein: ... Ogrenci2 o2 = new Ogrenci2("Evren Banger", 'e',"Bilgisayar", 2, 100, 2.54) [Link](o2); ... Ancak bizim kullandmz yntem hem daha pratik hem de gereksiz deikenlerden arnm bir program yazmamz salamaktadr. [Link] snfnn ierisindeki public Kayitlar(Ogrenci2 yeniEleman) Ogrenci2("Evren Banger", 'e',"Bilgisayar", 2, 100, 2.54)); Ogrenci2("Aykut Toygar", 'e',"Bilgisayar", 2, 101, 2.4)); Ogrenci2("Hande Kumek", 'k', "Bilgisayar", 3, 102, 3.5)); Ogrenci2("Ilker Kara", 'e', "Bilgisayar", 2, 103, 1.55)); Ogrenci2("Cemile Caglar", 'k',"Isletme", 4, 201, 3.7)); Ogrenci2("Erdem Aykac", 'e', "Isletme", 4, 202, 3.58));
73
prototipli balang metodu daha nce hi kayt eklenmemi durum iin tek elemanl yeni bir Ogrenci2 dizisi yaratr ve yeniEleman isimli Ogrenci2 trnden parametreyi de bu diziye ekler. Yine Kayitlar snfnn metodlarndan birisi olan ekle isimli metod da durumu iki trl ele alr. Eer daha nce hi kayt eklenmemise nce tek elemanl bir Ogrenci2 dizisi alarak bu kayt diziye eklenir (satr 16-18). Ama zaten daha nceden eklenmi kaytlar varsa o zaman ilk olarak eski diziden 1 eleman fazla uzunlukta tmp adnda yeni bir geici dizi yaratlr (satr 22), daha sonra eski dizinin tm elemanlar bu diziye de kopylanr (satr 24-25) ve en son olarak da bu tmp dizisinin fazla olan sondaki bo eleman yerinde de metoda parametre olarak gnderilen eklenecekOgr isimli Ogrenci2 nesnesi yerletirilir (satr 27). Tm bu ilemlerin sonunda da artk kaytlarn son halini tutan tmp dizisi, snfn kendi dizisi olan dizi isimli Ogrenci2 dizisine atanr (satr 28). Buna benzer olarak; snfn ckart isimli metodu da karlacak olan elemannn dizideki indeks numarasn saptadktan sonra (satr 37-39) bu elemana kadar olan ve bu elemandan sonraki tm elemanlar tmp dizisine kopyalar (satr 41-42 ve 44-45) ve tmp dizisini yine snfn asl dizisi haline getirir (satr 47). Kayitlar snfnn public Ogrenci2 enBuyukOrtalamaliOgrenci() isimli metodu ise Ogrenci2 nesnelerinin ortalamarna bakarak en yksek ortlamal Ogrenci2 nesnesini geri dn deeri olarak gnderir. Geriye dnen bu deer [Link] dosyasnda bir Ogrenci2 deikeninde tutularak (satr 16) ekrana baslr (satr 17). Burada tekrar hatrlatmak isterim ki; sonuc adndaki Ogrenci2 snf deikeni 17. satrda olduu gibi ekrana baslmak istendiinde, aslnda sonuc deikeni araclyla ve Ogrenci2 snfna ait olan toString isimli metod otomatik olarak arlmaktadr ve bu metodun hazrlayp gnderdii String trnden ifade ekrana baslmaktadr. Tabi ki bu ifadeyi hazrlayan da snf yazan kiidir. Umuyorum ki detayl olarak hazlayp anlatmaya altm bu rnek ile birlikte, snflarn tasarlanmas, baka snf ve metodlar ierisinde kullanlmas ve tretilmesine ilikin kavramlar daha rahat kavram olursunuz.
Uygulama Sorusu Yukarda verilen Kayitlar snf rneini biraz daha gelitirerek bu snfa rencileri not ortalamalarna gre, isim srlarna gre listeleyen ve sadece belirli blmlerdeki ya da belirli dnemlerdeki rencileri grntleyen metodlar ekleyiniz ve bu yeni snfn adn da Kayitlar2 olarak deitiriniz. pucu olarak; yazmanz gereken bu metodlarn prototiplerini aadaki ekilde verebiliriz: public public public public void void void void notOrtalamasinaGoreListele() isimSirasinaGoreListele() bolumdekiOgrenciler(String bolumAdi) donemdekiOgrenciler(int donem)
unu da belitmeliyim ki, Kayitlar snfna ekleyeceiniz bu metodlarn yan sra, eer gerekeceini dnyorsanz mevcut metodlarn ileyilerini ya da bu snfn ierisinde kullanlan Ogrenci2 snfnn da yine baz metodlarnn ileyiini deitirebilirsiniz.
Ornek: class TemelSinif { public void method() { [Link]("Temel sinifin metodu"); } public final void method2() { [Link]("Temel sinifin final metodu"); } }
74
class TuremisSinif1 extends TemelSinif { /*Temel sinifin metodunu override etmis*/ public void method() { [Link]("TuremisSsinif_1 sinifin metodu"); } /*Temel sinifin metodunu override etmis*/ public void method2() { [Link]("TuremisSsinif_1 sinifin final metodu"); } } class TuremisSinif2 extends TemelSinif { } class Main { public static void main(String arg[]) { TuremisSinif1 t1 = new TuremisSinif1(); TuremisSinif2 t2 = new TuremisSinif2(); TemelSinif tt = new TemelSinif(); [Link](); [Link](); tt = t1; [Link](); tt = (TemelSinif)t1; [Link]();
} }
Instanceof Ornek public static void main(String[] args) { Object ar[] = {new Student("A", 12, 1232, 2), new Sayi(13)}; for(int i = 0; i < [Link]; i++) { if(ar[i] instanceof Student) ((Student)ar[i]).m_student(); else if(ar[i] instanceof Sayi) ((Sayi)ar[i]).m_sayi();
} }
75
Snflarn protected veri elemanlar: Daha nceden biliyoruz ki snflarda private olan bir deiken ya da metod sadece kendi snfnn dier metodlar tarafndan eriilebilir haldedir. Bununla beraber public snf elemanlar, hem bu snfn dier metodlar, hem de bu snf trnden yaratlm olan nesneler tarafndan, yani dardan eriilebilir haldedir. Eer bir snfn veri eleman sadece bu snfn kendi metodlar ya da bu snftan tretilmi snflarn metodlar ile eriilebilir ancak dardan eriilemez olsun isteniyorsa, byle veri elemanlarnn protected veri eleman olarak bildirilmesi gerekir. Bu durumda protected veri elemanlarnn eriim bakmndan public ve private veri elemanlar arasnda bir seviyede olduunu syleyebiliriz.
Protected Metodlar Bir snffn baz metodlar protected olarak tasarlanabilir. Byle metodlar da sadece snf treten alt snflar ierisinde kullanlabilir ancak dardan kullanlamazlar. Bylece sadece tretme yapan snflara gveniliyorsa ve darya kapatlmak isteniyora bir metod protected olarak tasarlanabillir. Bunun bir rneini ileriki konularda greceimiz Object snfnn protected metdu olan clone metodunu incelreken greceiz. Object Snf u ana kadar snflarn tretilmesine ilikin birok ey rendik. O halde artk Java da temel bir snf olan Object snfn da inceleyebiliriz. Javada her ey bir nesnedir. Aslnda bu tanm hem kavramsal hem de teknik anlamda dorudur. Kavramsal olarak Javada hereyin bir nesne olduunu zaten bu noktaya kadar tarttk. Teknik olarak da Javada hereyin bir nesne olmas, Javadaki tm tanml snflarn aslnda Object ad verilen zel bir snftan tremesi anlamna gelmektedir. yle ki sizin yazdnz bir snf da aslnda ntanml olarak Object isimli snftan tremitir.
76
Object Snfnn Metodlarnn Yeniden Yazlmas Ayrca daha nce renmi olduumuz function overriding kendi yarattmz snflarda Object snfnn baz metodlarn kendi isteimize gre snfmz ierisinde deitirerek yazabiliriz. Aslnda toString isimli metodun byle bir metod olduunu bu noktada belirtmek gerekir.
Object snfnn toString Metodu toString metodu Object snfnda yazlm olan bir metoddur. Ancak daha nce de sylediimiz gibi Javada yazlan her snf, hatta bizim kendi yazdmz snflar da dahil, birer Object snf kabul edildiinden (yani otomatik olarak bu snftan trediinden), Object snfna ait olan bu metodlar kendi bamza yazabiliriz.
Object snfnn finalize Metodu finalize() isimli metod da Object snfna ait bir metoddur. Bu metodu da kendi snfmza gre yazabiliriz. Ancak daha nce bu metodun ne ier yaradn bilmekte fayda var. nceden rendiimiz gibi bir snf yaratld zaman otomatik olarak uygun olan balang metodu (constructor) arlmaktadr. Ayrca sistemde kullanlmayan nesnlerin de garbage collector yaps ile otomatik olarak ortadan aldrldn da sylemitik. te snflarda benzer ekilde bir snf ortadan kaldrlrken, yani ilevi sonlandrlrken de otomatik olarak alrlan bir metod vardr. Bu metod finalize() isimli bir metoddur. O halde nasl balang metodu ierisine snfmzn birtakm ilk ilemlerini yazyorsak, finalize metodu ierisine de bir snf sonlanrken yaplmas gereken son ilemleri tanmlayabiliriz. Bu son ilemlere rnek olarak: a) b) c) d) Daha nce alm bir dosyann kapatlmas Daha nce yaplm bir veri tabannn sonlandrlmas Daha nce alm bir sessionn sonlandrlmas Daha nceden kullanlan birtakm geici deikenlerin sonlandrlmas
verilebilir.
Ancak unu da belirtmek gerekir ki Javada finzlize metodu Garbage Collector devreye girdii zaman arld iin bu metodu tam olarak ne zaman arlaca bilinemez. Bu nedenle bazen ngrlemeyen sonular ortaya kabilir. O halde sonu olarak kullanc aslnda kendi istedii zaman arabilecei birtakm son ilemleri yapacak bir metodu yine kendisi baka bir isimle yazabilir. Bylece son ilemler doru srada ve kullancnn isteine bal olarak yaplacaktr. Bu da finalize metoduna olan gereklilii ortadan kaldrmaktadr.
Bunun dnda Object snfnda baka metodlar da vardr. Ancak bu metodlar ilerde reneceimiz baz kavramlar gerektirdiinden imdilik Object snfna bu kadar deineceiz. Object Snfna Her Nesne Atanabilir Javada hereyin bir Object olduunu tekrar hatrlayalm. Aslnda Object isimli snf trnden bir deikenin bu nedenle her trden nesneyi tutabileceini de syleyebiliriz. public class ObjectOrnek { public static void main(String[] args) { Object dizi[] = new Object[3]; dizi[0] = "string nesnesi"; dizi[1] = new Integer(13); dizi[2] = new Deneme(); }
77
} class Deneme {
} Yukardaki rnekte Object trnden bir dizi yarattk. Bir dizi ierisinde tm elemanlarn ayn trden olmas gerektii halde birbirinden farkl trleri nasl oluyor da bir dizide saklayabiliyoruz? te bunun nedeni az nce syledim gibi aslnda her trn ayn zaman bir Object olmasndan kaynaklanmaktadr.
Object ar[] = {new Deneme(), "String ekledik", new Integer(12), new BaskaBirSinif()}; BaskaBirSinif temp = (BaskaBirSinif)ar[3]; [Link]([Link]()); /*Olmaz!*/ //ar[3].methodX();
} } class Deneme { public static void methodY() { [Link]("Deneme sinifi"); } } class BaskaBirSinif { public static String methodX() { return "12"; } }
Soyut snflar Soyut snf kavram aslnda tamamen tretme ile ilikilidir. Bu nedenle soyut snflarn anlaml kullanlmas aslnda bir tretme ileminin yaplmasn gerektirir. Tretme ilemini hatrlayacamz gibi bir snf baka bir snfnn deiken ve metodlarn alabilmektedir. Bylece nceden yazlm birtakm metod ve deikenlerin yerald bir snf varsa ve biz de bu metod ve deikenlere ihtiya duyuyor ve ayn zamanda yeni metod ya da deikenler de eklemek istiyorsak, mevcut snftan bir tretme yaparak sadece yeni eklemek istediimiz metod ve deikenleri yazmamz yeterli olacaktr. Bir snf ierisinde daha nce grm olduumuz metod tanmlamalarndan farkl olarak soyut metod denilen bir metod ekli daha vardr. Bir metod soyut olarak yazlacaksa metod prototipinde public, private ya da protected
78
anahtar szcnden sonra abstract anahtar szc yazlmadr. Ayrca snf ierisinde bu ekilde prototipi yazlan soyut metodun ierisine de hibirey yazlmaz. rnein: public abstract String ismiVer(); Yukardaki rnekte bir soyut metod bildirimi yaplm ve ierisi yazlmadan noktal virgl ile bildirim tamalanmtr. kinci kural olarak da ierisinde soyut metod barndran bir snftan tretilen yeni bir snf, bu soyut metodun ierisini kendi iinde yazmak zorundadr. Aksi takdirde tretme ilemi hatal saylr. Sonu olarak: Soyut bir metodun temel snf ierisinde sadece prototipi yazlr. Bu temel snftan treyen bir snf sadece prototipi yazm olan bu soyut metodu kendi ierisinde tamamen yazmak zorundadr. erisinde soyut metod barndran snflara soyut snf denilir ve byle bir snfn bildiriminin bana Class anahtar szcnden nce abstract yazlmak zorundadr. Peki ama soyut metodlarn bu kullanm ne ie yarar? Snf bildirimi ierisinde yazlm olan soyut metodlarn nasl alaca, ancak bu snftan tretilen snflar ierisinde yazlmaktadr. Temel snf ierisinde bu metodlarn nasl ileyeceklerinden ziyade geri dn deerlerinin ve parametrelerinin ne olduklar yazlr. O halde ierisinde soyut metodlar barndran bir snftan tretme yapldnda, ondan treyen her snf ierisinde bu metodun yeniden yazlmas gerekecek ve dolaysyla bu snftan treyen tm snflarn byle bir metod barndraca garanti edilmi olacaktr. Bylece birok kiinin grev ald byk bir projede yazlmas kesinlikle gerekli olan ancak sadece ileyii deiebilen metodlar temel bir snf ierisinde soyut olarak tanmlarsak ve yazlacak tm yeni snflarn da bu temel snftan tretilerek yazlmasn art koarsak, herhangi bir kontrole gerek kalmakszn yazlmas zorunlu olan bu metodlarn birbirinden bamsz kiilerin tasarlayaca tm snflarda kesinlikle yer alacandan emin olabiliriz. Bu durum aadaki ekilde de zetlenmitir:
Bylece kavramsal olarak soyut metod ve soyut snfn ne olduunu yeterince incelediimizi dnyorum. imdi yukarda okuduklarmz pekitiren bir rnek yapalm. Bu rnekte soyut metod kullanmn ieridii gibi aslnda tretme ileminin de gzel bir kullanmn gstermektedir. rneimizde en temel olarak Sekil adnda bir snf yeralmaktadr. Bu snf tm geometrik ekillerin temelini tekil ettiinden ierisinde yer alacak olan alanHesapla, cevreHesapla, kenarSayisiVer gibi metodlarn yazlmas anlamszdr. Ancak bir geometrik ekil bu metodlara sahip olmaldr. O halde biz Sekil snfnnn bu metodlarn soyut olarak tasarlayp gerekli olan geometrik ekile ilikin bir snf da bu snftan tretirsek, soyut olan bu metodlar
79
ilgili eklin zelliklerine gre yeniden yazabiliriz. Bu dnceyle de rneimizde Sekil snfndan treyen Kare, Ucgen ve Daire snflarn da yazmaktayz:
80
Java ile Programlama Arayzler Arayzler aslnda teknik olarak bir snfn ne yapmas gerektiini anlatmaktadr. Yani aynen soyut snflarda olduu gibi, temel bir snfn operasyonlarn tanmlamak amacyla tm metodlarnn soyut olmas soncunda arayzler meydana gelir. Bu bak asyla ir arayzn aslnda tam anlamyla bir snf olmaktan ziyade yaplmas gerkenler listesi olarak tanmlanmas da mmkndr.
Nesneler arasndaki byklk kklk kriterinin nemi Bunu u temel rnekler aklayabiliriz. Daha nceki derslerimizde de rendiimiz gibi belirli nesneler zerinde bir sraya dizme ilemi yaplabilmesi iin bu nesnlerim birbirleri arasnda bir byklk-kklk ilikisinin tanml olmas gerekir. lkel veri tipleri iin bu iliki zaten > ya da < operatr ile kolaylkla anlalabilmektedir. Ancak bizim yarattmz nesneler zerinde (mesela Student ya da Dortgen snflar gibi) doal bir byklk kklk kriteri yoktur. nk java asndan bu nesnelerin mantksal olarak ne ie yaradklar bilinemez. O halde biz byklk kriterini de iercek compareTo ismli baz metodlar yazarz. Bu metodlar yardmyla da bu kriteri kullanur ve bylece nesneleri sralayabiliriz.
Comparable Arayz te bu ilem iin java programlama dili ierisinde Comparable adnda bir arayz tanmlanmtr. public interface Comparable { int compareTo(Object other); } Bu arayz bize kendisinde tretilen bir snfn ierisinde bu compareTo metodunun zorunlu olarak yazlmas gerektiini anlatr. Ayrca bir nesne eer bu arayzden tretilirse, yine java ierisinde zaten ntanml olarak kullanlan Arrays isimli snfn sort metodu yardmyla bu snf trnden nesneler de otomatik olarak sralanabilecektir. NOT: Arrays isimli snf genel olarak ierisinde birok statik metod barndran ve dizi ilemleri yapmay kolaylatran bir snftr.
Comparabledan tretme neden gerekli? Peki ama biz zaten kendimiz istediimiz bir snf ierisine compareTo metodu ekleyebileceksek o halde neden snfmz Comparable nesnesinden tretelim ki?? Bunun nedeni [Link] metodu ierisinde bir yerlerde a[i].compareTo(a[j]) gibi bir kod yazmaktadr. O halde bu metoda gonderilen bir nesne dizisinin ierindeki her nesnenin comparTo metodu olduu garanti edilmelidir. Bunun da tek yolu sizin gonderdiginiz ve sralanmasn istediiniz bu nesnelerin Comparable arayznden tretilmi olmalardr. Arayzlerin zellikleri 1) Arayzler ile instance yaratlamaz Teknik olarak aryzleri ierisinde hibir metod yazlmadndan bir aryz nesnesini dorudan yaratmak hataya neden olur. Yani aadaki gibi bir kod geersizdir: Comparable x = new Comparable(); 2) Arayzler ierisndeki deikenler sabit olmaldr Arayzlerde yaratlan metodlarn ierinde yerletirilen deikenler her zman public static final kabul edilirler.
81
3) Birden fazla arayzden tretme Nir nf normalde en fazla bir snf tretebilir. Ancak birde fazla snftan tretme yapmamn tek yolu kullanlan teme snflardan sadece birtanesinin snf, dierlerinin ise arayz olmas gerekir. rnein Comparable gibi bir de Movable isimli bir arayzn varln kabul edersek, Student isimli bir snf Person isimli bir snftan tretme ve Comparable ile Movable isimli arayzlerden de implement tyaparak aslnda birden fazla snftan tretme yapabilir: class Student extends Person implements Comparable, Moveable public int compareTo(Object obj2) { } public void move(double x, double y) { }
}
Nesne Klonlama Java da yaratlan bir snf nesnesinin bir baka snf deikenine kopyalanildiini ve hatta temel snf trnden bir deikene tremi snflarn da atnabildiini ve buna ilikin detaylar nceki derslerimizde grmtk. Ancak bir snf nesnesi bir baka snf deikenine kopyalandnda aslnda iki deikenin de hafzada ayn nesneye iaret ettiklerine ve bu nedenle de birinci deiken zerinde deiiklik yapldnda aslnda ikiniciyi de deitirdiimizi belirtmek gerekir. Aadaki rnei inceleyiniz: = operatr ile aslnda nesneyi deil, adresini kopyalarz. class Person { String name; public Person(String name) { [Link] = name; } public String toString() { return [Link]; } public void setName(String new_name) { [Link] = new_name; } public static void main(String[] args) { Person p1 = new Person("Hakan Gozutok"); Person p2 = p1; [Link]("Birinci nesne icersindeki isim: " + p1); [Link]("Birinci nesne icersindeki isim: " + p2); [Link]("Caglar Aytek"); //p1 iersindeki isim degistirilmedigi halde Caglar Aytek //olacaktir [Link]("Birinci nesne icersindeki isim: " + p1); [Link]("Birinci nesne icersindeki isim: " + p2);
} } 82
Bu ekilde meydana gelen deiimden kurtulmak ve gerek anlamda nesnenin tam bir kopyasn almak iin nesnenin klonlanmas gerekir. Yarattmz her nesne aslnda bir Object tir. Bunu daha nce renmitik. te Object snf ierisinde yer alan clone() isimli bir metod bir nesnenin tam bir kopyasnn baka bir nesne eklinde klonlanmasn salar. Ancak bu ilem sanld kadar basit deildir. Bunu aadaki rnek ile aklayalm: Bir snfn rneklerini, dorudan clone metodu ile sadece kendi ierinde kopyalayabiliriz
class Person {
String name; public Person(String name) { [Link] = name; } public String toString() { return [Link]; } public void setName(String new_name) { [Link] = new_name; } public static void main(String[] args) { Person p1 = new Person("Hakan Gozutok"); Person p2 = p1; [Link]("Birinci nesne icersindeki isim: " + p1); [Link](" kinci nesne icersindeki isim: " + p2); [Link]("Caglar Aytek"); //p1 iersindeki isim degistirilmedigi halde Caglar Aytek //olacaktir [Link]("Birinci nesne icersindeki isim: " + p1); [Link](" kinci nesne icersindeki isim: " + p2); Person p3 = new Person(""); try { p3 = (Person)[Link](); } catch (Exception e) {}; [Link]("Ahmet Aykac"); [Link]("Birinci nesne icersindeki isim: " + p1); [Link]("Ucuncu nesne icersindeki isim: " + p3); }
}
Nesneleri, kendileri dnda baka metodlar ierisinde dorudan klonlamak mmkn deildir. Yukarda anlattmz klonlama ileminde aslnda clone metodu ile nesneyi kopyalrken kendi snf ierisinde bu ilemi yaptk. Oysa tamamen snfn dnda daha nceden yaratlm bir snf trnden rnei kolnlamaya kalktmz dnelim. Bu sefer ilem yaplamayacaktr. nk klonlanmak istenen bu snfn Cloneable arayznden implement edilmesi arttr. Ayrca bu ilemde bir checked exception meydana gelir (Checked Exception ileriki koularda ele alnacaktr. imdilik sadece ele alnmas zorunlu olan exceptionlar olarak tanmlayabilriiz.)
83
Bir nesnenin heryerde klonlanabilir olmasn salamak Byle durumlarda lgili nesne Cloneable arayznden implement edilir ve clone metodu polymorphism yntemiyle yeniden yazlabilir. Bu yeniden yazmda clone metodunun prototipi public Object clone(); eklinde yazlr. Ancak unu da belirtmek gerkir ki aslnda Cloneable arayz ierisinde hibir metod tanml deildir.
Cloneable ierisinde hibir metd yoksa neden bu snftan implementasyon yapyoruz? clone metodu aslnda Cloneable snf ierisinde tasnml bir metd deildir. Bu metod Object snf ierisinde tanmldr ve protected anahtar szc ile tanmlanmtr. Ancak yine de kullancya bilgi vermek amacyla Cloneable dan implement yaplmaktadr. Etiketleme Arayzleri NOT: Burada grdmz gibi javada baz arayzler bu kilde etiketleme amacyla kullanlr. Bu arayzlerde hi metod bulunmaz ve sadece gerektii durumlarda instanceof operatryle kullanabilmek iin implement edilirler.
NOT: Aslnda clone metodu Object snf ierisinde protected olarak tanmlanmtr. Btn snflar Object snfnn bir alt snf ise ve bir alt snf tredii snfn protected metodlarna eriebiliyorsa, o halde neden herhangi bir nesne baka nesnenin clone metoduna dorudan eriemez? Protected metod konusundan da hatrlayacamz gibi bir snf kendisinin atas olan snfn protected metoduna tretme srasnda, kendi ierisinde eriebilir. Ancak bu snfn atasnda yer alan protected metoda baka bir snf ierisinde eriilemez. Bu nedenle bir snfn baka bir snf ierisinde clone ilmeine tabi tutulmas iin bu snfn clone metodunu public olakrak yeniden bildirmesi gerekir. imdi zet olarak bir nesnenin herhangi bir yerde clone ilemine tabi tutulabilmesi iin: class A implemenrs Cloneable { public Object clone() { try { return [Link](); } } ... eklinde clone metodunu yeniden yazmas gerekir. Bylece bu nesnenin clone metodunu armak isteyen ki aslnda public olan clone metodunu arabilir. Ancak nesne ierisinde bu public clone meodu, kendi ata snfnn protected olan clone metodunu armaktadr. Ata snf ierisindeki bu clone metodu da nesnenin veri elemanlarn alan alan kopyalar ve bir nesne olarak geri dndrr.
erisinde baka snflar veri eleman olarak kullanan snflarn klonlanmas Byle durumlarda yazlan public clone metodu bu veri elemanlarn da klonlayacak ekilde dikkatlice yazlmaldr. Diyelim ki A bir snf olsun iinde B adnda baka bir snf veri eleman olarak kullansn:
84
class B { double y; } class A implements Cloneable{ int a; String str; B b; ... public Object clone() { try { /*A nesnesi klonlarak geisi bir nesnede tutluyor. Ama b deerinin adresi kopylanad. nk b aslnda B trnden ve alan alan kopylamada b nin kendisi deil adresi kopylanad.*/ A cloned_a = (A)[Link](); /*nesnenin kendi kopyasn tutan geici deikenin b alannn da klonu alnyor. Artk geici kopya da adres kopyalam ilemi dzeltildi.*/ cloned_a.b = (B) [Link](); /*Geici nesne geri gnderiliyor*/ return cloned_a; } } }
dev: (2 haftalik) ok kapsaml bir Student nesnesi yaratnz. Bir Student nesnesinin veri elemanlar: abcdeString student_name Vector courses (Ogrencinin aldigi dersler, dinamik bir array olmali, her elemani Course olmali) Adress address (Ogrencinin adresi) Date b_date (Ogrencinin dogum tarihi) int term; (Ogrencinin donem bilgisi)
Bununla birlikte gerekli metodlari ile birlikte bu nesneyi tasarlayiniz. Bu nesnenin tasarlanabilmesi icin tabi ki Date, Course ve Address nesnelerinin de gerekli metodlariyla birlikte tasarlanmasi gerekmektedir. Date sinifi, icerisinde bir tarih ve zaman bilgisi tutan bir siniftir. Bu sinifin veri elemanlari day, month, year, hour, minute, second olmalidir. Ve tabi ki bu degiskenleri isleyebilecek uygun metodlari barindirmalidir. Bu sinifin metodlarindan bazilari asagida verilmistir: public void addDay( int toAdd) - tariha toAdd kadar gun ekler. public void addMonth(int toAdd) -tarihe toAdd kadar ay ekler public void addYear(int toAdd) -tarihe toAdd kadar yil ekler public int diff(Date d) - iki tarih arasindaki gun farkini veren bir metod public void addCourse(Course new_course) - yeni bir course alip vector nesnesine ekleyecek /*secime bagli*/ public int getAge() - Ogrencinin yasini retrun edecek. (Sistem zamanini almaniz gerekir)
85
Bunun disnda da gerekli olan diger metodlar eklenecektir. Address sinifi sadece address bilgisini tutmak ve kullanabilmek icin yaratilacaktir. Bu sinifin tum degisken ve metdolari tasarimciya birakilmistir. Course sinifi sadece 1 dersin bilgilerini tutmak icin kullanilacaktir. Bu sinifin tum degisken ve metdolari tasarimciya birakilmistir.
Tum metodlarin icerigi tasarimciya birakilmistir. Ancak yaratilan nesnelere iliskin dokumantasyon hazirlanacaktir .Bu dokumantasyonda bir metodun sadece adi, aldigi parametre ve geri donus degeri anlatilacaktir. Metodun icerideki isleyisi anlatilmayacaktir. Bir Student nesnesi Comparable arayuzu ve Person turunde bir arayuzdenden turemelidir. Person interfacei asagida verilmistir. public interface Person { public public public public public String getName(); String getAddress(); String getFamilyName(); String listCourses(); Date getBirthday();
Hata Yakalama (Exception Handling) Javada error ad verilen hatalar meydana geldiinde program ak dorudan sonlandrlmaktadr. Ancak bazen, aslnda derleme srasnda hata olduu belli olmayan ancak alma zaman srasnda yaplan hatal ilemler neticesinde ortaya kan hatalar olabilir. alma zaman srasnda meydana gelen hatalar Mesela program ierisinde x/a gibi bir ifade oldugunu varsayalm. Bu durumda program derlenirken bu ifade hatal olarak alglanmaz. Ancak program alrken a deikenine 0 deeri atanrsa bu ifade matematiksel olarak sonsuz anlamna gelir ve bu da baka bir hata retilmesine neden olur. te bu tur hatalara error deil exception ad verilir. Exception ele alnabilir ama error alnamaz Exception ile error kavramlar saece tanm olarak deil, nitelik olarak da farkldr. nk java da exceptonlar runtime srasnda yakalanabilir. Ancak error olduu zaman bu durum kesinlikle programn almasn sonlandrr. Exception larn ele alnmas Exception, programda baz zel bloklar ierisinde ele alnr. Programn almas srasnda bir exception olursa hemen o anda bir Exception nesnesi yaratlr. Bu nesne, aslnda Exception nesnesinden tremi bir baka exception da olabilir. Ama neticede en temel anlamda bir Exception nesnesi yaratlr. alma zaman srasnda retilen exceptionlar ele alnabilir Daha sonra eer programc tercih etmise bu exception nesnesi zel bir blok tarafndan yakalanr ve yine ayn bloklar ierisinde programcnn istedii kodlar altrr.
86
Yukarda da grld gibi aslnda exception larn yakalanma prensibi, exception olma ihtimali olan satrlarn bir try blogu ierisinde yazlmas ve meydana gelen exception yakalayacak bir catch blgunun da hemen bu try bloklarnn sonuna yerletirilmesi eklindedir. Exceptionlar Es Geilemez Exceptionlar uretildigi anda programc tarafndan ele alnmazsa program exception ile birlikte sonlanr. Bu nedenle bir exception ele alnmadan program akna devam edilemez.
Kontrol edilen ve Kontrol Edilmeyen Exception lar Aslnda Exception lar kontrol edilen ve kontrol edilmeyen olmak uzere 2ye ayrlr. alma zaman srasnda meydana gelen baz exceptionlarn kontrol edilmesi pogramcnn isteine baldr. Bu tip exception lar RunTimeException nesnesinden tremilerdir. Programc bu exceptionlar ele almazsa program bir hata mesaj ile sonlanr. Ya da programcnn ele ald ekilde akna devam ederi. (dizi indeksinin geilmesi, sfra blme hatas ) Kontrol edilen exceptionlarn ele alnmas prgoramcnn isteine bal deildir. Bu exceptionlarn ele alnmas zorunludur. Mesela bir sodyann almas okunmas ya da kapanmas ilemleri kontrol edien exceptionlardr. Bu tr exceptionlar programcnn hatasndan kaynaklanmayan exception lardr (Bozuk bir dosya ya da URL) NOT: Aslnda btn exceptionlar Throwable nesnesinden tremitir.
Exception larn Yakalanmas Aadaki rnekte kulancdan bir say girmesi istenecektir. import [Link].*; public class HataYakalama { public static void main(String[] args) { String str = [Link](null, "Bir say giriniz"); try { int n = [Link](str); [Link]("Girilen sayi: " + n); } catch(NumberFormatException e) { [Link](); [Link](0); } } }
87
Eer kullanc bir say yerine yanlsklkla bir metin girerse, o zaman bu metinin [Link] metodu yardmyla sayya donusturulmesi bir runtime exception uretilmesine neden olur. Ve program aks hemen RunTimeExeption ureterek catch bloguna atlar. Boylece hata yakalanms olur. Eger hata yaklalanmaz ise JVM u hatay kendisi yakalar ve ekrana asadaki gibi bir exception mesaj gondererk program akn sonlandrr:
[Link]: For input string: "gdg" at [Link](Unknown Source) at [Link](Unknown Source) at [Link](Unknown Source) at [Link]([Link])
import [Link].*; public class HataYakalama { public static void main(String[] args) { int n; String str = [Link](null, "Bir say giriniz"); try { n = [Link](str); } catch(NumberFormatException e) { [Link](null, "Exception yakaland"); n = [Link]([Link](null, "Giris yanlis tekrar deneyiniz:")); } [Link]("Girilen sayi: " + n); } }
KISACA REKURSIF METODLAR Uygulama: Kullancdan doru giri alana kadar alan bir say isteme mekanizmas yaznz. Cevap: import [Link].*; public class HataYakalama { public static int sayiAl(String onEk) { [Link](null, "DEBUG: metoddayiz"); int n = -1; String str = [Link](null, onEk + " Bir say giriniz"); try { [Link](null, "DEBUG: try blogundayiz"); n = [Link](str); } catch(NumberFormatException e) {
88
[Link](null, "Exception yakaland"); onEk = "Giris yanlis tekrar tekar deneyiniz.\n"; return sayiAl(onEk); } return n; } public static void main(String[] args) { [Link]("Girilen sayi: " + sayiAl("")); [Link](0); } } Exception Ureten Metdolar Su ana kadar ogrendiklerimizden gryoruz ki Javada baz satrlar exception olumasna neden olabilir. O halde baz metodlar da exception uretilmesine neden olabilirler. Bir metod eger exception uretiyorsa bu metodu kullandmz satrnda try blogu ierisinde yazlmas gerekir. O halde Javada baz hazr metodlar incelerken bunlarn exception uretip uretmediklerine de baklmaldr. FileInputStream read [Link] metodlarnn dokumantasyondan incelenmesi. Eer biz de yazdmz metodlarn exception uetmelerini istiyorsak metod prototipinin sonuna throws anahtar szc ve devamnda da retilecek exceptionn tipini yazarz.
public String getValue(int index) throws IndexOutOfBoundsException { f(index == null || index >= [Link]) { throw new IndexOutOfBoundsException(); } } Checked ya da Unchecked Exception Nasl Yaratlr Eger exception gonderen method Exception ya da ondan tureyen bir exception throw ediyorsa bu exceptionlar checked sayilir. O halde bu metodu kullanan kisi metodu try bloklari icerisinde yazman zorudadir. Ancak gonderilen exception RunTimeException ya da ondan turemis bir exception ise metodumuz unchecked exception uretiyor demektir. O halde bu metodu try bloklari icerisinde yazmak zorunda degiliz. finally Blok Yaps finally blok yaps catch bloklarnn sonuna eklenir Bir exception yakalansa da yakalanmasa da program ak finally bloklar ierisine ynlenecektir. Aadaki rnei incelyiniz:
try { code a; }
89
1. Burada code a; hibir exception retmeyebilir. Bu durumda code a altktan sonra code c alacaktr. Program ak daha sonra finally blou altndaki kodlar altrmaya devam eder. 2. Bu durumda code a IOException retir ve bu nedenle code b lar. Daha sonra yine code c alacaktr. Eer catch blou herhangi bir exception retmez ise program ak yine try bloklarnn bittii yerden devam edecektir. 3. try bloklar ierisinde catch ierisinde yakalanmayan bir exception retilirse o zaman code a ve code c altktan sonra exception kullancya gnderilir.
Aadaki rnei deiik senaryolar iin deneyiniz: package derstekiornekler; public class ExceptionTest { public static void main(String[] args) { try { [Link]("Satir 1"); throw new Exception(); } catch(Exception e) { [Link]("Catch blogu icindeyiz"); } finally { [Link]("Finally blogu icindeyiz."); } [Link]("Catch blogu disindayiz"); } } NOT: finally bloklarn alan streamleri, exception olsa bile kapatabilmek amacyla kullanabiliriz.
90
Java'da Dosya lemlerine Giri Programcln vazgeilmez ilerinden birisi de disk zerindeki dosyalarla almaktr. Buraya kadar konular renmek amacyla kullanm olduumuz rneklerde aslnda veriler sadece o anda alan program ierisinde ele alnabiliyordu. Profosyonel anlamda yazlan programlarn ou kullancnn ihtiya duyaca verileri dosyalar zerinde saklamakta ve gerektiinde bu dosyalardan verileri okuyarak ya da yeni verileri dosyalara yazarak ileyilerini srdrmektedir. Bu nedenle programclkta ama ne olursa olsun dosyalar zerinde ilem yapma ihtiyac mutlaka karnza kacaktr.
File Snf
Java'da dosya ilemlerine ilikin ilk olarak File isimli snfn kullanmn inceleyerek balayalm. Bu snf disk zerinde yer alan bir dosyay program ierisinde de bir nesne haline getirerek programcnn dosya zerinde ilem yapabilmesini salamaktadr. Snfn balang fonksiyonu temel olarak bir dosyann yol (path) bilgisini alarak File nesnesini yaratr. rnein: ... File dosya1 = new File([Link]); File dosya2 = new File(c:\ornekler\[Link]); File dosya3 = new File(/home/Academytech/[Link]) ... Tabi yukarda verilen bu rneklerde, File snfnn balang fonksiyonuna parametre olarak verilen bu yollarn diskte de dzgn bir ekilde mevcut olmas gerekmektedir. Yani bulunduumuz dizinde [Link] ya da c:\ornekler\ dizini altnda bir [Link] ya da /home/Academytech/ dizini ierisinde bir [Link] dosyas bulunmaldr. Aksi takdirde dosya1, dosya2 ya da dosya3 ismi ile temsil edilen File nesneleri dzgn bir ekilde yaratlamayacaktr. Not: Java'da dosya ilemlerinin yaplabilmesi iin io.* ktphanelerinin programn en st satrnda import anahtar szc ile programa dahil edilmesi gerekmektedir. Aadaki rnekte temel olarak File snf ile dosya ilemlerinin ele alnmasna ilikin bir program yazlmaktadr.
rneimizde temel bir File nesnesi yaratarak aslnda diskte yer alan bir dosya bilgilerinin nasl ele alndn grmekteyiz. Bu rnekte benim girmi olduum /tmp/[Link] yolu aslnda kendi sistemimdeki bir dosyann
91
yerini temsil ettiinden siz kendi rneinizi yazarken kendi diskinizdeki yolu yazmaya dikkat ediniz. Program altrldnda InputDialog nesnesi ile aadaki resimde gsterildii gibi sizden bir dosya yolu istenecektir:
Girdiiniz bu yol bilgisi programmzn 8. satrnda yazld ekilde dosyaYolu deikenine aktarlmakta ve daha sonra da 11. satrda olduu gibi bu deiken yardm ile nesne yaratlmaktadr. Bu nesne yardmyla kullanlabilecek birka metodu 14, 15 ve 16. satrlarda grmekteyiz.
[Link] metodu
Bu metodu daha nceki derslerimizden gayet iyi biliyoruz. Aslnda bu metodun System paketi ierisindeki out snfnn println metodu olarak dlnebilirsiniz. Ancak gerekte durum bu deildir. Buradaki durumun anlalmas, javada dosyalar konusunu kavramak iin nemli bir balang olacaktr. O halde ilk nce bu durumu inceleyelim. out System snf ierisinde statik bir nesnedir (instance) Aslnda out, System snf ierisinde yer alan static bir instancedr. Bu yzden programc bu instancea dorudan eriebilir. Ayrca bu nesne bir PrintStream nesnesidir.
Stream Kavram:
Programclk asndan dosya ilemlerini anlamann en iyi yolu Stream kavramn bilmekle balar. Stream denilen nesne aslnda bir eyin okunmas ya da yazlmas iin bir soyutlamadr (abstraction). Bu soyutlama gereklidir, nk okunacak ya da yazlacak bilginin tipi her zaman deiebilir. Yani okunan ya da yazlan bilgi bir uygulamada manyetik karttan yaplabilecei gibi baka bir uygulamada da diskten yaplabilir. Burada Stream aslnda kelime anlam olarak ak anlamna gelir ve programclk anlamnda bilgi akn ifade eder. Bu yaklama gre okuacak bilgi stream den okunur ve yazlacak bilgi de stream e yazlr. Bylece bilginin tipi ne olursa olsun okunma ve yazlma aamasnda stream zerinde ortak bir bilgi ak salanacaktr. Bu ifadeyi kullandmz rneklerle daha iyi pekitireceimizi dnyorum. Stream kullanm ile bilgi ne olursa olsun okuma ya da yazma ekli hep ayndr: stream a daha fazla bilgi olduka (ya da yazdka) bilgi oku (ya da yaz) stream kapat O halde out nesnesine geri dnelim. out nesnesi, bu ekilde ad OutputStream denilen bir arayzden tretilmi bir snf olan PrintStream snf trndendir. Aslnda bizim ekrana bilgi gnderme eklimiz her iletim sisteminde farkldr. Ancak JVM ierisinde platforma gre implement edilmi olan bu PrintStream nesnesi bize bu soyutlamay salar ve bylece ierisinde yer alan println metodunu platform bamsz olarak kullanabiliriz. flush Kavram Aslnda yazlmas ya da okunmas istenen bilgiler yukarda nalatlan streamler ierisine ve oradan da yazlmas ya da okunmas istenen yere gnderilir. Ancak bir streamin kendi iini ne zaman boaltaca (yani istenen bilgiyi gerekli yere ne zaman ulatraca) belli deildir. Bu ileme flush denilir. Programc isterse bunu kendisi de yapabilir.
92
InputStream Nesnesi Yine System snf ierisinde yer alan ve out nesnesine benzeyen bir nesne daha vardr. Bu nesnenin ad in ve tr de InputStream snf trndendir. Bu nesne de konsoldan bir bayte lk bilgi okuma yetenegine sahiptir. Ancak okuma yetenei bu kadarla snrldr. Bu nesneyi debug ilemleri iin kullanabiliriz. public class InputStreamOrnek { public static void main(String[] args) { for(int i = 0; i < 10; i++) { [Link]("i: " + i); try { [Link](); } catch(Exception e) { } } } }
Standart Giri ve k Java'da yukarda bahsettiimiz bu stream kavram ile standart giri ve standart ka yazma ve okuma yapmak mmkn olacaktr. Aslnda standart giri-k komut satr ortam olarak dnebilirsiniz. Fazla detaya inmeden sylemek gerekirse standart ka yazma yapma ilemi aslnda daha nceden bildiimiz [Link](yazi) metodu ile yaplmaktadr. Arka planda aslnda System isimli snfn ierisinde tanml PrintStream trnden yaratlm ve ad out olan static bir deikeni kullanmaktayz.
BufferedReader <-- InputStreamReader <-- InputStream Ayn ekilde standart giriten program ierisine okuma yapmak da mmkndr. Bu ilem iin yetenekleri snrl olan [Link] nesnesine InputStream nesnesi ve BufferedReader nesnesi yardmyla yetenek kazandracak ve en son BufferedReader nesnesinin readLine metodu ile okuma yapacaz:
rneimizde 7. satrda BufferedReader nesnesi yaratlmtr. Bu nesnenin balang fonksiyonuna parametre olarak bir InputStream nesnesi hemen orada yaratlmakta ve gnderilmektedir. InputStream nesnesi okuma yapmak amacyla kullanlr. Bu nesnenin de balang fonksiyonuna, okumann yaplaca yer olan standart giri parametre olarak verildiinden bu stream standart girie ynlendirilmi, yani standart giriten okuma yapacak ekilde hazrlanmtr.
93
Program altrlrken aadaki resimde grld gibi komut satr ortamnda bizden bireyler girmemizi isteyecek ve bu bilgileri daha sonra ekrana yazacaktr. Bilginin standart giriten alnmasn salayan komut da 14. satrda grlmektedir. Aslnda bu komut soyutlanm BufferedReader nesnesinin readLine metodur ve bu nesne yukarda da anlatm olduum gibi standart girie ynlendirlmitir.
Text Dosyalarnn Okunmas ve Yazlmas: (FileReader ve FileWriter snflar) Yukarda bahsettiimiz stream kavram sayesinde standart giriten yaplan okuma ayn ekilde bir text dosyasna ynlendirilirse, o zaman dosyadan okuma yapmak da mmkn olacaktr. Ayn ekilde standart ka gnderilen bir bilgi text dosyasna ynlendirilmi bir stream e gnderilirse o zaman da text dosyasna yazma ilemi yapm oluruz. te burada da stream soyutlamasnn kolayln grmekteyiz. Aadaki rnekte, bahsettiimiz bu dosyadan okuma ilemini grmekteyiz. import [Link].*; public class DosyaIslemleri { public static void main(String[] args) { String str; String fileName = "[Link]"; try { BufferedWriter out = new BufferedWriter( new FileWriter(fileName)); [Link]("Deneme Satir 1 "); [Link]("Deneme Satir 2\n"); [Link]("Deneme Satir 3"); [Link](); BufferedReader in = new BufferedReader( new FileReader(fileName)); while((str = [Link]()) != null) { [Link](str); } [Link]();
94
} catch(IOException e) {} } }
NOT: Aslnda BufferedReader ve BufferedWriter snflar olmadan da dorudan FileWriter ve FileReader snflar yardmyla dosyaya text yazmak ya da dosyadan text okumak mmkndr. Yani bu soyutlama zaten yaplmtr. Ancak Buffered snflar yardmyla bu okuma ve yazma ilemi daha byk verier iin daha verimli bir ekilde yaplmaktadr.
Veri Dosyalarn Okunmas ve Yazlmas: (DataOutputStream, DataInputStream) Veri dosyalar nceki rnekte kullanm olduumuz text dosyalarndan biraz daha farkldr. Bildiimiz gibi program yazarken deikenlerin yaratlmas srasnda onlarn trlerini de belirtmek zorundayz. Daha sonra da bu deikenlere verilen deerleri de ayn trden vermek zorundayz. te veri dosyalarnda saklanan bilgiler de bu ekilde tr bilgisi ile birlikte sanki hafzada(ramde) saklanyormu gibi saklanmaktadr. Yani text dosyalarnda olduu gibi verilerin tamam string eklinde saklanmaz. Bu nedenle de veri dosyalarn bir text editr ile ap okumaya kalktnzda bilgilerin anlalr olmadn grrz. Aadaki rnekte bir veri dosyasna birtakm bilgiler yazlmakta ve daha sonra da ayn dosyadan bu bilgiler okunmaktadr. Aslnda buradaki mantk yine yukardaki anlattklarmza benzer. Yukarda bir dosyaya text yazmadan nce bir FileWriter stream aarak dosyaya giden bir yol am olduk. Ancak bu yola verileri dha verimli yklemek iin yolun ucuna bir BuffereWriter tneli ekleyerek onun zerinden dosyaya gnderdik. Ancak bu ekilde ancak text verileri dosyaya yazabiliyoruz. Dosyaya verileri tr bilgisi ile gnderebilmek iin nce dosyaya ulaan bir FileOutputStream tneli ayoruz. Daha sonra bu tnelin ucuna BufferedOutputStream ve onun da ucuna DataOutputStream ekleyerek verileri tr bilgileriyle birlikte dosyaya gnderebiliyoruz.
Yukardaki rneimizde bu sefer veri yazma ilemi yapmaktayz. Bu nedenle stream nesnemizi 9. satrda olduu gibi veri yazabilecek ve 16. satrda olduu gibi veri okuyabilecek ekilde hazrlamaktayz. 12. ve 13. satrlarda srayla
95
yazlan double ve int veriler okunurken de yazldklar sra ile okunurlar. Veri yazma ilemini program ierisindeki bir deikenin hafzada deil de dosyada saklanmas gibi debiliriz. nk bazen verileri bu ekilde tr bilgileriyle saklamak ve daha sonra da ele almak gerekmektedir. Bu ilemi bir text dosyasyla yapmaya kalkarsak verilerin sadece grntlerini saklam oluruz. Bu durumda verilerin daha sonra tekrar okunmas srasnda tr bilgileri kaybolacandan rneimizdeki 19. 20. satrdakilere benzer atamalar mmkn olmayacaktr.
throws Kullanmnn getirdii kolaylk Ayrca dikkat edersek bu rneimizde try ve catch bloklarn kullanmak yerine retilecek Exception bilgisini daha farkl ele aldk. Eer bir metodun ierisinde Exception retilme ihtimali varsa rneimizde olduu gibi metodun prototipine throws anahtar szcnden sonra retilecek Exception yazlrsa, metod ierisinde bu Exception' retebilecek satrlar try bloklarnda ele almaya gerek kalmaz. Buna ilikin detayl bilgileri bir nceki dersimizde bulabilirsiniz. zetleyecek Olursak Text Veri Program ---> <--BufferedWriter BufferedReader ---> FileWriter <--- FileReader ---> <--DOSYA (TextVeri) DOSYA
(HamVeri)DOSYA
Hep Srayla Okuduk, Srayla Yazdk Ama.. Dersimizin buraya kadar olan ksmnda stream yaratarak dosyalara yazma ve okuma ilemlerini grdk. Ancak bu yazma-okuma ilemlerini hep srayla yaptk. Yani bir veriyi okumadan, ondan daha sonra gelen veriyi okumak mmkn deildi. Yine ayn ekilde ilk veriyi yazmadan ikinci veriyi yazmak yukarda gsterdiimiz stream ler ile olanakszd. Byle bir ilem yapmak iin daha farkl bir stream kullanmamz gerekmektedir. Dosyalara bu ekilde eriim isteine teknik olarak rastgele eriim denilir. imdi bunu inceleyelim.
Dosyalara Rastgele Eriim lemi Bir dosyaya rastgele eriim yaplabilmesi iin ncelikle RandomAccessFile snf trnden bir deiken yaratmak gerekir. Bu deiken yaratlrken 1. parametre olarak eriimin yaplaca dosya ve ikinci parametre olarak da eriim hangi modda yaplaca bilgisi verilmelidir. rnein [Link] dosyamza okunabilir ve yazlabilir modda erimek istiyorsak nesneyi u ekilde yaratmamz gerekir: RandomAccessFile myFile = new RandomAccessFile([Link], "rw"); Dosyaya rasgele eriim iin kullanlabilecek en genel modlar u ekilde zetlenebilir: r: Dosya sadece okuma iin alr. Herhangi bir yazma ilemi yaplrsa IOException retilir. rw: Dosya yazma-okuma iin alr. Eer dosya hali hazrda mevcut deilse yeni bir tane yaratlr. Aadaki rnekte bir dosya ierisine veriler yazldktan sonra rastgele eriilerek okunmaktadr. Burada okuma ilemi srayla yaplmamaktadr.
96
rneimizde 8. satrda okuma-yazma modunda alan dosyamza baz double deerler ekliyoruz. Bu ekleme ilemini bir dng ile yapyoruz. Kullanc 13. satrdaki sorgu gerei -1 girmedii srece girilen bilgiler nce double trne dntrlyor ve daha sonra da dosyaya yazlyor. Bu dntrmenin nedeninin, girilen bilgini hep string olmasndan dolay olduunu nceden hatrlaynz. Daha sonra 21. satrda kullanlan seek() metodu sayesinde dosya ierisinde rastgele bir pozisyona gidiyoruz. Bu pozisyon, seek metoduna asl pozisyon * 8 olarak gnderiliyor. lk pozisyon 0 olduu iin kullancnn istedii pozisyondan 1 kartarak seek() metoduna gnderiyoruz. Bylece kullanc gerekten istedii sayy elde edebiliyor. NOT: seek() metodunun ierisine yazlan 8 * cursor ifadesindeki 8, double veriler icin. Her veri icin bu dger degisir. Mesela int veriler icin bu deger 4, byte veriler icin ise 1 dir. Bu bilgiler dokumantasyonda yer alan write metodlarinda mevcuttur. Object Serialization Hakknda import [Link].*; import [Link].*; public class ObjectReaderWriter { String filePath; public static void main( String args[] ) { ObjectReaderWriter orw = new ObjectReaderWriter(); } ObjectReaderWriter() { try {
97
// Allow the user to specify an output file. FileDialog fd = new FileDialog( new Frame(), "Nesnelerin yazilacagi dosya..", [Link] ); [Link](); filePath = new String( [Link]() + [Link]() ); // Next, create an object that can write to that file. ObjectOutputStream outStream = new ObjectOutputStream( new FileOutputStream( filePath )); // Create instances of each data class to be serialized. MySerialObject serialObject1 = new MySerialObject(12, "Academytech"); MySerialObject serialObject2 = new MySerialObject(24, "Caglar"); //save each object [Link]( serialObject1 ); [Link]( serialObject2 ); [Link](); [Link](); // Allow the user to specify an input file. fd = new FileDialog( new Frame(), "Nesnelerin cekilecegi dosya",[Link] ); [Link](); filePath = new String( [Link]() + [Link]() ); ObjectInputStream inStream = new ObjectInputStream( new FileInputStream( filePath )); // Retrieve the Serializable object. MySerialObject serialObject = ( MySerialObject )[Link](); //MySerialObject serialObject2 = ( MySerialObject )[Link](); // Display what we retrieved: [Link]( serialObject ); [Link](); } catch(Exception e) {} } }
File Snfnn ncelenmesi: Java'da dosya ilemlerini ele alabileceimiz File isimli bir snf nesnesi daha vardr. Bu nesne yardmyla aslnda yine bir soyutlama yaplmkata ve bylece disk zerindeki dosya ya da dizinler platform bamsz olarak kullanbilmektedir. nceki rneklerimizde dosyalar hep birer String ile ifade etmitik. Burada bir dosyann File nesnesi haline getirildikten sonra da baz metdolar yardmyla nasl kullanlabileceine dair bir rnek yapacaz. rneimizi incelemeden nce bir File nesnesine ait baz metodlar inceleyelim: boolean canRead(): Nesnenin ifade ettii dosyann okunabilirliini kontrol eder. boolean canWrite(): Nesnenin ifade etti dosyann yazlabilirliini kontrol eder. boolean createNewFile(): Nesneye verilen path ierisinde bo bir dosya yaratr. Ancak bu dosyann mevcut dizin ierisinde nceden yaratlmam olmas gerekir. boolean delete(): Nesnenin iaret etti path ierisindeki dosyay siler. boolean exists(): Verilen path ierisinde yer alan dosya ya da dizinin var olup olmadna bakar. String getAbsolutePath(): Nesnenin ifade ettii dosya ya da dizinin tam yol bilgisini string olarak verir.
98
String [] list(): Nesnenin iaret ettii dizin ierisindeki dosya ya da dizinlerin bir listesini verir. Bu liste de String trnden bir dizi olarak oluturulur. boolean mkdir(): Verilen path ierisinde yeni bir dizin yaratr. boolean renameTo(File hedef): Nesnenin iaret ettii dizin ya da dosyaynn ismini parametre ile verilen yeni isme dntrr. Tabi ki aslnda File nesnesi yukarda zetlenenden daha fazla hazr metoda sahiptir. Ancak burada genel bilgi vermek amacyla bu kadarndan bahsetmeyi yeterli gryorum. Daha nce de sylediim gibi herhangi bir java snfnn ierdii deiken ya da metodlar bulabileceiniz dkmantasyon sayfasna (1.4.2 iin) [Link] adresinden eriebilirsiniz. imdi File snfn kullanarak yazacamz bir rnekle konuyu daha iyi pekitirelim:
Odev:
erisinde Name:Surname:Address:ID Academy:tech:26:Address:1302 seklinde bilgiler olan bir dosyadan bu bilgileri cekerek Person nesnesi haline getiren ve bu personlari bir dizide saklayan bir uygulama yaziniz. Daha sonra bu diziyi sort ederek (Person nesnesinin compareTo metodu olmali) ekrana basiniz. Ve en son olarak bu bilgileri nesneler halinde Object Serialization yontemi yardimiyla baksa bir dosyada saklayiniz. Arastirma konusu: Dosyadan Turkce karakter okuma (ISO8859-9 formati, dosyalarin iso8859-9 formatinda acilmasi)
99
rneimizde kullancdan 10. satrda alnan bir dizin bilgisi File nesnesi halinde yaratlmaktadr. Bylece program ierisinde File snfnn sunaca hazr metodlardan yararlanlabilir. Zaten 11. satrda bu metodlardan birisi olan list metodu yardmyla verilen dizin ierisindeki dosyalar String dizisi halinde elde edilir. Bu noktaya kadar dosya ilemlerini ieren balklarn ounu basit ve anlalr rneklerle incelemi olduk. Bunu tesinde daha byk uygulamalarda bu kk paralar kullanlarak konu daha iyi pekitirilecektir. Dersimizin bundan sonraki ksmnda Java programlama dilinin en gl yanlarndan birisi olan grafik arayz gelitirmeyi reneceiz.
100
Java ile Programlama Blm 10: Java ile Grafik Arayz Gelitirme: Grafik arayz denilen ey aslnda arka planda alan programlarn daha anlalr olabilmesi amacyla, n tarafta kullancya sunulan ortamdr. Aslnda bu tr ortamlarla zaten gnlk bilgisayar kullanmnda sklkla karlarsnz. rnein internette gezinebilmek amacyla kullandmz Netscape ya da Mozilla gibi web tarayclar birer grafik araryzdr. Gerekte bilgisayarmz web siteleriyle, arka tarafta eitli protokoller ve zel komutlar yardmyla iletiim kurar ve sayfalar alr ya da gnderir. Ancak n planda eitli text alanlar, dmeler ve menler yardmyla bu ilemleri daha anlalr ekilde yapabiliriz. Artk masast kullanlan iletim sistemlerinin tamam grafik arayzleri ile donatlmtr. Bir programn giri k bilgilerine ilikin teknik detaylarn kullancdan soyutlanmas ve ona daha anlalr bir etkileim ortamnn sunulmas gerekir. Bu nedenle, yazlan programlar en son aamada bir grafik arayz ile desteklenir ve bylece daha kullanl hale gelir. Java'da grafik arayz gelitirmek nceden yazlm birtakm snflarn kullanlmas ile salanr. Bu snflar en genel anlamda [Link] ve [Link] paketleri ierisinde toplanmtr. ncelikli olarak bilinmesi gereken birtakm temel kavramlar incelendikten sonra saysz grafik arayz nesnesine ilikin rnekler greceiz. Bu rneklerin tamamnda temel kavramlar kullanacaz. JFrame Kavram: Gelitireceimiz tm grafik arayz uygulamalar (GUI) aslnda JFrame snfndan tretilmi uygulamalar olacaktr. JFrame snf aslnda iletim sisteminden en temel pencere fonksiyonlarn alacak ekilde oluturulmutur. Kullandnz iletim sistemine gre bu fonksiyonlar ve bunlarn ekrana getirilmesi ilemleri farkllk gstereceinden siz sadece JFrame snfn treterek kendinizi bu farkllktan soyutlarsnz. Zaten ilk derslerimizde de bahsettiimiz bu teknik nesne ynelimli program gelitirmenin avantajlarndan birisi olarak karmza kmaktadr. Aadaki rnekte ok basit bir JFrame nesnesi ile grafik uygulamalarna balayabiliriz.
import [Link].*; import [Link].*; public class Cerceve extends JFrame { public Cerceve() { super("Benim ilk uygulamam"); [Link](this.EXIT_ON_CLOSE); [Link](300, 400); [Link](false); [Link](); } public void paint(Graphics g) { [Link](new Color(200, 20, 208)); [Link]("Merhaba ", 150, 200); [Link](0, 0, 300, 300); [Link]([Link]); [Link](149, 188, 50, 20); [Link]([Link]); [Link](30, 30, 100, 150); [Link](30, 30, 80, 120); }
101
Yukardaki rnekte olduka basit bir GUI uygulamas grmekteyiz. Daha nce de sylediimiz gibi bu uygulama nceden hazr olan JFrame snfnn tretilmesi ile elde edilmektedir. imdi bu uygulamay detayl olarak ele alalm ve rnek zerinde temel kavramlara deinelim. Tretilen snfmzn balang fonksiyonu ierisinde kullandmz super metodu nceden hatrlayacamz gibi temel snfn balang metodunu armaktadr. Bu metod kendisine gnderilen bir string ifadeyi ekranda alan frame in bal haline getirmektedir. JFrame Metodlar: JFrame nesnesinden treyen bir snf JFrame'e ait olan hazr metodlar kullanabilir. Yine uygulamamzn balang metodunda kullandmz setSize, setResizable ve show metodlar bu tr metodlardandr. setSize metodu ekrana gelecek olan arayzn satr ve stn uzunluunu oluturur. Bu bilgiler piksel olarak metoda verilmektedir. setResizable metodu ekrana gelen arayzn fare yardmyla geniletilip geniletilemeyeceini belirlemek iin kullanlr. Parametre olarak verilen false deeri arayzn snrlarn sabit hale getirmektedir. En son satrda kullanlan show metodu arayzmzn altktan sonra ekranda grnr olmasn salar. 32 satrda uygulamamz trnden bir nesne yarattmzda balang fonksiyonu otomatik olarak arlacak ve gerekli boyut, listener ve dier ayarlar yapldktan sonra show metodu sayesinde erevemiz ekranda grnr halde olacaktr.
24. satrda tantlm olan paint metodu erevemiz oluturulurken otomatik olarak arlan bir metoddur. Bu metod her zaman bir Graphics nesnesini parametre olarak alr. Graphics nesnesine ait olan metodlar sayesinde uygulamamz zerine birtakm izimler ve yazlar yerletirebiliriz. 26. satrdaki metod sayesinde izilecek ya da yazlacak bilgilerin hangi renkte olaca belirlenir. Bu renk belirleme ilemi aslnda setColor isimli metoda gnderilen bir Color nesnesi ile belirlenir. Hemen o anda yarattmz Color nesnesinin balang metodunda da 3 tane tam say girlmektedir. Bu saylar srasyla krmz yeil ve mavi bileenlerini temsil eder. Her bileen 0-255 arasnda bir deer alr ve istedimiz renk bu 3 bileenin karmndan elde edilir. 27. satrdaki drawString metodu ile uygulamamz zerine istenilen bir yazy yazabiliriz. drawString metoduna verilen dier 2 parametre ise bu yaznn hangi piksellerden balayarak yazlacan belirler.
Swing ve AWT Javada GUI nesnelerinin gelitirebilmek iin kullanlan paketler swing ve awt paketleridir. Aslnda swing paketi awtden daha sonra gelitirilmi ve nesneler swing paketi ierisinde hem artm hem de daha klmtr Yani awt paketinin gelitirilmi hali swing paketididir. Ancak yine de event handling mekanizmasi iin awt paketi hala kullanlmaktadr. GUI Uygulamalarna Detayl Bir Bak nceki dersimizde hazrlam olduumuz JavaGui rneinde, GUI zerinde yaplan bir takm hareketlerin listener nesneleri tarafndan yakalandndan bahsetmitik. Hatta GUI uygulamamzda pencerenin arp dmesine bastmzda uygulamann gerek anlamda sonlanmas, bu hareketin yakalanmas ve bizim istediimiz ekilde ele alnmas sonucunda mmkn olmutu. Listener Kavram GUI uygulamalarnda listener kavram ok nemli bir yer tutar. Bu nemi GUI uygulamalarnn yazl nedenine bakarak rahatlkla anlayabiliriz. yle ki; bir GUI uygulamas yazlm bir programn kullanc tarafndan daha rahat
102
kullanlabilmesi amac ile yazlmaktadr. O halde kullancnn hizmetine sunulan bir GUI uygulamas kullancnn isteklerini de algyabilmelidir. GUI uygulamalar, genel olarak bir takm hazr nesnelerin (Dme, ScrollBar, Text Alanlar v.b.) uygulama zerine yerletirilmesi eklinde hazrlanr. te bu uygulmalarn ikinci ksmn da bu nesneler zerinde yaplan hareketlerin alglanmas oluturur. Aadaki rneimizde basit bir GUI erevesi zerinde bir Jbutton nesnesi eklenmekte ve bu nesnenin harektleri takip edilecek ekilde uygulama tasarlanmaktadr: import import import import [Link].*; [Link].*; [Link].*; [Link].*; {
public class SwingOrnek1 extends JFrame Container c; JButton dugme; Dinleyici dinleyici; public SwingOrnek1() { super("GUI Nesneleri"); c = [Link](); dinleyici = new Dinleyici();
dugme = new JButton("Mesaji Goster"); [Link](dinleyici); [Link](dugme); [Link](new WindowAdapter() { public void WindowClosing(WindowEvent e) { [Link](0); } }); [Link](300, 300); [Link](); } } import [Link]; import [Link]; import [Link].*; public class Dinleyici implements ActionListener { public void actionPerformed(ActionEvent e) { if([Link]() == "Mesaji Goster") { [Link](null, "Dugmeye Basildi."); } } } public class Monitor { public static void main(String[] args) { new SwingOrnek1();
103
rneimiz 3 dosyadan olumaktadr. Bu dosyalardan [Link] dosyas aslnda kendi bana bir ilevi olmayan ve genel olarak tm uygulamay altrmaya ynelik bir snf olarak yazlmtr. [Link] snf aslnda orjinal adyla listener olarak isimlendirilen ve ActionListener arayzn implement eden bir snftr. Bu snf kendisine atanan nesneleri srekli dinleyen ve ilgili nesneye yaplan her hareketi takip eden bir snftr. Bu snf ierisinde yer alan actionPerformed isimli metod, bu snfn dinledii herhangi bir nesneye mdahele olduu zaman otomatik olarak arlmaktadr. Aslnda daha teknik olarak ifade etmek gerekirse, herhangi bir nesneye yaplan mdahele sonucunda Javada ActionEvent yaratlmaktadr. Yaratlan bu ActionEvent ise ilgili nesneyi dinleyen listener snfnn actionPerformed metoduna parametre olarak gnderilmektedir. O halde bizim rneimizde [Link] dosyasnn 20. satrnda dinlenmek zere eklenen JButton nesnesine dokunulduunda bir action yaratlmakta ve bu nesneyi dinelyen dinleyici isimli snfa gnderilmektedir. Bu metoda gelen eventin hangi nesneye ait oldugu ActionEvent nesnesinin getActionCommand metoduyla anlalmaktadr. Bu metodun geri dn deeri ActionEvent halinde gelen nesnenin zerinde yazan etikettir. O halde unu da belirtmek gerekir ki listener tipindeki bir snf ayn anda birden fazla nesneyi dinleyebilir. Ya da bir baka deyile, birbirinden farkl birden fazla nesne, ayn listener snfnn dinlenme listesine eklenebilir. Bizim rneimizdeki dugme isimli JButton nesnesi, [Link] dosyasnda 20. satrda dinleyici snfnn dinlenecek nesnelerinden birisi olarak eklenmektedir. Dinleyici degikeni de yine ayn dosyadaki 10. satrda Dinleyici snf trnden yaratlmtr. Dinleyici snf da ActionListener arayznden tretildiine gre, bu snfn dinleme yetenei vardr. Action Nesneleri Hakknda Genelde belirli bir menu nesnesi tarafndan tetiklenen baz komutlar baz baka nesneler tarfndan da tetiklenebilir. Mesela bir menu nesnesinde tanml olan bir komut bir toolbar nesnesi ierisinde de tetiklenebilir. Kullanc belirli bir nesne iin belirli bir fonksiyon atayabilir. Bu nesne bir menu nesnesi, bir dugme ya da bir toolbar nesnesi olabilir. Mesela ad blueAction olan bir nesne ColorAction nesnesinde tremi bir nesne olsun. ColorAction nesnesi de ActionListener implement eden bir nesne olsun. O halde yaratlan bir dmenin dinleyicisi olarak blueAction nesnesi kullanlabilir ve bu nesne de sadece arka plan rengini maviye dntrecek ekilde yazlm olabilir. O halde artk bu nesne birden fazla nesne tarafnda listener olarak kullanlabilir.
104
Swing paketleri ierisinde Action denilen bir arayz sayesinde yukarda bahsettiimiz bu mekanizma ok verimli bir ekilde ele alnabilir. Bu arayz birok listener arayznde tetiklenen metodular ierir: interface Action { void actionPerformed(ActionEvent e); void setEnabled(boolean b); boolean isEnabled(); void putValue(String key, Object value); Object getValue(Sting key); void addPropertyChangeListener(PropertyChangeListener listener); void removePropertyChangeListener(PropertyChangeListener listener); }
putValue ve getValue metodlar action nesnesi ierisinde anahtar deer ikililerinin tutmaya olanak verir. Bunun iin Action snf ierisinde tanml baz sabitlerden yararlanrz. NAME, SMALL_ICON, SHORT_DESCRIPTION, LONG_DESCRIPTION, MNEMONIC_KEY, ACCELERATOR_KEY, ACTION_COMMAND_KEY gibi... Eer action bir menu ya da toolbar nesnesine eklendii zaman NAME ve SMALL_ICON otomatik olarak nesne bu deerler iin ayarlanr. SHORT_DESCRIPTION deeri de nesne de tooltip olarak set edilir.
Action, bir arayz olduu iin daha kolay bir kullanm salayan AbstractAction snf kullnlabilir. Bu snf ierisinde tm metodlar gerektii ekilde implement edilmitir. Ancak sadece actionPerformed metodu soyut olarak braklmtr. Mesela yeni bir action tanmlamlayalm: public class ColorAction extends AbstractAction { public ColorAction(String name, Icon icon, Color c) { putValue([Link], name); putValue(Action.SMALL_ICON, icon); putValue(color, c); putValue(Action.SHORT_DESCRIPTION, Set panel color to + [Link]); } public void actionPerformed(ActionEvent e) { Color c = (Color)getValue(color); setBackground(c);
} }
Bundan sonra bu action istenilen nesneler iin kullanlabilir: Action blueAction = new ColorAction(Blue, new ImageIcon([Link]), [Link]); JButton blueButton = new JButton(blueAction); Container Kavram u ana kadar aslnda bir GUI nesnesinin nasl dinlendiini rendik. Peki ama bir GUI nesnesi nasl ereve ierisine eklenebilir? Bu ilem rneimizin 16. satrnda gereklemektedir. GUI nesnelerinin bazlar dier nesneleri zerinde tama yeteneine sahiptir. Bu yetenee sahip olan nesnelerden birtanesinin JFrame olduunu grmekteyiz. yle ki bizim rneimiz temelde bir JFrame nesnesidir. Bu sayede zerine bir JButton nesnesi ekleyebiliyoruz. Ancak JFrame nesnesine bu eklemeyi yapmadan nce 8. satrda olduu gibi Container snf trnden bir deiken yaratmaktayz. Bu deiken nesneleri tutabilen bir yap haline gelmektedir. 16. satrdaki getContentPane isimli metod yazm olduumuz JFrame nesnesinin panelini bu taycya atadndan, container nesnesine eklenen her
105
nesne dolays ile JFrame nesnesi zerine eklenmi olacaktr. Bu da bizim uygulamamzn (SwingOrnek1 snf) kendisidir. Container ve JFrame arasndaki ilikiyi aadaki ekilde irdeleyebiliriz.
NOT: Bizim uygulamamz JFrame nesnesidir. nk uygulamamz JFrame nesnesinden tretmekteyiz. nceki dersleri hatrlaynz.
Layout Kavram Genel olarak bakldnda uygulamamzda bir sorun grmekteyiz. yle ki dugme adyla eklemi olduumuz JButton nesnesi btn ereveyi kaplamaktadr. Bu grnt allm bir dme grntsnden farkldr. Bunun sebebi bu tr nesneleri tamak zere yarattmz Container nesnesinin layout modelini belirtmemi olmamzdr. Layout denilen kavram tayc grevi stlenen bir nesnenin kendisine eklenen dier nesneleri hangi dzende yerletireceinin belirleyen bir kavramdr. Layout modellerinden ilki olarak FlowLayout modelini inceleyebiliriz. Bu tayc nesneye (yani container nesnesine) eklenen her nesne (JButton ve daha sonra reneceimiz dier Swing nesneleri gibi) arka arkaya ve satr satr eklenmektedir. ereve zerinde bir satr bittikten sonra eklemeye alt satrdan devam edilir. Aadaki rnekte FlowLayout modeli kullanlarak nesneler eklenmektedir. Ayrca bu rnekte listener snf iin yeni ve ayr bir snf yaratmak yerine erevenin kendisi ayn zamanda Listener olarak kullanlmaktadr. Bu nedenle addActionListener metoduna eklenecek snf olarak this yani snfn kendisi verilmektedir.
106
Container c; JButton dugmeler[] = new JButton[10]; public LayoutDeneme1() { c = [Link](); [Link](new FlowLayout([Link])); for(int i = 0; i < [Link]; i++) { dugmeler[i] = new JButton("dugme_"+i); dugmeler[i].setSize(10,15); dugmeler[i].addActionListener(this); [Link](dugmeler[i]); } [Link](this.EXIT_ON_CLOSE); [Link](300, 300); [Link](); } public void actionPerformed(ActionEvent e) { for(int i = 0; i < [Link]; i++) if([Link]() == dugmeler[i]) { [Link](this, i + " Nolu Dugmeye Basildi"); } } public static void main(String arg[]) { new LayoutDeneme1();
} }
LayoutDeneme1 snf, bildiriminden de anlald gibi hem bir JFrame nesnesi, hem bir listener hem de kendi bana alabilen bir uygulama olarak tasarlanmtr. Uygulama zerine yerletirilecek JButton nesneleri bir JButton dizisi ierisinde saklanmaktadr. Bu dizi 9. satrda yaratlmaktadr. 17 satrda ise for dngsnn her admnda dizinin ilgili eleman JButton nesnesi olarak yaratlmakta ve yaratlrken de otomatik bir isim verilmektedir. 18. satrda JButton nesnesine ait olan setSize isimli bir metod sayesinde her JButton nesnesi sabit bir byklkte yaratlmakta ve bylece daha doal bir grnt salanmaktadr. Ayn dng ierisinde ilgili nesne yaratlr
107
yaratlmaz ActionListener grevini stlenen snfa, yani bu rnekte snfn kendisine eklenmektedir. Snfn kendisi ActionListener olduu iin de snf ierisine ActionListener arayzne sahip olan actionPerformed metodunun mutlaka yazlmas gerekir (Arayzlerde belirtilen metod prototiplerinin, bu arayzleri implement eden snflarda yazlmak zorunda olduunu hatrlaynz). Bu ilem 32. satrda yaplmaktadr. 20. satrda yaratlan her JButton nesnesi Container olarak yaratlan c nesnesine eklenmektedir. Ancak 14. satrda grld gibi c nesnesinin layout yaps FlowLayout olduundan eklenen her JButton nesnesi srayla ve arka arkaya eklenmekltedir. Bu sonu, program altrldnda yukarda ekilde olduu gibi aka grlmektedir. Ayrca FlowLayout bildirimi yaplrken kullanlan LEFT sabit deikeni ekleme srasnn her satr iin soldan saa doru olacan belirler. Bunun dnda RIGHT ya da CENTER da kullanlabilir. Bu rnekte birden fazla ayn tre ilikin nesnelerin bir dizi ierisinde otomatik olarak nasl yaratldn 16. satrda grmekteyiz. Genel olarak bu sra u ekilde listelenebilir: Dizinin her adm iin: a) Nesneyi yarat b) Nesneyi zelletir (Boyut, renk vb.) c) Nesneyi listener snfna kaydet d) Nesneyi conatiner nesnesine ekle. 32. satrda da bu ekilde dizide saklanan nesnelerin nasl kullanldn grmekteyiz. Dngnn her admnda ilgili nesnenin otomatik olarak verilmi ad yardmyla mesaj penceresi hazrlanmaktadr. Ancak bu sefer zerinde ilem yaplan nesne, nesnenin zerindeki isme baklarak deil, gerekten kendisine baklarak tespit edilmektedir. Bunu salayan metod ActionEvent snfnn getSource isimli metodudur. Demek ki bir ActionEvent yaratldnda bu nesnenin hangi nesne olduunu ya getActionCommand yardmyla nesne zerindeki isime bakarak, ya da getSource metodu yardmyla nesnenin kendisine bakarak anlayabiliriz. Bir baka layout modeli de BorderLayoutdur. Bu modele gre tayc nesne zerinde kuzey, gney, dou ve bat olarak 5 tane alan vardr ve nesneler bu alanlardan birisine yerletirilir. Aslnda contenPane ierisindeki ntanml layout modeli de zaten budur. Eer yukardaki rnekte layout modeli BorderLayout olarak deitirilirse nesneler buna gre istenen blgeye yerletirilebilir. Gerekli deiiklerle birlikte az nceki rnein yeni hali aadadr: import import import import [Link].*; [Link].*; [Link].*; [Link].*;
public class LayoutDeneme2 extends JFrame implements ActionListener { Container c; JButton dugmeler[] = {new JButton("dugme_0"), new JButton("dugme_1"), new JButton("dugme_2"), new JButton("dugme_3"), new JButton("dugme_4")}; public LayoutDeneme2() { c = getContentPane(); [Link](dugmeler[0], [Link]); [Link](dugmeler[1], [Link]); [Link](dugmeler[2], [Link]); [Link](dugmeler[3], [Link]); [Link](dugmeler[4], [Link]); for(int i = 0; i < [Link]; i++) dugmeler[i].addActionListener(this);
108
[Link](new WindowAdapter() { public void WindowClosing(WindowEvent e) { [Link](0); } }); [Link](300, 300); [Link](); } public void actionPerformed(ActionEvent e) { for(int i = 0; i < [Link]; i++) if([Link]() == dugmeler[i]) { [Link](this, i + " Nolu Dugmeye Basildi"); } } public static void main(String arg[]) { new LayoutDeneme2(); }
}
Bu rnekte grld gibi ekleme ileminde kullandmz add metoduna bir de eklemenin hangi blme yaplaca bilgisi de verilmelidir. Buraya kadar sadece en temel kavramlar vermek amacyla Container, Layout ve Swing nesnelerini en az zellikleriyle inceledik. u anda amacmz genel yapy ve hiyerariyi kavramak olduundan bu nesnelerin kendi iindeki detaylara imdi girmiyoruz. Bylece en azndan rneklerimizi anlayacak kadar temel bilgileri edinmi oluyoruz. lerleyen konularda bu temel kavramlarn herbirini kendi iinde daha detayl inceleyeceiz. JPanel Nesnesi Artk genel anlamda bir JFrame nesnesi yaratmay, bu nesneye baka nesneler eklemeyi ve eklenen bu nesneleri de takip etmeyi rendik. Nesnelerin JFrame zerine eklenmesi iin bir Container kullandk. Ancak bazen nesneleri direk JFrame zerine eklemek kullanl olmayabilir. Bu nedenle nce baz nesneleri kendi iinde gruplayp tek bir nesne haline getirip bu ana nesneyi JFrame container zerine eklemek daha anlalr ve daha dzenli olabilir. JPanel kendi bana zerinde nesne tutabilen bir yapdr. Yani JFramede olduu gibi, bir JPanel nesnesi zerine baka bir nesne eklemek iin contentPane oluturmaya gerek yoktur. Dorudan JPanel zerine nesneler eklenir ve bu nesnelerin listener ilemleri tamamlanr. Daha sonra bu JPanel nesnesi artk ierisinde baka nesneleri tutan tek bir nesne gibi kullanlabilir. Aslnda bu ilemleri yaparken de gerek anlamda nesne ynelimli programclk yaptmz zellikle belirtmek isterim. Aadaki rnekte bir text alan ierisindeki yaz zerinde renk ve boyut dzenlemeleri yapan bir uygulama gelitirilmektedir. Ancak bu dzenleme opsiyonlar ayr gruplar halinde paneller zerinde tasarlanp daha sonra ereve zerine eklenmektedir. Uygulama altktan sonra aadaki gibi bir GUI ekrana gelmektedir: RESIM: RESIM ADI: [Link] ALT BALIK: JPanelOrnek1 Uygulamasnn almas import [Link].*; import [Link].*; import [Link].*; import [Link].*; public class JPanelOrnek1 extends JFrame implements ActionListener { JPanel colorPanel, sizePanel, editPanel, southPanel; JTextArea text;
109
JButton yellowButton, redButton, blueButton; JRadioButton editable, noneditable; ButtonGroup group; Container c; public JPanelOrnek1() { c = [Link](); [Link](new BorderLayout()); southPanel = new JPanel(); [Link](new BorderLayout()); colorPanel = new JPanel(new FlowLayout()); yellowButton = new JButton("Sari"); [Link](this); [Link](yellowButton); redButton = new JButton("Kirmizi"); [Link](this); [Link](redButton); blueButton = new JButton("Mavi"); [Link](this); [Link](blueButton); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link](colorPanel, [Link]); editPanel = new JPanel(new FlowLayout()); group = new ButtonGroup(); editable = new JRadioButton("Duzenlenebilir", false); [Link](editable); [Link](this); [Link](editable); noneditable = new JRadioButton("Duzenlenemez", true); [Link](noneditable); [Link](this); [Link](noneditable); [Link](editPanel, [Link]); text = new JTextArea(); [Link]("Deneme Yazisi"); [Link](true); [Link](text, [Link]); [Link](southPanel, [Link]); [Link](this.EXIT_ON_CLOSE); [Link](300, 300); [Link](); } public void actionPerformed(ActionEvent e) { if([Link]() == yellowButton) { [Link]([Link]);
110
[Link]([Link]); [Link]([Link]); [Link]([Link]); } else if([Link]() == redButton) { [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); } else if([Link]() == blueButton) { [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); } if([Link]() == editable) [Link](true); else if([Link]() == noneditable) [Link](false); repaint(); }
}
} imdi bu rneimizi biraz daha derinlemesine inceleyelim. ncekilerde olduu gibi bu snf da, yine bir JFrame uygulamas ve ayn zamanda ActionListener olarak yaratlmaktadr. Ancak bu sefer birtakm nesneler dorudan JFramein Container nesnesi zerine yerletirilmek yerine, nce baz paneller zerine yerletirilmi ve daha sonra bu paneller JFrame zerine eklenerek uygulama tamamlanmtr. rneimizde tm nesneleri kendi zerinde tayan JFrame nesnesinin Container 18. satrda yaratlmaktadr. Daha sonra sadece renk opsiyonlarnn ayarlanaca dmeleri barndracak olan colorPanel isimli bir JPanel nesnesi yaratlm ve 24. satr ile 33. satrlar arasnda bu panelin tutaca nesneler de tek tek yaratlarak panel zerine eklenmitir. Benzer ekilde ekrana gelen text alanna yazmay salayan ya da yazma opsiyonunu kaldran seenekleri barndran editPanel isimli bir baka JPanel nesnesi ve onun tutaca nesneler de 37. ve 46. satrlar arasnda yaratlmaktadr. En son olarak zerinde editPanel ve colorPanel panellerini tutacak olan bir baka JPanel nesnesi southPanel adyla 22. satrda yaratlm ve JFramein c isimli Container nesnesinin SOUTH blgesine 54. satrda yerletirilmitir. c isimli Containern CENTER blgesine ise JTextArea isimli nesne 53. satrda olduu gibi dorudan yerletirlmitir. Bunun dnda aslnda uygulama genel olarak dier nesnelerin yaratlmas ve baz zelliklerinin set edilmesi eklinde tamamlanmaktadr. Burada karmza JTextArea ve JRadioButton isimli iki yeni GUI nesnesi gelmektedir. Aslnda adndan da anlalabilecei gibi JTextArea isimli nesne bize ierisine yaz yazabileceimiz bir text alan sunmaktadr. Yine birok hazr metodu sayesinde bu nesnenin baz zelliklerini deitirmek mmkndr. JRadioButton nesneleri de benzer ekilde seim dmeleri yaratmamz salar. Ancak bu nesneler yaratldktan sonra bir de 12. satrda yaratlan ButtonGroup adnda bir nesne ierisine eklenmektedir. Bu ekleme, bir RadioButton seili iken dierinin otomatik olarak seilmemesini salamaktadr. Eer birden fazla radio button nesnesini ButtonGroup ierisine eklemezseniz, ayn anda birden fazla seim yapabilirsiniz.
111
Bylece genel anlamda bir GUI uygulmasnda ilk olarak hiyerariyi belirlemek gerektiini ve daha sonra da bu hiyerariye uyarak gerekli olan GUI nesnelerini birtakm zellikleriyle yaratarak paneller zerine eklemek gerektiini grmekteyiz. Seim yapmak zere zerine baslan ya da seim yaplan bu nesnelerin her biri bir ActionEvent retmektedir. Listenera eklenen tm nesneler iin bu ActionEventler de dorudan actionPerformed metoduna gderilmektedir. Buna gre gnderilen her ActionEvent iin JTextArea nesnesinin bir zellii deitirilmektedir. Bylece kullanc asl olarak kulland text alann seimlere gre deitirebilme olanana sahip olur. Bu deiimler 66. satrdaki actionPerformed metodunda ele alnmtr.
GUI derslerimizin bundan sonra devam edecek olan ksmlarnda ncelikle yukarda bahsedilen temel kavramlarn kendi iinde detaylarna deinecek ve daha sonra da birok GUI nesnesini tek tek ele alarak inceleyeceiz. Daha sonra kapsaml bir GUI uygulamas gelitirerek GUI derslerimizi geride brakacaz. Bu derste anlatlan temel bilgileri kendiniz de deneyerek test etmeli ve kavramlar iyice irdelemelisiniz. ARATIRMA DEV Uygulama olarak; yukarda verilen son rneimize bir de yaz fontunun rengini deitiren opsiyonlarn yerald bir panelin nasl ekleneceini aratrabilirsiniz. Bunun iin ipucu olarak JTextArea nesnesinin bir metodunu (setFont) kullanabilirsiniz. Ama ondan nce bu metodu tetikleyecek birtakm seim dmeleri yaratmal ve bu dmeleri bir panel zerine yerletirerek uygulamaya dahil etmelisiniz. Bu da iyi bir tekrar ve yeni aratrma gerektirmektedir. imdiden kolay gelsin
112
Java ile Programlama Java2D Bundan nceki dersimizde arayz tasarmna bir giri yapmtk. Baz nesneleri de kullanarak genel olarak arayz tasarmnn nasl ele alnacan incelemitik. Bu genel kavramlar incelerken event handling container component
gibi kavramlar da renmitik. Bu dersimizde bu kavramlar kendi iinde daha detayl incelmeye balayacaz. Grafik arayz programlarnda sadece nesneler ile deil bu nesneler zerinde de yaz ve ekil gibi animasyonlarn da kullanldn grmtk. Hatrlarsak geen dersimizde Graphics nesnesini yardmyla bir component ierisinde yer alan paint metodu yeniden yazlarak, ilgili componentin zerinde istediimiz gibi 2 boyutlu yaz ya da resimler olmasn salayabiliyorduk. imdi bu iki boyutlu animasyonlar ile daha detayl ilgileneceiz.
Java 2 ile birlikte gelen Graphics2D ktphanesi ve paintComponent Metodu Java 2 ile birlikte daha da gelimi olan Graphics2d isimli ktphane bu 2 boyutlu animasyonlar daha detayl ele almamz salayan metodlara sahiptir. Eer paintComponent isimli metod kullanlrsa bu metoda otomatik olarak Graphics2D ktphanesi parametre olarak tanacaktr. Bizim yapmamz gereken tek ey gelen bu Graphics2D nesnesi iin bir tr dnm yapmaktr. rnek: public void paintComponent(Graphics g) { [Link](g); Graphics2D g2 = (Graphics2D) g; [Link].. .... }
Graphics2D de ekiller daha nesne ynelimlidir GraphicsD ktphanesi ierisinde Rectangle2D, Line2D, Ellipse2D gibi ekiller daha nesne ynelimli olarak ele alnmaktadr. rnein yeni bir drtgen izmek iin: Rectangle2D rect = new Rectangle2D(...); [Link](rect); demek yeterlidir. Oysa Graphics ktphanesinde bu izimlerde her ekil iin ayr bir metod kullanmak gerekirdi.
Graphics2Dde birimler int pikseller deil float deerlerdir. Graphics2Dde ekilleri ifade etmek iin kullanlan boyu ve nokta bilgileri int pikseller ile ifade edilmemktedir. Bunun nedeni ekiller inch ya da milimetre gibi daha esnek birimlerle belirtme olana salamaktr. Bu nedenle birimler float deerler olarak ele alnmaktadr. Ancak bu durumda da float deerlerin kullanlmas zorunlu bir bildirim gerektirdiinden bu deeri float olarak ele almak zorlamaktadr. rnein float f = 1.2 // yanltr. Bu deer double kabul edilir. Bunu float yapmak ii 1.2F yazlmaldr. Bu kargaay basitletirmek amacyla birer i snf olan [Link] ya da [Link] kullanlabilir. Bylece koordinat bilgiler ister float istenirse de double trnden ele alnabilir.
113
NOT: yi ama madem float deerlerde tr dnm zorluk karyorsa neden sadece double deerler kullanlmyor? nk aslnda float deerler double deerlerin yars kadar yer kaplar ve float deerleri ile yaplan hesapmalara double deerlerden daha hzldr.
public class SekilCizim extends JFrame { DrawPanel panel; Container c; public SekilCizim() { c = [Link](); panel = new DrawPanel(); [Link](panel); [Link](400, 400); [Link]("Sekiller"); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } public static void main(String arg[]) { new SekilCizim(); } } class DrawPanel extends JPanel { public void paintComponent(Graphics g) { [Link](g); Graphics2D g2 = (Graphics2D)g; Rectangle2D rectangle = new [Link](100, 100, 200, 150); Ellipse2D ellipse = new [Link](); [Link]([Link]); [Link]([Link]); [Link](rectangle); [Link](rectangle); [Link](ellipse);
} }
Aadaki rnekte de yine Graphics2D kutuphanesi kullanlarak 2 boyutlu basit bir grafik ugulamas gelitirilmitir:
114
import [Link].*; import [Link].*; import [Link].*; import [Link].*; public class Eksen extends JFrame implements ActionListener { JTextField xpoint, ypoint; JButton setPointsButton; CoordinatePanel coordinate; JPanel settings; Container c; public Eksen() { [Link](); [Link](); } public void prepareFrame() { [Link](420, 470); [Link]("Sekiller"); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } public void prepareComponents() { c = [Link](); [Link](new BorderLayout()); coordinate = new CoordinatePanel();
115
[Link](coordinate, [Link]); xpoint = new JTextField(3); ypoint = new JTextField(3); setPointsButton = new JButton("set point to new coordinates"); [Link](this); settings = new JPanel(); [Link](new FlowLayout()); [Link](new JLabel("x: ")); [Link](xpoint); [Link](new JLabel("y: ")); [Link](ypoint); [Link](setPointsButton); [Link](settings, [Link]); } public void actionPerformed(ActionEvent e) { if([Link]() == [Link]) { [Link](this, "dugmeye basldi"); [Link]([Link]([Link]()), [Link]([Link]())); [Link](); } } public static void main(String arg[]) { new Eksen(); } } class CoordinatePanel extends JPanel { int currentX, currentY; Ellipse2D nokta = new [Link](); int xSize = 400, ySize = 400; public CoordinatePanel() { [Link]([Link], [Link]); [Link] = 10; [Link] = 20; [Link](currentX, currentY);
} public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; Line2D [Link]); Line2D [Link]/2); // yline xline = = new new [Link]([Link]/2, [Link](0, 0, [Link]/2, [Link],
[Link]/2,
116
[Link]([Link]/2+[Link]-5, 5, 10, 10); [Link](xline); [Link](yline); [Link](nokta); } //Bu metod notanin yeni koordinatlarini set ediyor. public void setPoint(int x, int y) { [Link] = x; [Link] = y; [Link](); }
}
[Link]/[Link]-
SystemColor Snf Daha nce Color snf yardmyla birtakm renk nesneleri tanmlayabiliyorduk. SystemColor snf ierisinde ntanml olarak bulunan birok statik renk nesnesi vardr. Bu nesneler otomatik olarak kullanlan iletim sistemi nesnelerinin renklerinje gre ayarlanmtr. Bu statik nesnelerin genel bir listesi: desktop activeCaption window windowBorder windowText menu menuText text textText textInactiveText textHiglight textHiglightText scrollbar infoText
eklinde verilebilir. Mesela [Link]([Link]) Text ve Fontlar 2 Boyutlu uygulamalar ierisinde kesinlikle ele alnmas gereken nesneleri ierisinde textler ve fontlar gelmektedir. Daha nceki rneklerimizden biliyoruz ki [Link] isimli metod yardmyla birtakm text bilgileri component zerine yazabiliyorduk. Ancak bu yazda kullanlan fontu kendimiz belirleyemiyrduk. Font Snf Java da tanml olan Font isimli snf sayesinde yeni bir fon belirleyebiliyoruz. yle ki, bu font sistemde tanml olan Font ailesinden birisi olacak ekilde, style ve size bilgisi ile yaratlabiliyor: rnein: Font myFont = new Font(SansSerif, [Link], 12); Font iin kullnlabilecek style listesi [Link]
117
eklinde verilebilir. Sistemde yer alan fon t ailelerinin isimlerini de elde etmek mmkndr. Bunun iin kullanlabilecek metod GraphicsEnvironment isimli snfn ierisinde tanml olan getLocalGraphicsEnvironment isimli metodun geri dn deeri olan snfn getAvailableFontFamilyNames isimli metodu kullanmak gerekir.
import [Link].*; import [Link].*; public class Fonts { public static void main(String[] args) { String str= ""; String systemFonts[] = [Link]().getAvailableFontFamilyNames();
majlar Bundan nceki ksmda 2 boyutlu basit imajlarn nasl izilebileeini grdk. Ancak bazen sistemde yer alan fotoraf ve resimlerden meydana gelen imajlar izmek de gerekebilir. Bu imajlar harici olarak ele alnrlar ve program ierisinde kullanlabilecek bir nesne haline getirilirler. ncelikle bir ekilde sistemde ya da a zerinde bir imajn yeralmas gerekir. Daha sonra bu nesne program ierisine Image nesnesi olarak ekilebilir. Ancak bu ilem Toolkit snfnn getDefaultToolkit isimli metodundan geri gelen snfn getImage isimli metodu ile mmkndr. rnein sistemimizde [Link] isimli bir resim olsun:
import [Link].*; import [Link].*; public class ImageFrame extends JFrame { JScrollPane scroll; ImagePanel imPanel; Container c; int WIDTH; int HEIGHT;
118
public ImageFrame() { c = [Link](); [Link](new BorderLayout()); imPanel = new ImagePanel(); [Link] = [Link](); [Link] = [Link](); [Link](imPanel); [Link](); } public void prepareFrame() { [Link]([Link], [Link]); [Link]("ImageFrame"); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } public static void main(String[] args) { new ImageFrame(); } } class ImagePanel extends JPanel { Image myImage; public ImagePanel() { myImage = [Link]().getImage("G:\\egitim_yazil_seminer\\egitimler\\"+ "ACADEMYTECH\\javaDersleri\\derstekiOrnekler\\[Link]"); MediaTracker tracker = new MediaTracker(this); [Link](myImage, 0); try { [Link](0); } catch(InterruptedException e) {} [Link](new Dimension(800, 600)); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; [Link](myImage, 0, 0, null); } } Aratrma devi: Toolkit nesnesin ve getDefaultToolKit metodu ile geri gelen nesnenin metdolarn aratrnz.
119
NOT: ToolKit nesnesi yardmyla bir framein ekrann ortasnda grntlenmesi: Toolkit kit = [Link](); int screenX = (int)[Link]().getWidth(); int screenY = (int)[Link]().getHeight(); [Link](screenX/2 -[Link]/2, screenY/2- [Link]/2); Olay Kontrol (Event Handling) lk olarak olay kontrol detaylarna bakacaz. Daha nce temel olarak olay kontrol mekanizmasn zaten grmtk. Herhangi bir nesnenin daha nceden belirlenen bir listener ierisine kayt edilmesi ve bu listener ierisinde ele alnmasyla bir nesne iin exception handling yapm oluyorduk. Bildiimiz gibi herhangi bir dinleyiciye kaydedilen nesne zerinde bir olay meydana gelirse, bu olay even nesnesi ierisinde tanml olarak kayt edilen dinleyiciye gnderiliyordu. imdi bu layout mekanizmasn yeni bilgilerle tekrar ele alalm. aadaki rnekte javada ele alnabilen birtakm genel grnt deiimleni salayan bir program yazlmaktadr. nce rneimizi yazalm: import [Link].*; import [Link].*; import [Link]; import [Link].*; public class PlafTest extends JFrame implements ActionListener{ Container c; JButton metalButton, motifButton, windowsButton; public PlafTest() { c = [Link](); [Link](new FlowLayout()); [Link] = new JButton("Metal"); [Link](this); [Link]([Link]); [Link] = new JButton("Motif"); [Link](this); [Link]([Link]); [Link] = new JButton("Windows"); [Link](this); [Link]([Link]);
[Link](400, 400); [Link](false); [Link](JFrame.EXIT_ON_CLOSE); [Link](); }
120
} private void changeToMetal() { try { [Link]("[Link]"); [Link](this); } catch(Exception e) {} } private void changeToWin() { try { [Link]("[Link]"); [Link](this); } catch(Exception e) {} } private void changeToMotif() { try { [Link]("[Link]"); [Link](this); } catch(Exception e) {} }
rneimizde aslnda temel olarak farkl bir ilem yapmyoruz. Sadece LookAndFeel olarak anlan ve genel sistem grntsn set etmeye yarayan birtakm hazr nesnleri kullanyoruz. Bu nesneler her seferinde bu ekilde kullanldklar iin look-and-feel konusunda daha fazla detaya girmeyeceiz. WindowEventlerin dinlenmesi Window event, frame dediimiz nesneler zerinde meydana gelen olaylardr. Bir WindowEventi dinleyebilecek olan listener ise WindowListener nesnesidir. Bu nesne de tpk ActionListener gibi bir arayzdr. O halde bir snf WindowListener olarak dizayn etmek istiyorsak tpk ActionListener rneinde olduu gibi ancak bu sefer
121
WindwListener nesnesini implement ederek snfmz WindowEvent dinleyebilecek bir dinleyici snf haline getirebiliriz. bir WindowListener ierisinde aadaki metodlar yeralmaktadr: public interface WindowListener { void void void void void void void
}
windowOpened(WindowEvent e); windowClosing(WindowEvent e); windowIconified(WindowEvent e); windowActivated(WindowEvent e); windowClosed(WindowEvent e); windowDeiconified(WindowEvent e); windowDeactivated(WindowEvent e);
Adaptr Snflar yi ama sadece tekbir olay (mesela pencerenin kapatlmas) ele alabilecek bir listener yaratmak iin tm bu metodlar yazmak zorndamyz. Aslnda WindowListener bir arayz olduuna gre cevap evet olacaktr. leri bo olsa bile aslnda ele almadnz olaylar da yazmak zorunda kalrsnz. Ancak javba gelitricileri bunun da bir zmn gelitirmilerdir. yle ki sadece belirli olaylar ele almak istediiniz dinleyici snflar yazabilmek iin nceden bu snflar implement eden ve gerekli tm metodlarn bo bir ekilde yazan snflar tasarlanmtr. Bu snflara adaptr snflar denilir. Kullanc listener iin arayz kullanacana bu arayze ilikin adaptr snf kullanr ve Polymorphism yntemiyle sadece istedii olaylar ele alan metodlar yeniden yazmas yeterli olacaktr. aadaki rnekte yaratlan ereve uygulamas bir windowListenera kayt edilecek ancak bu erevenin sadece windowClosing ve windowIconified eventleri ele alnacaktr.
/*[Link]*/ import [Link].*; import [Link].*; import [Link].*; public class WindowEvents extends JFrame { Container c; PencereDinleyici dinleyici = new PencereDinleyici(); public WindowEvents() {
c = [Link](); [Link](new FlowLayout()); [Link](dinleyici); [Link](400, 400); [Link](false); //[Link](JFrame.EXIT_ON_CLOSE); [Link](); } public static void main(String arg[]) { new WindowEvents();
122
} } class PencereDinleyici extends WindowAdapter { public void windowClosing(WindowEvent e) { [Link](null, "Pencere kapaniyor"); [Link](0); } public void windowIconified(WindowEvent e) { [Link](null, "Pencere iconfied ediliyor"); } }
Yukardaki rneimizde dinleyici olarak tasarkanan snf WindowListener nesnesini implement edecek ekilde deil, WindowAdaptor isimli snf extend edecek ekilde tasarlanmtr. Daha nce de sylediimiz gibi aslnda WindowAdaptor isimli snf zaten arka planda WindowListener snfn implement etmi ve bu arayzn tm metodlarnn iin bo olarak yazmtr. Bylece biz WindowAdaptor snfndan tretme yaparak ve polimorfizm zelliini kullanarak sadece istediimiz dinleyici metodlarn yeniden yazarz.
KeyEventlerin Dinlenmesi Klavyeye basldnda meydana gelen olaylar KeyEvent nesnesi eklinde yaratlmaktadr. Bu nesnelerin dinlenmesi iin kullanlabilecek dinleyici arayzler KeyListener arayzdr. Ancak nceki ksmda anlattmz gibi sadece belirli key eventler ele alndmak isteniyorsa, KeyAdaptor snf da kullanlabilir. KeyListener arayznde yer alan metodlar KeyListener arayznde yer alan metdolarn listesi dkmantasyon yardmyla elde edilebilir.
keyEvent keyReleased, keyTyped Metodlar Kullanc bir tua bast zaman KeyEvent isimli olay yaratlr. Benzer ekilde bir tu brakld zaman KEY_RELEASED isimli olay tetiklenir. Bu iki olay bele alabileceiniz arayz metodlar keyPressed ve keyReleased isimli metodlardr. Bu ikisini birden kapsayan 3. metod ise keyTyped isimli metoddur.
VK_ terminolojisi KeyEvent sabitleri ve metodlar Herhangi bir tua basldnda iki tane kavram devreye girer. 1. hangi karaktere baslmtr? 2. si ise aslnda tam olarak klavye zerinde hangi tua baslmtr. Klavye zerindeki tular temsil eden saibitler VK_ ile ifade edilirler. rnein: KeyEvent.VK_A -> fiziksel olarak A tuunu temsil eder. KeyEvent.VK_SHIFT -> fiziksel olar4ak shift tuunu temsil eder. Bu ifadeler keyCode ad verilir ve KeyEvent nesnesinin getKeyCode() metdu ile elde edilir. Bu ifaddelerin saysal karlklar yerine KeyEvent.VK_A eklinde kullanlmalar ok daha kolay olur. Bunu yan sra klavyedeki control ya da shift gibi tularn o andaki durumlarn elde etmek iin yine KeyEvent nesnesinin isShiftDown, isControlDown, isAltDown metodlarndan yararlanlabilir Mesela public void keyPressed(KeyEvent e) {
123
Baslan tuun rettii tam karakter elde edilmek istendiinde getKeyChar() metodu da kullanlabilir. imdi tm bu bilgilerimizi pekitirmek amacyla aadaki rnei deneyelim: /* [Link]*/ import [Link]; import [Link].Graphics2D; import [Link]; import [Link]; import [Link].Line2D; import [Link].Point2D; import [Link]; import [Link]; class SketchPanel extends JPanel { Point2D last; ArrayList lines; public SketchPanel() { last = new [Link](100,100); lines = new ArrayList(); KeyHandler listener = new KeyHandler(); [Link](listener); } public void paintComponent(Graphics g) { [Link](g); Graphics2D g2 = (Graphics2D)g; //listedeki tum cizgileri ciziliyor for(int i = 0; i < [Link](); i++) [Link]((Line2D)[Link](i)); } public boolean isFocusTraversable() { return true; } public void add(int dx, int dy) { //last olan noktaya dx dy uzakliginda olan yeni noktayi hesapliyor Point2D end = new [Link]([Link]() + dx, [Link]() + dy); //son noktadan yeni noktaya kadar olan cizgi hazirlaniyor Line2D line = new [Link](last, end); //bu cizgi diger cizgilerin listesine kayit ediliyor [Link](line); repaint();
124
last = end; } private class KeyHandler implements KeyListener { public static final int LARGE_INCREMENT = 5; public static final int SMALL_INCREMENT = 1; public void keyPressed(KeyEvent e) { int keyCode = [Link](); //uzakligi ayarliyoruz int d; if([Link]()) d = LARGE_INCREMENT; else d = SMALL_INCREMENT; if(keyCode == KeyEvent.VK_RIGHT) add(d, 0); else if(keyCode == KeyEvent.VK_LEFT) add(-d, 0); else if(keyCode == KeyEvent.VK_UP) add(0, -d); else if(keyCode == KeyEvent.VK_DOWN) add(0, d); } public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { char keyChar = [Link](); //uzakligi ayarliyoruz int d; if([Link](keyChar)) { d = this.LARGE_INCREMENT; keyChar = [Link](keyChar); } else d = this.SMALL_INCREMENT; } } }
/*[Link]*/ import [Link].*; import import import import [Link].*; [Link].*; [Link].*; [Link].*;
125
public class SketchFrame extends JFrame { Container c; public SketchFrame() { c = [Link](); SketchPanel panel = new SketchPanel(); [Link](panel); [Link]("Sketch"); [Link](400, 400); [Link](false); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } public static void main(String[] args) { new SketchFrame(); }
}
Yukardaki programn tam olarak incelenmesinden nce focus kavramn irdelemekte fayda var. Focus Hakknda (isFocusTraversable metodu) Normalde bilgisayar zerinde mouse yardmyla herhangi bir pencere ya da nesne seilerek aktif hale getirilebilir. Herhangi bir pencere aktif iken klavyeden girilen giri bilgileri dorudan aktif olan nesneye gnderilmektedir. Bir java program alrken javaya ait bir pencere aktif olacaktr. te bu durumda klavyeden gnderilen bir giri deeri dorudan bir component zerine gnderilecektir. Giriin gnderildii bu nesneye focus denilir. Bir pencere ierisinde en az bir nesne focustur. Java penereleri ierisinde de focus lar belirli bir srayala nesneden nesneye geer. Ancak baz nesneler hibir zaman focus olmazlar. Paneller bu tip nesnelerdendir. te prgrammzda override edilen isFocusTraversable metodu, panelimizin focus olmasini salar. Bylece klavye inputlari artik panele gnderilebilecektir. MouseEventleri Ele Alma Normalde mouse ile baka bir component tetiklenirse MouseEventi yakalamay gerek yoktur. Ancak eitli paneller ya da baka compoentler zerinde mouse ile izim v.b. iler yaplacaksa o zaman fare tarafndan tetiklenen olaylar ele alnabilir. Kullanc bir fare tuuna bast zaman 3 tane listener metodu tetiklenir: - mousePressed(MouseEvent e) - mouseReleased(MouseEvent e) - mouseClicked(MouseEvent e) MouseEvent nesnesinin getX ve getY metodlar kullanlarak mouse gstericisinin tam olarak nereye bast bilgisi elde edilebilir. Ayrca tek tklama ve ift tklama arasndaki ayrm da getClickCount metodu yardmyla elde edilebilir.
public void mouseClicked(MouseEvent e) { int x = [Link](); int y = [Link](); if([Link] && [Link]() > 2) {
126
Yukardaki rnekte mouse hareketlerinin dinlemenin yan sra graphics nesnesinin elde edilmesine ilikin bir kullanm vardr. Burada Graphics nesnesini paintComponent metoduna gelen parametre ile elde etmek yerine kendimiz yaratyoruz. Bunun nedeni mouse ile panele tkladmzda paintCompnent nesnesinn arlmasn beklemeden ilemi hemen yapmak istememizdir. Bu ekilde kendimiz elde ettiimiz graphics nesneleerin dispose metodu ile yeniden izeriz. Ancak parametre ile gelen Graphics nesneleri repaint metodu ile izilmelidir. imdi tm mouse eventleri ele aln bir rnek yazalm..
/*[Link]*/ import [Link].*; import [Link].*; import [Link].*; public class MouseTracker extends JFrame implements MouseListener, MouseMotionListener { private JLabel statusBar; public MouseTracker() { super("Mouse olaylarini ele aliyoruz"); statusBar = new JLabel(); [Link]().add(statusBar, [Link]); [Link](this); [Link](this); [Link](JFrame.EXIT_ON_CLOSE); [Link](400, 400); [Link](); } public void mouseClicked(MouseEvent arg0) { [Link]("Clicked at [" + [Link]() + ", " + [Link]() + "]"); } public void mouseEntered(MouseEvent arg0) { [Link]("Mouse is in window"); } public void mouseExited(MouseEvent arg0) { [Link]("Mouse is not in window"); } public void mousePressed(MouseEvent arg0) { [Link]("Pressed at [" + [Link]() + ", " + [Link]() +
127
"]"); } public void mouseReleased(MouseEvent arg0) { [Link]("Released at [" + [Link]() + ", " + [Link]() + "]"); } public void mouseDragged(MouseEvent arg0) { [Link]("Dragged at [" + [Link]() + ", " + [Link]() + "]"); } public void mouseMoved(MouseEvent arg0) { [Link]("Moved at [" + [Link]() + ", " + [Link]() + "]"); } public static void main(String[] args) { new MouseTracker(); } }
ARATIRMA DEV : Yukardaki uygulamaya ek olarak bir de panele izgi izen bir pencere-mouse uygulamas yaznz. Yani, kullanc mouse ile drag ilemi yaptka ekranda izgi belirsin. pucu: zeri izilmek zere bir panel yaratlsn. Bu panel MouseMotionAdapter ile dinlensin. Panelin paint metodu currentX ve currentY denilen birtakm noktalar zerinde fillOval metodunu arsn...
128
Ders 17 Geen dersimizde GUI nin en nemli prensiplerinden birisi olan EventHandling mekanizmasn renmitik.
Layout Mekanizmas Bu dersimizde GUI nesnelerini ereveler zerinde yerletirebilmemiz iin gerekli olan ve daha nce sadece zet eklinde incelediimiz LayoutManagement mekanizmasn biraz daha detayl bir ekilde inceleyeceiz. Daha nce de sylediimiz gibi Layout mekanizmas GUI nesnelerinin ereve ya da panel zerinde hangi srayla ya da hangi hiyerari ile yerletirileceine dair bilgi vermektedir. BorderLayout Daha nce de bildiimiz gibi temel bir layout mekanizmas olan border layout nesneleri tayc nesneler zerinde 5 ayr parada yerletirebilmeyi salar.
BorderLayoutda nesnelerin pozisyonlar Aslnda ilk bata Center blgesi btn paneli kapsar. erevenin boyutu deitike Center blgesi de boyutunu deitirir. Ancak kenar blgeler boyutlarn deitirmezler. Kenar blgelerin snr da zerlerine nesne eklendike deiir. FlowLayoutdan farkl olarak, BorderLayout nesnelerin ilgili blgenin tamamamn kapsamasna izin verir. Ancak FlowLayout ilgili nesneleri onlarn preferred size deerlerinde yerlemesini salar. Nesneler BorderLayout ile ayarlanm bir panel ya da ereve zerine farkl blgelere yerletirilebilirler: Container c = getContentPane(); [Link](nesne, [Link]);
GridLayout GridLayout nesnelerin yerleme dzenini satr ve stnlar zerinde ele alr. Ancak GridLayout kullanld zaman her hcrenin kaplad alan hep ayn byklkte olacaktr. GridLayout ile panel dzeni set edilirken blnmek istenen satr ve stn says parametre olarak belirtilir: [Link](new GridLayout(3, 4)); 3 satr ve 4stunluk bir layout mekanizmas.. Box Layout
129
Nesnelerin tek satr ya da tek stun ierisinde yerletirilmesini GridLayoutdan daha esnek bir ekilde ele alan bir modeldir. ntanml layout modeli FlowLayout olan JPanel taycs gibi, ntanml layout modeli BoxLayout olan Box adnda bir tayc snf daha vardr. Box Layout modeine sahip yeni bir Box tayc rnei yaratmak iin: Box b = [Link](); Box b = [Link](); [Link](okButton); Horizontal box taycs nesneleri soldan saa yerletirir. Vertical Box nesnesi nesneleri yukardan aaya yerletirir. Her nesne 3 adet boyut deerine sahiptir: prefferred size maximum size minimum size Aada bir box layout modeline sahip horizontal Box taycsnn almasna ilikin detaylar srasyla belirtilmektedir: Box container; - nce en yksek nesnenin maximum yksekliini hesaplar. - Daha sonra tm nesneleri yatay olarak bu ykseklie uzatmay dener. - Eer bir nesne bu ykseklikte uzatlamyorsa, o nesnenin y eksenideki konumu ele alnr. Bu ilem getAlignmentY metodu ile salanr. (0 align to top, 1 align to bottom, 0.5 align to center). Bu metod bu float deerlerden birtanesini geri dndrr. Bylece nesnenin y ekseni zerindeki konumlandrlmas tamamlanr. - Her nesnenin preferred width deeri elde edilir ve toplanr. - Eer toplam uzunluklar box uzunluundan daha az ise, o zaman nesneler maximum size deerleri gz nne alnarak box uzunluuna [Link] arasnda hi boluk braklmaz. Eer nesnelerin toplam uzunluu box uzunluundan daha fazla ise, o zaman minimum size deerleri kullanlr. Yine de smazlar ise baz nesneler grnmeyecektir. Vertical box taycs iin yukardaki ilemler benzer ekilde alacaktr.
ntnaml olarak BoxLayout modelinde nesneler arasnda hi boluk braklmaz. stenilen oranda boluk nrakmak iin baz alan filtreleri kullanlr: Struts Rigid areas Glue Strut nesneler arasna baz boluklar ekler: Box b = [Link](); [Link](label) [Link]([Link](10)); [Link](textField); Rigid area filteri de Struts gibi boluk brakmak amacyla kullanlr. Ancak bu filtre hem yatay hem de dzey alanda tek seferde belirli oranda boluk brakmaya olanak verir. Mesela: [Link]([Link](new Dimension(5, 20)); ifadesi, horizontal bir layout kullnrken nesneler arasnda 5 pixel boluk ve box ykesklii ile 20 pixel boluk yaratr.
130
Glue filtresi, nesneler arasna mmkn olan tm boluu ekler. Yani bir glue filtresi kullanlmas durumunda box zerindeki tm bo alan tketilir. [Link](button1); [Link]([Link]()); [Link](button2); /*** [Link] *****/ import [Link].*; import [Link].*; import [Link].*; public class BoxLayoutTest { public static void main(String arg[]) { new BoxLayoutFrame(); } } class BoxLayoutFrame extends JFrame { private final int WIDTH = 300, HEIGHT = 400;
public BoxLayoutFrame() { setTitle("BoxLayoutTest"); setSize(WIDTH, HEIGHT); JLabel label1 = new JLabel("Name: "); JTextField textField1 = new JTextField(10); [Link]([Link]()); Box hbox1 = [Link](); [Link](label1); [Link]([Link](10)); [Link](textField1); JLabel label2 = new JLabel("Password: "); JTextField textField2 = new JTextField(10); [Link]([Link]()); Box hbox2 = [Link](); [Link](label2); [Link]([Link](10)); [Link](textField2); JButton button1 = new JButton("Ok"); JButton button2 = new JButton("Cancel"); Box hbox3 = [Link](); [Link](button1); [Link]([Link](10)); [Link](button2); Box vbox = [Link](); [Link](hbox1);
131
GridBagLayout GridBag layoutu limitsiz bir Grid layout gibi dnebiliriz. Dier layout modelleri ierisinde en karmak ve en gl olandr. Bu modelde kolon ve satrlardaki hcrelerin boyutlar deitirilebilmektedir. Hcreler birbirleri ile birletirilerek daha geni hcreler elde edilebilir. GridBagLayout tasarm ilk nce el yordamyla kat kalem zerinde yaplmaldr. Tm nesnelerin yerleri ka satr ve ka stun kaplayacaklar belirlenir. GridBagLayout kullanabilmek iin ncelikle bir GridBagConstraints nesnesi tasarlanmaldr. Bu nesne bir nesnenin GridBagLayout hcrelerine nasl yerleeceini belirler. gridx, gridy, gridwidth, gridheight Bu zellikler (kstlar) bir nesnenin grid zerinde nereye yerleeceini belirler. gridx ve gridy eklenecek olan nesnenin sol st ksmnn yer alaca hcrenin kendisini belirler. gridwidth ve gridheight, sol st kesi yerletirilen bu nesnenin ka tane satr ve ka tane stun yer kaplayacan belirler.
weightx, weighty Bu deerler bir nesnenin yer ald hcrenin boyutlarn deimesine ilikin zellikleri belirler. weightx ve weighty deerlerinin 0a set edilmesi, taycnn boyutlarnn deimesi durumunda ilgili nesnenin yer ald hcrenin x ya da y boyutlarnn sabit kalmasna neden olur. Bu deerlerin 0 dnda set edilmesi panelin
132
yeniden boyutlandrlmas durumunda ilgili hcredeki nesnenin de boyutlarnn uzamasna nedenl olur. weight deeri daha byk olan nesne yeniden boyutlanma srasnda daha fazla yer kaplar. Eer tm nesneler iin weight deerleri 0 yaplrsa, o zaman GUI boyutlar deitike nesneler de GUI nin ortasnda yzecektir.
fill, anchor fill, bir nesnenin bulunduu alan ierisinde tm alan kapsamamas iin gerekli ayar set eder: [Link]: alan hi doldurmaz [Link]: sadece dikeyde doldurur [Link]: sadece yatayda doldurur [Link]: tum alan doldurur anchor, eer nesne alan doldurmuyorsa (hibiryerde doldurmuyorsa, dikeyde doldurmuyorsa ya da yatayda doldurmuyorsa) bu blgede nerede yer alacan belirlemek iin kullanlr. [Link]: doldurmad alanda kuzeye dayal [Link]: doldurmad alanda merkezde [Link]: ... [Link]: ... ...
GridBagLayout modelinin salad bu esneklii kullanabilmek iin aslnda aadaki 4 temel adm uygulanmaktadr: 1) GridBagLayout trnde bir rnek yaratlr. Ancak hi bir deer verimez. Sadece ntanml olarak bu nesne yaratlr. 2) Tayc nesnenin layout modeli bu rnek trne set edilir. 3) GridBagConstraints trnde bir rnek yaratolr. Bu nesne aslnda dier nesnelerin GridBag ierisinde nasl yerleeceini belirleyecek zellikleri tutar ve set eder. 4) Eklencek olan her nesne iin, istenilen GridBagConstraints zellikleri set edilir ve aadaki add metodu ile nesneler tayc zerine eklenir: add(component, constraints);
import [Link].*; import [Link].*; import [Link].*; public class GridBagDemo extends JFrame { private Container container; private GridBagLayout gbLayout; private GridBagConstraints gbConstraints; public GridBagDemo() { super( "GridBagLayout" ); container = getContentPane(); gbLayout = new GridBagLayout(); [Link]( gbLayout ); // instantiate gridbag constraints gbConstraints = new GridBagConstraints();
133
JTextArea ta = new JTextArea( "TextArea1", 5, 10 ); JTextArea tx = new JTextArea( "TextArea2", 2, 2 ); String names[] = { "Iron", "Steel", "Brass" }; JComboBox cb = new JComboBox( names ); JTextField tf = new JTextField( "TextField" ); JButton b1 = new JButton( "Button 1" ); JButton b2 = new JButton( "Button 2" ); JButton b3 = new JButton( "Button 3" ); // text area // weightx and weighty are both 0: the default // anchor for all components is CENTER: the default [Link] = [Link]; //[Link] = [Link]; addComponent( ta, 0, 0, 1, 3 ); // button b1 // weightx and weighty are both 0: the default [Link] = [Link]; addComponent( b1, 0, 1, 2, 1 ); // combo box // weightx and weighty are both 0: the default // fill is HORIZONTAL addComponent( cb, 2, 1, 2, 1 ); // button b2 [Link] = 1000; // can grow wider [Link] = 1; // can grow taller [Link] = [Link]; addComponent( b2, 1, 1, 1, 1 ); // button b3 // fill is BOTH [Link] = 0; [Link] = 0; addComponent( b3, 1, 2, 1, 1 ); // textfield // weightx and weighty are both 0: fill is BOTH addComponent( tf, 3, 0, 2, 1 ); // textarea // weightx and weighty are both 0: fill is BOTH addComponent( tx, 3, 2, 1, 1 ); setSize( 300, 150 ); show(); } // addComponent is programmer defined private void addComponent( Component c, int row, int column, int width, int height ) { // set gridx and gridy [Link] = column; [Link] = row; // set gridwidth and gridheight [Link] = width; [Link] = height;
134
// set constraints [Link]( c, gbConstraints ); [Link]( c ); // add component } public static void main( String args[] ) { GridBagDemo app = new GridBagDemo(); [Link]( new WindowAdapter() { public void windowClosing( WindowEvent e ) { [Link]( 0 ); }
} ); } }
/*** [Link] ***/ import [Link].*; import [Link].*; import [Link].*; public class FontDialog { public static void main(String[] args) { new FontDialogFrame(); } } class FontDialogFrame extends JFrame { JComboBox face, size; JCheckBox bold, italic; JTextArea sample; public FontDialogFrame() { setTitle("Font Dalog"); setSize(400, 400); /*Contaner ve Layout yaratiliyor*/ Container c = [Link](); GridBagLayout gbl = new GridBagLayout(); [Link](gbl); ActionListener listener = new FontAction(); JLabel faceLabel = new JLabel("Face: ");
135
face = new JComboBox(new String[] {"Serif", "SansSerif", "Monospaced", "Dialog", "DialogInput"}); [Link](listener); JLabel sizeLabel = new JLabel("Size: "); size = new JComboBox(new String[] {"8", "10", "12", "15", "18", "24"} ); [Link](listener); bold = new JCheckBox("Bold"); [Link](listener); italic = new JCheckBox("Italic"); [Link](listener); sample = new JTextArea(); [Link]("Bugun, bundan sonraki gunlerinin ilk gunudur"); [Link](false); [Link](true); //satir bitince alt satira gecis [Link]([Link]()); /*Grid tanimlamalarimini hazirliyoruz*/ GridBagConstraints constraints = new GridBagConstraints(); [Link] = [Link]; [Link] = [Link]; [Link] = 0; [Link] = 0; add(faceLabel, constraints, 0, 0, 1, 1); add(sizeLabel, constraints, 0, 1, 1, 1); [Link] = [Link]; [Link] = 100; add(face, constraints, 1, 0, 1, 1); add(size, constraints, 1, 1, 1, 1); [Link] = 100; [Link] = [Link]; [Link] = [Link]; add(bold, constraints, 0, 2, 2, 1); add(italic, constraints, 0, 3, 2, 1); [Link] = [Link]; add(sample, constraints, 2, 0, 1, 4); show(); } public void add(Component c, GridBagConstraints constraints, int x, int y, int w, int h) { [Link] = x; [Link] = y; [Link] = w; [Link] = h; getContentPane().add(c, constraints); }
136
private class FontAction implements ActionListener { public void actionPerformed(ActionEvent e) { String fontFace = (String)[Link](); int fontStyle = ([Link]() ? [Link] : 0) + ([Link]() ? [Link] : 0); int fontSize = [Link]( (String)[Link]() ); [Link](new Font(fontFace, fontStyle, fontSize)); [Link](); }
} }
Swing Nesneleri zerinde Bir Tur Model-view-controller (MVC) yaps swing nesnelerinin tasarlanmasnda ve kullanlmasnda dikkat edilen 3 temel yaklam temsil eder. Model: sadece nesnenin ieriidir. Yani gorsel adan hibirsey ifade etmez. Model ierik hakknda bilgiyi alan ve ierigi degistirne metodlarn tasarmdr. View: Bir nesnenin ekrandaki goruntusunu temsil eder. Controller: Kullanc girislerini ele alr.
JButton Bir dugmeye basldg zaman ActionEvent yaratlr. Bu ActionEven uzerinden kullanlabilecek metodlar: getActionCommand() getMnemonic() : dugme uzerine fare imleci ile geldiginiziden ekranda beliren ipucu kutucugu isArmed(): Eger dugmeye basildiysa ve mouse hala uzerindeyse true isEnabled(): eger dugme secilebilir nitelikte ise true isPressed(): Eger dugmeye basildiysa ve mouse hala release edilmediyse true isRollover(): Eger mouse hala uzerindeyse true isSelected() : Eger dugme tek tklama gbi bir hareketle secildiyse
JTextFields Text girislerini elde alamak amacyla kullanlr. void setText(String t) String getText() void setEditable(boolean b) setFont(new Font()): alan icerisindeki font degerini degistirmek icin kulanlabilir. JTextField(String str, int colsize)
137
Text field icerisindeki degisiklikler Text field icerisindeki her degisikligi control etmek icin biraz efor harcamak gerekir. Bu islem icin key listener dinlemek pek mantkl olmayabilir. Cunku baz tuslar zaten bir tex girisi yapmazlar (ok tuslari gibi) Ayrca text girisleri fare ile de yaplabilir. Butun text nesneleri icin model, Document denilen bir arayz tarafndan ifade edilir. Kontrol edilmek istenen text nesnesi icin bir document listener yuklenerek- nesne uzerindeki her degisiklik elde edilebilir: [Link]().addDocumentListener(listener); //text nesnesni temsil eden document nesnesi elde edilerek bir document listener nesnesine kaydediliyor.
Bu durumda Text nesnesinde meydana gelen her degisiklikjte asagidaki metodlardan birisi tetiklenir, void insertUpdate(DocumentEvent e) void removeUpdate(DocumentEvent e) void changeUpdate(DocumentEvent e) 3 metod her text nesnesi icin cagrilmaz (style- size v.b. degisiklikler.) Ancak ilk iki metod text alanna yaplan bir giris ya da slime isleminde tetiklenir: Kontrollu klavye girisine iliskin bir ornek import [Link].*; import [Link].*; import [Link].*; import [Link].*; public class TextTest extends JFrame implements ActionListener, KeyListener { Container c; JButton dugme; JTextField text; public TextTest() { c = getContentPane(); [Link](new FlowLayout());
dugme = new JButton("Gonder"); [Link]("int bilgiyi gonderir"); [Link](this); [Link]([Link]); [Link]([Link]); [Link](dugme); text = new JTextField("0", 10); [Link](this); [Link](text); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(240, 120); setResizable(false); show();
138
public void actionPerformed(ActionEvent e) { int strInt = strInt = [Link]([Link]()); if(strInt == 42) [Link](0); else [Link](this, ""+strInt); } public void keyPressed(KeyEvent e) { int k = [Link](); if(k k k k != != != != KeyEvent.VK_0 KeyEvent.VK_3 KeyEvent.VK_6 KeyEvent.VK_9 && && && && k k k k != != != != KeyEvent.VK_1 && k != KeyEvent.VK_2 && KeyEvent.VK_4 && k != KeyEvent.VK_5 && KeyEvent.VK_7 && k != KeyEvent.VK_8 && KeyEvent.VK_BACK_SPACE) {
[Link](this, "rakam giriniz.."); String str = [Link](); str = [Link](0, [Link]()-1); [Link](str); [Link](); } [Link](); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public static void main(String arg[]) { new TextTest(); }
}
JPasswordField Password alanlar text girileri gibidir. Ancak kullanc tarafndan girilen bilgi ekranda * tuslari ile gorunur. JPasswordField(String str, int colsize) void setEchoChar(char echo): gizleyici karakter sembolu char [] getPassword(): password alan icerisinde saklanan password bilgisini geri gonderir. Ancak bu bilgi String olarak gonderilmez. Bunun nedeni Stringler garbage collector devreye girene kadar hazfzadan silinmezler. JTextArea Bazen kullancdan alnacak olan bilgi textfield gibi kucuk alanlarda degil daha buyuk alanlarda saklanma istenebilir. JTextArea(line, column)
139
void setLineWrap(boolean b): Text alannn kolon uzunlugundan daha uzun satirlar bolunur. Ancak bu bolme islemi sanaldir. Yani orjinal text icerisine \n eklenmez. Ancak kullanc kendisi Enter tusuna basarsa bu bilgi orjinal tex icerisine eklenir. Java da bir TextArea nn kendisine ait scroll bar yoktur. Bu nedenle gerektiginde kullanc kendisi TextArea nesnesini bir ScrollBar icerisine eklemelidir. JScrollPane scroll = new JScrollPane(new JTextArea(8, 40)); [Link](scroll, [Link]); Gereginden fazla text girisi yapildiginda scroll bar otomatik olarak belirecektir.
import [Link].*; import [Link].*; import [Link].*; public class TextAreaTest { public static void main(String[] args) { TextAreaFrame frame = new TextAreaFrame(); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } } /** A frame with a text area and buttons for text editing */ class TextAreaFrame extends JFrame { public TextAreaFrame() { setTitle("TextAreaTest"); setSize(WIDTH, HEIGHT); Container contentPane = getContentPane(); buttonPanel = new JPanel(); // add button to append text into the text area JButton insertButton = new JButton("Insert"); [Link](insertButton); [Link](new ActionListener() { public void actionPerformed(ActionEvent event) { [Link]("The quick brown fox " + "jumps over the lazy dog. "); } }); // add button to turn line wrapping on and off wrapButton = new JButton("Wrap"); [Link](wrapButton); [Link](new ActionListener()
140
{ public void actionPerformed(ActionEvent evt) { boolean wrap = ![Link](); [Link](wrap); [Link](); [Link](wrap ? "No Wrap" : "Wrap"); } }); [Link](buttonPanel, [Link]); // add a text area with scroll bars textArea = new JTextArea(8, 40); scrollPane = new JScrollPane(textArea); [Link](scrollPane, [Link]); } public static final int WIDTH = 300; public static final int HEIGHT = 300; private private private private } import [Link].*; import [Link].*; import [Link].*; public class TextEditTest { public static void main(String[] args) { TextEditFrame frame = new TextEditFrame(); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } } /** A frame with a text area and components for search/replace. */ class TextEditFrame extends JFrame { public TextEditFrame() { setTitle("TextEditTest"); setSize(WIDTH, HEIGHT); Container contentPane = getContentPane(); JPanel panel = new JPanel(); // add button, text fields and labels JButton replaceButton = new JButton("Replace"); [Link](replaceButton); [Link](new ReplaceAction()); JTextArea textArea; JScrollPane scrollPane; JPanel buttonPanel; JButton wrapButton;
141
from = new JTextField("brown", 8); [Link](from); [Link](new JLabel("with")); to = new JTextField("purple", 8); [Link](to); [Link](panel, [Link]); // add text area with scroll bars textArea = new JTextArea(8, 40); [Link] ("The quick brown fox jumps over the lazy dog."); JScrollPane scrollPane = new JScrollPane(textArea); [Link](scrollPane, [Link]); } public static final int WIDTH = 400; public static final int HEIGHT = 200; private JTextArea textArea; private JTextField from; private JTextField to; /** The action listener for the replace button. */ private class ReplaceAction implements ActionListener { public void actionPerformed(ActionEvent event) { String f = [Link](); int n = [Link]().indexOf(f); if (n >= 0 && [Link]() > 0) [Link]([Link](), n, n + [Link]()); } } } Etiketler ve Nesnelerin Etiketlendirilmesi JLabel(String str, int alignment) [Link], RIGHT, CENTER, NORTH, EAST setText setIcon(Icon a)
JCheckBox Kullancdan sadece evet ya da hayir girilerini almak icin check box kullanlabilir. Bu nesneler yaratlrken label ile birlikte yaratlrlar. JCheckBox(String str) void setSelected(Boolean b) boolean isSelected()
142
JRadioButton Bu nesneler de check box lar gibi olumlu ya da olumsuz bir seimi ifade ederler. JRadioButton(String label, boolean selection)
import [Link].*; import [Link].*; import [Link].*; public class ButtonsTest extends JFrame implements ActionListener { Container c; JLabel l; JRadioButton r1, r2; JPanel bp, lp; JCheckBox c1, c2; ButtonGroup group; Font f; int boldvalue = 0, italicvalue = 0, size = 24; public ButtonsTest() { c = getContentPane(); l = new JLabel("Hakan Gozutok"); f = new Font("Serif", boldvalue + italicvalue, size); [Link](f); r1 = new JRadioButton("Blue"); [Link](this); r2 = new JRadioButton("Red"); [Link](this); group = new ButtonGroup(); [Link](r1); [Link](r2); c1 = new JCheckBox("Bold"); [Link](this); c2 = new JCheckBox("Italic"); [Link](this); bp = new JPanel(); [Link](r1); [Link](r2); [Link](c1); [Link](c2); /*label icin hazirlanan panel*/ lp = new JPanel(); [Link](l); [Link](lp, [Link]); [Link](bp, [Link]);
143
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 400); show(); } public void actionPerformed(ActionEvent e) { if([Link]() == r1) [Link]([Link]); else if([Link]() == r2) [Link]([Link]); if([Link]() == c1 || [Link]() == c2) { boldvalue = [Link]() ? [Link] : 0; italicvalue = [Link]() ? [Link] : 0; f = new Font("Serif", boldvalue + italicvalue, size); [Link](f); } [Link](); [Link](); } public static void main(String[] args) { new ButtonsTest(); }
}
JComboBox Birden fazla seim yapmak gereken durumlarda Combox nesnelerinin kullanmak iyi bir zm olabilir. faceCombo = new JComboBox(); [Link](true); [Link](Serif); [Link](SansSerif); Object getSelectedItem() JComboBox(String []str) void removeItemAt(int index) void removeItem(String item) import [Link].*; import [Link].*; import [Link].*; public class ButtonsTest extends JFrame implements ActionListener { Container c; JLabel l; JRadioButton r1, r2; JPanel bp, lp; JCheckBox c1, c2; ButtonGroup group; Font f;
144
int boldvalue = 0, italicvalue = 0, size = 24; JComboBox sizecombo; public ButtonsTest() { c = getContentPane(); l = new JLabel("Hakan Gozutok"); f = new Font("Serif", 0, 24); [Link](f); r1 = new JRadioButton("Blue"); [Link](this); r2 = new JRadioButton("Red"); [Link](this); group = new ButtonGroup(); [Link](r1); [Link](r2); c1 = new JCheckBox("Bold"); [Link](this); c2 = new JCheckBox("Italic"); [Link](this); sizecombo = new JComboBox(new String [] {"8", "12", "24", "48"}); [Link]("24"); [Link](true); [Link](this); bp = new JPanel(); [Link](r1); [Link](r2); [Link](c1); [Link](c2); [Link](sizecombo); /*label icin hazirlanan panel*/ lp = new JPanel(); [Link](l); [Link](lp, [Link]); [Link](bp, [Link]); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 400); show(); } public void actionPerformed(ActionEvent e) { if([Link]() == r1) [Link]([Link]); else if([Link]() == r2) [Link]([Link]); if([Link]() == c1 || [Link]() == c2) { boldvalue = [Link]() ? [Link] : 0; italicvalue = [Link]() ? [Link] : 0; [Link](new Font("Serif", boldvalue + italicvalue, size));
145
} if([Link]() == sizecombo) { m("combo"); size = [Link]([Link]().toString()); [Link](new Font("Serif", boldvalue + italicvalue, size)); } [Link](); [Link](); } public void m(String str) { [Link](null, str); } public static void main(String[] args) { new ButtonsTest(); } }
JSlider Bu nesneler birtakm devam eden srekli secimler uzerinde kullancnn secim yapmasn salayan nesnelerdir. Kullanc bu secim rastgele degil srayla yapabilir. (Biliyoruz ki combo box lar kullanlrken secim rastgle yaplyordu) En genell sekliyle bir JSlider nesnesi asagidaki gibi yaratlr: new JSlider(min, max, initialValue) Eger yatay degil de dikey bir JSlider yaratlmak istenirse: JSlider sl = new JSlider([Link], min, max, initialValue) Ancak bu slider yaratma yntemleri sadece dz bir slider yaratr. Sliderlarn bir dekorasyon ile de yaratlabileceini belirtmek gerekir:
ChangeListener Slider hareket ettigi zaman ChangeEvent yaratlr. Bu nedenle Sliderlarn dinlenmesi iin onlar ChangeListener nesnesine eklemek gerekir. Bir ChangeListener arayz ierisinde: stateChanged(ChangeEvent e) metodu yer alr. Bir Slider dekoratif olarak da yaratlabilir. Bunun iin: [Link](20) [Link](5); [Link](true): Bu dekorlarn gorunur olmasn salar. [Link](true)
146
metoldarndan yararlanlr. [Link](true): Major tick space leri gorunur klar Slider boyutlandirmasi iin: [Link](new Dimension(550, 50)); [Link](new Dimension(550, 50)); [Link](new Dimension(550, 50));
public class ButtonsTest extends JFrame implements ActionListener, ChangeListener { Container c; JLabel l; JRadioButton r1, r2; JPanel bp, lp; JCheckBox c1, c2; ButtonGroup group; Font f; int boldvalue = 0, italicvalue = 0, size = 24; JComboBox sizecombo; JSlider sl; JPanel np; public ButtonsTest() { c = getContentPane(); l = new JLabel("Hakan Gozutok"); f = new Font("Serif", 0, 24); [Link](f); r1 = new JRadioButton("Blue"); [Link](this); r2 = new JRadioButton("Red"); [Link](this); group = new ButtonGroup(); [Link](r1); [Link](r2); c1 = new JCheckBox("Bold"); [Link](this); c2 = new JCheckBox("Italic"); [Link](this); sizecombo = new JComboBox(new String [] {"8", "12", "24", "48"}); [Link]("24"); [Link](true); [Link](this); sl = new JSlider(0, 100, 24); [Link](5); [Link](10); [Link](true);
147
[Link](true); [Link](this);
bp = new JPanel(); [Link](r1); [Link](r2); [Link](c1); [Link](c2); [Link](sizecombo); /*label icin hazirlanan panel*/ lp = new JPanel(); [Link](l); np = new JPanel(); [Link](sl); [Link](lp, [Link]); [Link](bp, [Link]); [Link](np, [Link]); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600, 400); show(); } public void actionPerformed(ActionEvent e) { if([Link]() == r1) [Link]([Link]); else if([Link]() == r2) [Link]([Link]); if([Link]() == c1 || [Link]() == c2) { boldvalue = [Link]() ? [Link] : 0; italicvalue = [Link]() ? [Link] : 0; [Link](new Font("Serif", boldvalue + italicvalue, size)); } if([Link]() == sizecombo) { m("combo"); size = [Link]([Link]().toString()); [Link](new Font("Serif", boldvalue + italicvalue, size)); } [Link](); [Link](); } public void m(String str) { [Link](null, str); } public static void main(String[] args) {
148
new ButtonsTest(); } public void stateChanged(ChangeEvent e) { [Link](new Font("Serif", boldvalue + italicvalue, [Link]())); }
} Ayrca slider uzerindeki bu bilgileri String ya da icon etiketler seklinde de ifade etmek mumkundur. Bunun icin: setLabelTable(HashTable ltable) metodunu kullanrz. Asagida buna iliskin orek kodlar yer alr.
HashTable labelTable = new HashTable(); [Link](new Integer(0), new JLabel(A)); [Link](new Integer(20), new JLabel(B)); . [Link](new Integer(100), new JLabel(F)); [Link](labelTable); import import import import import [Link].*; [Link].*; [Link].*; [Link].*; [Link].*;
public class SliderTest { public static void main(String[] args) { SliderTestFrame frame = new SliderTestFrame(); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } } /** A frame with many sliders and a text field to show slider values. */ class SliderTestFrame extends JFrame { public SliderTestFrame() { setTitle("SliderTest"); setSize(WIDTH, HEIGHT); sliderPanel = new JPanel(); [Link](new FlowLayout([Link])); // common listener for all sliders listener = new ChangeListener() { public void stateChanged(ChangeEvent event) {
149
// update text field when the slider value changes JSlider source = (JSlider)[Link](); [Link]("" + [Link]()); } }; // add a plain slider JSlider slider = new JSlider(); addSlider(slider, "Plain"); // add a slider with major and minor ticks slider = new JSlider(); [Link](true); [Link](20); [Link](5); addSlider(slider, "Ticks"); // add a slider that snaps to ticks slider = new JSlider(); [Link](true); [Link](true); [Link](20); [Link](5); addSlider(slider, "Snap to ticks"); // add a filled slider slider = new JSlider(); [Link](true); [Link](20); [Link](5); [Link]("[Link]", [Link]); addSlider(slider, "Filled"); // add a filled and inverted slider slider = new JSlider(); [Link](true); [Link](20); [Link](5); [Link]("[Link]", [Link]); [Link](true); addSlider(slider, "Inverted"); // add a slider with numeric labels slider = new JSlider(); [Link](true); [Link](true); [Link](20); [Link](5); addSlider(slider, "Labels"); // add a slider with alphabetic labels slider = new JSlider(); [Link](true); [Link](true);
150
[Link](20); [Link](5); Hashtable labelTable = new Hashtable(); [Link](new Integer(0), new JLabel("A")); [Link](new Integer(20), new JLabel("B")); [Link](new Integer(40), new JLabel("C")); [Link](new Integer(60), new JLabel("D")); [Link](new Integer(80), new JLabel("E")); [Link](new Integer(100), new JLabel("F")); [Link](labelTable); addSlider(slider, "Custom labels"); // add a slider with icon labels slider = new JSlider(); [Link](true); [Link](true); [Link](true); [Link](20); [Link](20); labelTable = new Hashtable(); // add card images [Link](new Integer(0), new JLabel(new ImageIcon("[Link]"))); [Link](new Integer(20), new JLabel(new ImageIcon("[Link]"))); [Link](new Integer(40), new JLabel(new ImageIcon("[Link]"))); [Link](new Integer(60), new JLabel(new ImageIcon("[Link]"))); [Link](new Integer(80), new JLabel(new ImageIcon("[Link]"))); [Link](new Integer(100), new JLabel(new ImageIcon("[Link]"))); [Link](labelTable); addSlider(slider, "Icon labels"); // add the text field that displays the slider value textField = new JTextField(); Container contentPane = getContentPane(); [Link](sliderPanel, [Link]); [Link](textField, [Link]); } /** Adds a slider to the slider panel and hooks up the listener @param s the slider @param description the slider description */ public void addSlider(JSlider s, String description) { [Link](listener); JPanel panel = new JPanel(); [Link](s); [Link](new JLabel(description)); [Link](panel);
151
} public static final int WIDTH = 350; public static final int HEIGHT = 450; private JPanel sliderPanel; private JTextField textField; private ChangeListener listener; }
152
Ders 19 Menuler Menuler bir GUI uygulamasnn en vazgecilmez parcalarndan birisidir. Bir menu cubugu uzerinde birtakm menu nesneleri ve alt menuler yer almaktadr. Bu ksmdan menuleri nasl ele alacamz greceiz. JMenuBar menuBar = new JMenuBar(); Yukarda yaratlan bu menu bar istedigimiz yere ekleyebileceimiz bir nesnedir. Genelde bir menu, bir JFrame nesnesinin ust ksmna yerlestirilir. Bu islem asagfidaki gibi yapilabilir: [Link](menuBar); menubar icerisine bir takm menuler eklenebilir JMenu editMenu = new JMenu(Edit); [Link](editMenu); Her menu icerisinde menu nesneleri vardr. JMenuItem pasteItem = new JMenuItem(Paste); JMenuItem cutItem = new JMenuItem(Cut); (JMenuItem iconedItem = new JMenuItem(Iconed, icon); [Link](pasteItem); [Link](cutItem); Menu nesneleri arasna ayrac da eklenebilir: JMenu optionMenu = new JMenu(Select); [Link](); [Link](optionsMenu) Bir menu ya da menu nesnesi secildiginde ActionEvent nesnesi yaratlr. Bu nedenle daha once de ogrendigimiz sekilde menu nesnelerini ActionListener nesnelerine kaydetmek mumkundur. MenuItemlar JCheckBoxMenuItem ya da JRadioButtonMenuItem nesnelerinden de olabilirler. Popup Menuleri Popup menu de tpk JMenu nesnesi gibi bir menudur. Ancak tek fark herhangi bir yerde sabit bir sekilde yerlesmezler. JPopupMenu popup = new JPopupMenu(); JMenuItem item = new JMenuItem(Cut); [Link](listener); [Link](item);
Bir popup menusunu her seferinde aka gostermek gerekir. Bunun iin [Link](panel, x, y) metodu kullanlr. panel nesnesi popup menusunu parent olan nesnesini temsil eder. X ve y de menunun gpsterilecegi lokasyon bilgisini belirtir.
153
1. bir mouse listener yuklenir. 2. public void mouseReleased(MouseEvent e) { if([Link]()) [Link]([Link](), [Link](), [Link]()); }
Menulerde Tus Kombinasyonlar Menuler kullanlrken fareye ihtiya duymadan baz klavye tu kombinasyonlar yardmyla menu nesnelerine ulalabilir. Javada bu ielm bir menu nesnesi yaratlrken ayarlanabilir: JMenuItem cutItem = new JMenuItem(Cut, T); Bunun yerine bir menu nesnesine sonradan tu kombinasyonu atamak da mmkndr: [Link](T); NOT: Bu tu kombinasyonlar sadece MenuItem constructor ierisinde tanmlanr. Eer menu balang metodu ierisinde de bir tanmlama yapmak istiyorsak o zaman setMnemonic metodu ile sonradan bunu belirtmek gerekir.
Hzlandrclar: Dorudan Alt Menulere Eriim Menulere tanmlanan bu tu kombinadyonlarnn yan sra hzlandrclar denilen ve dorudan alt menu elemanlarna eriimi salayan ayarlar da vardr. nk sadece bu mnemonic tanmlamalar ile belirlenen menu elemanlarna erimek iin ncelikle ara menunun almas gerekir. Ancak hzlandrclar ara menu amaya gereksinim duymakszn alt menu nesnelerine de eriimi salar. rnein bir ok programda tanml olan Ctrl+O ve Ctrl+S hzlandrclar, dorudan alt menu olan Save ve Open seeneklerine erimeyi salar. Bunun iin rnein: [Link]([Link](KeyEvent.VK_O, InputEvent.CTRL_MASK)); import import import import import import import import import import import import import import import import import import import import import [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link]; [Link];
public class JPanelOrnek1 extends JFrame implements ActionListener { JPanel colorPanel, sizePanel, editPanel, southPanel; JTextArea text;
154
JButton yellowButton, redButton, blueButton; JRadioButton editable, noneditable; ButtonGroup group; Container c; JMenu fontMenu; JMenu fontStyleMenu; JCheckBoxMenuItem boldItem, italicItem; JMenuBar menuBar, menuBar2; JComboBox comboMenu; int boldValue = 0, italicValue = 0; String face = "Serif"; int size = 24; public JPanelOrnek1() { c = [Link](); [Link](new BorderLayout()); southPanel = new JPanel(); [Link](new BorderLayout()); colorPanel = new JPanel(new FlowLayout()); yellowButton = new JButton("Sari"); [Link](this); [Link](yellowButton); redButton = new JButton("Kirmizi"); [Link](this); [Link](redButton); blueButton = new JButton("Mavi"); [Link](this); [Link](blueButton); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link](colorPanel, [Link]); editPanel = new JPanel(new FlowLayout()); group = new ButtonGroup(); editable = new JRadioButton("Duzenlenebilir", false); [Link](editable); [Link](this); [Link](editable); noneditable = new JRadioButton("Duzenlenemez", true); [Link](noneditable); [Link](this); [Link](noneditable); [Link](editPanel, [Link]); text = new JTextArea(); [Link]("Deneme Yazisi"); [Link](true); [Link](text, [Link]); [Link](southPanel, [Link]);
155
menuBar = new JMenuBar(); fontMenu = new JMenu("Font"); [Link]("Fontlarla ilgili ayarlari yapabilirsiniz"); [Link]('F'); fontStyleMenu = new JMenu("StyLe"); boldItem = new JCheckBoxMenuItem("bold"); [Link](this); [Link]([Link](KeyEvent.VK_B, InputEvent.CTRL_MASK)); [Link](boldItem); italicItem = new JCheckBoxMenuItem("italic"); [Link](this); [Link](italicItem); [Link](fontStyleMenu); [Link] = new JComboBox(new String[] {"12", "24", "48"}); [Link](new Dimension(50, 30)); [Link](this); [Link](fontMenu); [Link](comboMenu); [Link](menuBar);
public void actionPerformed(ActionEvent e) { if([Link]() == yellowButton) { [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); } else if([Link]() == redButton) { [Link]([Link]); [Link]([Link]); [Link]([Link]); [Link]([Link]); } else if([Link]() == blueButton) { [Link]([Link]);
156
[Link]([Link]); [Link]([Link]); [Link]([Link]); } if([Link]() == editable) [Link](true); else if([Link]() == noneditable) [Link](false); if([Link]() == [Link] || [Link]() == [Link] || [Link]() == [Link]) { [Link] = [Link]() ? [Link] : 0; [Link] = [Link]() ? [Link] : 0; [Link] = [Link]((String)[Link]()); [Link](new Font([Link], [Link] + [Link], [Link])); } [Link](); } public static void main(String[] args) { JPanelOrnek1 jp = new JPanelOrnek1(); [Link](); } }
NOT: Hzlandrclar sadece menu nesnelerine eklenebilir. Menulere hzlandrc atamas yaplmaz.
Menu Nesnelerinin Geerli ya da Geersiz Hale Getirilmesi JMenuItem openItem = new JMenuItem(Open, O); [Link](false); ya da [Link](true);
[Link] paketi ierisinde MenuListener isminde bir arayz tanmldr ve bu arayzn metodlar class MenuListener { void menuSelected(MenuEvent e) ; void menuCanceled(MenuEvent e); void menuDeselected(MenuEvent e) ; }
157
Ara ubuklar tahmin edebileceimiz gibi zerinde 1 ya da 1 den fazla dme barndran grnr menuler olarak tanmlanabilir. NOT: Eer ierisinde tanmland Container n layout modeli BorderLayout ise toolbarn drag zellii alacaktr. Ornek: JToolBar bar = new JToolBar(); [Link](blueButton); [Link](); Ornek: [Link](bar, [Link]); Ornek:: bar = new JToolBar(Title, [Link]); Aadaki rnek Sun Microsytems tarafndan yaynlanan Core Java 1 kitabndan aynen alnmtr. import import import import [Link].*; [Link].*; [Link].*; [Link].*;
public class ToolBarTest { public static void main(String[] args) { ToolBarFrame frame = new ToolBarFrame(); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } } /** A frame with a toolbar and menu for color changes. */ class ToolBarFrame extends JFrame { public ToolBarFrame() { setTitle("ToolBarTest"); setSize(WIDTH, HEIGHT); // add a panel for color change Container contentPane = getContentPane(); panel = new JPanel(); [Link](panel, [Link]); // set up actions Action new Action new Action new blueAction = new ColorAction("Blue", ImageIcon("[Link]"), [Link]); yellowAction = new ColorAction("Yellow", ImageIcon("[Link]"), [Link]); redAction = new ColorAction("Red", ImageIcon("[Link]"), [Link]);
158
{ public void actionPerformed(ActionEvent event) { [Link](0); } }; [Link](Action.SHORT_DESCRIPTION, "Exit"); // populate tool bar JToolBar bar = new JToolBar(); [Link](blueAction); [Link](yellowAction); [Link](redAction); [Link](); [Link](exitAction); [Link](bar, [Link]); // populate menu JMenu menu = new JMenu("Color"); [Link](yellowAction); [Link](blueAction); [Link](redAction); [Link](exitAction); JMenuBar menuBar = new JMenuBar(); [Link](menu); setJMenuBar(menuBar); } public static final int WIDTH = 300; public static final int HEIGHT = 200; private JPanel panel; /** The color action sets the background of the frame to a given color. */ class ColorAction extends AbstractAction { public ColorAction(String name, Icon icon, Color c) { putValue([Link], name); putValue(Action.SMALL_ICON, icon); putValue(Action.SHORT_DESCRIPTION, name + " background"); putValue("Color", c); } public void actionPerformed(ActionEvent evt) { Color c = (Color)getValue("Color"); [Link](c); [Link](); } } }
159
Aadaki rnekte hazr olarak kullanlabilecek tm dialog pencereleri olduka detayl bir ekilde ele alnmtr: import import import import import import [Link].*; [Link].*; [Link].*; [Link].*; [Link].*; [Link].*;
public class OptionDialogTest { public static void main(String[] args) { OptionDialogFrame frame = new OptionDialogFrame(); [Link](JFrame.EXIT_ON_CLOSE); [Link](); } } /** A panel with radio buttons inside a titled border. */ class ButtonPanel extends JPanel { /** Constructs a button panel. @param title the title shown in the border @param options an array of radio button labels */ public ButtonPanel(String title, String[] options) { setBorder([Link] ([Link](), title)); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); group = new ButtonGroup(); // make one radio button for each option for (int i = 0; i < [Link]; i++) { JRadioButton b = new JRadioButton(options[i]); [Link](options[i]); add(b); [Link](b); [Link](i == 0); } } /** Gets the currently selected option. @return the label of the currently selected radio button. */ public String getSelection() { return [Link]().getActionCommand(); } private ButtonGroup group; } /** A frame that contains settings for selecting various option
160
dialogs. */ class OptionDialogFrame extends JFrame { public OptionDialogFrame() { setTitle("OptionDialogTest"); setSize(WIDTH, HEIGHT); JPanel gridPanel = new JPanel(); [Link](new GridLayout(2, 3)); typePanel = new ButtonPanel("Type", new String[] { "Message", "Confirm", "Option", "Input" }); messageTypePanel = new ButtonPanel("Message Type", new String[] { "ERROR_MESSAGE", "INFORMATION_MESSAGE", "WARNING_MESSAGE", "QUESTION_MESSAGE", "PLAIN_MESSAGE" }); messagePanel = new ButtonPanel("Message", new String[] { "String", "Icon", "Component", "Other", "Object[]" }); optionTypePanel = new ButtonPanel("Confirm", new String[] { "DEFAULT_OPTION", "YES_NO_OPTION", "YES_NO_CANCEL_OPTION", "OK_CANCEL_OPTION" }); optionsPanel = new ButtonPanel("Option", new String[] { "String[]", "Icon[]", "Object[]" }); inputPanel = new ButtonPanel("Input", new String[] { "Text field", "Combo box"
161
}); [Link](typePanel); [Link](messageTypePanel); [Link](messagePanel); [Link](optionTypePanel); [Link](optionsPanel); [Link](inputPanel); // add a panel with a Show button JPanel showPanel = new JPanel(); JButton showButton = new JButton("Show"); [Link](new ShowAction()); [Link](showButton); Container contentPane = getContentPane(); [Link](gridPanel, [Link]); [Link](showPanel, [Link]); } /** Gets the currently selected message. @return a string, icon, component or object array, depending on the Message panel selection */ public Object getMessage() { String s = [Link](); if ([Link]("String")) return messageString; else if ([Link]("Icon")) return messageIcon; else if ([Link]("Component")) return messageComponent; else if ([Link]("Object[]")) return new Object[] { messageString, messageIcon, messageComponent, messageObject }; else if ([Link]("Other")) return messageObject; else return null; } /** Gets the currently selected options. @return an array of strings, icons or objects, depending on the Option panel selection */ public Object[] getOptions() { String s = [Link](); if ([Link]("String[]")) return new String[] { "Yellow", "Blue", "Red" }; else if ([Link]("Icon[]")) return new Icon[] { new ImageIcon("[Link]"), new ImageIcon("[Link]"),
162
new ImageIcon("[Link]") }; else if ([Link]("Object[]")) return new Object[] { messageString, messageIcon, messageComponent, messageObject }; else return null; } /** Gets the selected message or option type @param panel the Message Type or Confirm panel @return the selected XXX_MESSAGE or XXX_OPTION constant from the JOptionPane class */ public int getType(ButtonPanel panel) { String s = [Link](); try { return [Link](s).getInt(null); } catch(Exception e) { return -1; } } /** The action listener for the Show button shows a Confirm, Input, Message or Option dialog depending on the Type panel selection. */ private class ShowAction implements ActionListener { public void actionPerformed(ActionEvent evt) { if ([Link]().equals("Confirm")) [Link]( [Link], getMessage(), "Title", getType(optionTypePanel), getType(messageTypePanel)); else if ([Link]().equals("Input")) { if ([Link]().equals("Text field")) [Link]( [Link], getMessage(), "Title", getType(messageTypePanel)); else [Link]( [Link], getMessage(), "Title", getType(messageTypePanel),
163
null, new String[] { "Yellow", "Blue", "Red" }, "Blue"); } else if ([Link]().equals("Message")) [Link]( [Link], getMessage(), "Title", getType(messageTypePanel)); else if ([Link]().equals("Option")) [Link]( [Link], getMessage(), "Title", getType(optionTypePanel), getType(messageTypePanel), null, getOptions(), getOptions()[0]); } } public static final int WIDTH = 600; public static final int HEIGHT = 400; private private private private private private private private private private } /** A panel with a painted surface */ class SamplePanel extends JPanel { public void paintComponent(Graphics g) { [Link](g); Graphics2D g2 = (Graphics2D)g; Rectangle2D rect = new [Link](0, 0, getWidth() - 1, getHeight() - 1); [Link]([Link]); [Link](rect); [Link]([Link]); [Link](rect); } public Dimension getMinimumSize() { return new Dimension(10, 10); } } ButtonPanel ButtonPanel ButtonPanel ButtonPanel ButtonPanel ButtonPanel typePanel; messagePanel; messageTypePanel; optionTypePanel; optionsPanel; inputPanel;
String messageString = "Message"; Icon messageIcon = new ImageIcon("[Link]"); Object messageObject = new Date(); Component messageComponent = new SamplePanel();
164
Yeni Dialog Pencerelerinin Yaratlmas Yeni bir dialog penceresi yaratmak iin JDialog snfndan tretme yapmak gerekir. Aslnda yeni bir dialog penceresi yaratmak, yeni bir JFrame nesnesi yaratmaya benzer. Tpk JFrame yaratr gibi eitli nesneleri JDialog nesnesi zerinde yerletirerek istediimiz gibi bir dilog penceresi yaratlabilir. Aada olduka basit bir dialog yaratma ilemi gsterilmektedir: class AboutDialog extends JDialog { public AboutDialog(JFrame owner) { /*owner parametresi bu dialog nesnesinin parent olan nesnesini belirler*/ super(owner, "About DialogTest", true); Container contentPane = getContentPane(); // add HTML label to center [Link](new JLabel( "<HTML><H1><I>Core Java</I></H1><HR>" + "By Cay Horstmann and Gary Cornell</HTML>"), [Link]); // Ok button closes the dialog JButton ok = new JButton("Ok"); [Link](new ActionListener() { public void actionPerformed(ActionEvent evt) { setVisible(false); } }); // add Ok button to southern border JPanel panel = new JPanel(); [Link](ok); [Link](panel, [Link]); setSize(250, 150); } }
165
* TODO To change the template for this generated type comment go to * Window - Preferences - Java - Code Style - Code Templates */ public class AboutTestFrame extends JFrame { Container c; JButton button = new JButton("About"); AboutDialog d; public AboutTestFrame() { c = getContentPane(); [Link](new FlowLayout()); d = new AboutDialog(this); [Link](new ActionListener() { public void actionPerformed(ActionEvent e) { [Link](); } }); [Link](button); [Link](JFrame.EXIT_ON_CLOSE); [Link](300, 300); [Link](); [Link](false); } public static void main(String[] args) { new AboutTestFrame(); }
}
Ancak yukardaki rnekte eksik olan ey bu dialog pencersinin bir deer retmemesidir. Yani nemli olan ey dialog pencereleri yardmyla kullancya birtakm bilgiler vermenin yansra ayn zamanda kullancdan birtakm verileri almaktr. import import import import [Link].*; [Link].*; [Link].*; [Link].*;
public class CustomDialog extends JDialog implements ActionListener { private String entered; JTextField tf; public CustomDialog(JFrame owner) { super(owner, "Ozel Dialog Penceresi", true); Container c = getContentPane(); [Link](new FlowLayout());
166
tf = new JTextField("Enter val", 10); JButton b = new JButton("Tamam"); [Link](this); [Link](tf); [Link](b); setSize(300, 80); setResizable(false); } String getValue() { show(); return entered; } public void actionPerformed(ActionEvent e) { entered = [Link](); setVisible(false); } }
import [Link].*; import [Link].*; import [Link].*; public class DialogTesFrame extends JFrame implements ActionListener { Container c; DialogTesFrame() { c = getContentPane(); [Link](new FlowLayout()); JButton dugme = new JButton("Dialog Goster"); [Link](this); [Link](dugme); [Link](JFrame.EXIT_ON_CLOSE); setSize(600, 600); show(); } public void actionPerformed(ActionEvent e) { CustomDialog cd = new CustomDialog(this); [Link]([Link]()); } public static void main(String arg[]) { new DialogTesFrame();
167
} }
FileDialog Nesneleri Kullandmz programlarn birounda bilinen ekliyle open ve save menu seenekleriyle birlikte gelen ve sistemde herhangi birdosyay gzat yntemiyle bulup seebileceimiz dialog pencerelerine FileDialog pencereleri ad verilir. Javada bu ilemi JFileChooser nesnesiyle kolaylkla yapabiliyoruz. Bu nesnenin iki tane metodu ile dosya amak ya da dosya kaydetmek iin pencereyi grntlemek mmkndr: showOpenDialog showSaveDialog
JFileChooser fc = new JFileChooser(); [Link](new File(.)); [Link](true); //birden fazla dosya seimine izin verir. [Link](FileChooser.FILES_ONLY); [Link](FileChooser.DIRECTORIES_ONLY); [Link](FileChooser.FILES_AND_DIRECTORIES); int result = [Link](parent); int result = [Link](parent); //JFileChooser.APPROVE_OPTION ya da JFileChooser.CANCEL_OPTION geri dnecektir. String filename = [Link]().getPath();
Paketler Java da bir grup snf ya da paketi baz genel paketler alttnda topladmz daha nceden biliyoruz. Bunun nedeni hem ayn konuya ilikin almalar tek bir hiyerari altnda toplamak hem de birtakm isim akmalarn nlemektir. yle ki eer A isimli bir snfmz kendi paketimiz ierisinde yazarsak, bir baka A isimli snf ancak baka bir paket ierisinde yer alabilir ve bylece isim akmalar engellenmi olur. Bir snf kendi paketi ierisindeki tm snflara ve baka paketler ierisindeki public snflara eriebilir. Bu eriim iin ya ilgili paketin tam adn kullnarak snf adyla eriim ya da sadece paketi import ederk snf adyla eriim yapmak gerekir. rnein com,academytech isimli paket ierisinde A isimli bir snfa erimek iin: a) import [Link].A ya da [Link].*; ... A a = new A(); ... b) ... [Link].A a = new [Link].A(); eklinde eriim yaplr.
Java da bir paketin ierisindeki tm snflar import edildii zaman gereksiz bir kod bymesi olmaz. Bu konuda bir performans dkl olmaz. Paketlere Snflarn Eklenmesi
168
Java da bir snf belirli paketin ierisine dahil etmek istiyorsak, dahil edilmek istenen snf bildiriminin bana package anahtar szc ile ait olduu hiyerari yapsn yazarz. Mesela; A herhangi bir yerde bir snf olarak yaratlsn. A_1 snf [Link] paketine ait olsun. A_2 snf [Link]. messages paketinde olsun. Diyelim ki A snf kendi iinde A_1 ve A_2 snflarn kullansn. Bu durumda bu snflar disk zerinde aada dizin yapsna gre yerletirilir:
parent --------[Link] com |-------- academytech | |----------- utils | ----| A_1.java | | | |----------- messages -------------A_2.java A_1 ve A_2 snflarnn bildirimleri u ekilde yaplr: /**** A_1.java ***/ package [Link]; class A_1 { } /*** A_2.java ***/ package [Link]; class A_2 { } Bu paketler ierisindeki A_1.java ve A_2.java snflarnn derlenme ve yorumlanma aamalar da u ekildedir: # javac com/academytech/utils/A_1.java # java [Link].A_1 Bu durumda A snf ierisinde A_1 ve A_2 nesneleri kullanabilmek iin A snfnn iinde: /*** [Link] ***/ import [Link].*; import [Link].*; class A {
169
JVMnin Paketleri Bulmas Yukardaki rnekte grmekteyiz ki A snf ierisinde kullanlan harici paketler snf ile ayn dizin altnda yer alyor. Ancak bu durum ok esnek deildir. Yani her zaman kullanlan paketler, bu paketleri kullnadmz snflarla ayn dizinde yer alamyabilir. Bu durum zaten projenin esnekliini ve tanabilirliini de ortadan kaldraca iin pek tercih edilmez. Birden fazla farkl paketin allan dizinden bamsz olarak kullanlabilmesi iin: 1) paketlerin yer alaca bir dizin yaratlr. rnein: /home/academytech/javapaketleri 2) Daha nce sizin ya da bakalarnn yazd bu paketler parent dizinleri ile birlikte (com gibi) bu ana dizin altna kopyalanr. Bizim rneimiz iin com/academytech dizini /home/academytech/javapaketleri dizini altna kopyalanr. 3) class path ayar yaplr. CLASSPATH, JVMye aranacak paketlerin nerelerde aranacan belirten bir ayardr. (linuxde export ile windowsda environment variables ayar ile yaplabilir. Bkz. ders 1) Herhangi bir yerdeki snf derlerken derleme ve yorumlama aamasnda da classpath bilgisi verilebilir: # javac classpath (ya da -cp) /home/academytech/javapaketleri:. [Link] # java classpath /home/academytech/javapaketleri:. A Bu rnekte [Link] [Link] paketi altndaki A_1 ve A_2 snflarn kullanyor. Normalde compiler ilk olarak jre/lib ve jre/lib/ext dizinleri altndaki sistem ktphanelerinde gerekli snflar arar. Burada bulamad snflar da classpath ierisinde arar.
Paket Faliyet Alan Bir snf, metod ya da deiken public ise baka herhangi bir snf tarafndan kullanlabilir. Bir snf, metod ya da deiken private ise sadece kendi dosyas ierisindeki baka snflar tarafndan kullanlabilir. Bir snf, metod ya da deiken bildiriminde public ya da private anahtar szc yer almyorsa o zaman o snf, metod ya da deikene sadece kendi paketindeki dier snflar eriebilir. Dkmantasyon Yaratma (javadoc) Javada kod ierisine yazlacak birtakm etiketler sayesinde profosyonel bir dkmantasyon hazrlamak mmkndr. Aslnda javann kendi dkmantasyonu da az sonra bahsedilecek olan yntemlerle hazrlanmtr. javadoc denilen komut kod ierisindeki bu zel etiketleri alglayarak istenilen dizinler altnda dkmantasyonu .html sayfalar olarak retir.
170
Genel olarak dkmantasyon paketler, public snflar ve arayzler, public ve protected metodlar ile public ve protected veri elemanlar iin hazrlanr. Her dkmantasyon komutu /** ve */ sembolleri arasnda ve dkmante edilecek paket, snf, metod ya da deikenin hemen stnde yer alr. @author yazar adi @return <aklama>: metodun geri dn deerine ilikin bir aklama @param <deger> <aciklama>: parametrenin aklanmas @see <bir nesne> : See Also ksmnn hazrlanmas Bu etiketlerin yan sra bilinen tm html etiketleri de kullanlabilir. Bunlardan bazlar: <code> : Kod stili eklinde yazma <img > : imaj ekleme <strong> : strong vurgu yapmak gibi.. Eclipsede File/Export menu seenei yardmyla otomatik olarak oluturulabilir. Ancak bu outurma aamasnda Eclipse sizden javadoc komutunun lokasyonunu girmenizi isteyecektir.
JAR Dosyalarnn Oluturulmas Jar dosyalarn oluturmaktaki temel ama uygulamann tek bir arivde toplanmas hatta tek bir dosya eklinde altrlmasn salamaktr. Aslnda genel olarak bakldnda jar dosyas oluturmak birka kk admdan ibarettir. Bir jar arivi yaratmak iin: #jar cvf <arsiv_adi>.jar <arsivlenecek_dosya1> [ve/veya] <arivlenecek_dosya2> [ve/veya] *.java rnein bulundugum dizin altndaki [Link], [Link] ve [Link] dosyalar ile [Link] dosyasn ieren bir .jar arivi oluturmak iin: #jar cvf [Link] [Link] [Link] [Link] [Link] yazmak yeterlidir. Bir arivin ierisine ayrca manifest ad verilen zel bir dosya daha yerletirilir. Bu dosya aslnda ariv hakknda birtakm konfigurasyon bilgileri verir. Aslnda genel java sistem ktphaneleri bu ekilde arivler ierisinde tutularak kullanlmaktadr. SDKnn runtime ktphanesi olan [Link] byle bir arivdir. Sonu olarak .jar arivleri bir programn ihtiya duyaca tm dosyalar barndran sktrlm bir dosyadr. Ayrca arivin tm teknik bilgilerini barndran [Link] dosyas da arivin ierisinde yer alr. Manifest Dosyasnn erii /*** [Link] ***/ Manifest-Version: 1.0 <arsivi tanimlayan satirlar> Name: [Link] <Snf tanmlayan satrlar> Name: com/academytech/
171
<bu paketi tanmlayan satrlar> Bu ekilde bir manifest dosyasn, com/academytech paketini ve Genel snfn ieren bir ariv yaratmak iin: #jar cfm [Link] [Link] com/academytech/*.class [Link] Kendi bana alabilen bir ariv yaratmak iin manifest dosyas ierisinde bir de bu program altracak main metodunu ieren snfn bilgisi de eklenmelidir: Main-Class: com/academytech/Main Bundan sonra ariv u ekilde altrlabilir: java jar [Link]
package [Link]; import [Link].*; import [Link].*; import [Link].*; public class B extends JFrame implements ActionListener { Container c; public B() { c = getContentPane(); [Link](new FlowLayout()); JButton b = new JButton("submit"); [Link](this); [Link](b); setSize(300, 400); } public void actionPerformed(ActionEvent e) { [Link](null, "Merhaba"); } public static void main(String arg[]) { B b = new B(); [Link](); } }
2) [Link] snfn com/academytech dizini altna yerletiriniz. Daha sonra bu com dizinini yerletirdiniz lokasyonu classpath olarak ayarlaynz.
172
3) Aadaki gibi [Link] dosyasn oluturunuz: /*** [Link] ***/ Manifest-Version: 1.0 Main-Class: A /***************/ NOT: Main-Class: A yazdktan sonra bir satr boluk brakldna dikkat ediniz. 4) komut: java cvfm [Link] [Link] [Link] com\academytech\[Link] 5) sonuc: java jar [Link]
173
Java Derleri Blm 20 Java Collections Bu ksmda programclk asndan olduka nemli olan veri yaplar kavramlarnn Javada nasl ele alndn inceleyeceiz. Aslnda veri yaplar kavramlar genel olarak olduka fazal ve detayl bilgileri ierir. Biz ise burada sadece en temel olanlar ele alacaz. Bu ksm tamalandktan sonra elinizdeki herhangi bir veri yapsn Java Programalama dilinde kolaylkla evirebileceinizi umuyoruz. Collection ve Iterator Arayz Kavram Javada veri ysplar mekanizmalarn ele alan ve herbirini daha sonra ele alacamz bu tayclarn hepsi Collection denilen bir arayzden tremitir. Bir Collection arayznn temel olan iki metodu boolean add(Object obj) Iterator iterator()
itarator isimli metod kullanlan tayc zerinde Iterator snfn implement eden bir snf geri gnderir. Bu Iterator arayznn temel metodlar:
bu Iterator nesnesi yardmyla tayc erindeki elemanlar tek tek ziyaret edilebilir. Ancak taycnn sonuna gelindiinde NoSuchElementException retilir. Bu nedenle tayc zerinde gezerken hasNext metoduyla kontrol yaplarak gezme ilemi srdrlr: //c bir collection olarak yaratlm olsun Iterator iter = [Link](); while([Link]()) { Object obj = [Link]();
... }
remove metodu ile iteraturun next ile elde edilen son eleman listeden silinir. Yani bu kullanm bir eleman elde edilmeden silinmesine engel olmaktadr. nce next ile eleman kontrol edilmeli ve sonra remove edilmelidir. Bir eleman next ile geilmeden nce remove ile silinemez.
174
Normalde kullanclar kendileri de isterlerse Collection ve Iterator snflarn implement edebilirler. Hatta bunu arayzlerin tm metdlarn implement etmek yrucu gelebilecei iin AbstrackCollection snf da implement edilebilir. Bu arayzlerin ierdikleri metdolarn listesine dkmantasyon zerinden eriilebilir.
LinkedList LinkedList nesnesi bilinen bal liste implementasyonunu gerekler. LinkedList ogrenciler = new LinkedList();
LinkedList nesnesi iin kullanlan iterator ListIterator olarak isimlendirilir. Bu iteratorde Iterator arayznden olmayan add metodu yer alr. Bylece iterator bal liste zerinde istenilen pozisyona getirilerek yeni bir eleman araya eklenebilir.
ListIterator
iter = [Link]();
Ayrca ListIterator nesnesinde yer alan previous ve hasPrevious metodlar ile de geri ynl bir tarama yaplabilir.
ListIterator nesnesinin set isimli metodu next ile elde edilen son eleman yeni bir elemanla deitirmeye yarar.
DEV: Aadaki rnekte henz operasyonlar tanmlanmam olan Next, Previous, Add New Object ve Remove Object metodlarn hazrlaynz ve program tamamlaynz. import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link];
175
public class LinkedListHandler extends JFrame implements ActionListener { JButton add_1, list, next, remove, previous, add_2; JTextArea screen; JPanel tourPanel, mainPanel; Container c; LinkedList objectlist; public LinkedListHandler() { prepareComponents(); prepareFrame(600, 300, false, true); } private void prepareFrame(int x_size, int y_size, boolean resizable, boolean show) { [Link](x_size, y_size); [Link](resizable); [Link](JFrame.EXIT_ON_CLOSE); if(show) [Link]();
176
list = new JButton("List All"); [Link](this); next = new JButton("Next Object"); [Link](this); previous = new JButton("Previous Object"); [Link](this); remove = new JButton("Remove Current Object"); [Link](this); add_2 = new JButton("Add New Object"); add_2.addActionListener(this); tourPanel = new JPanel(); [Link](next); [Link](previous); [Link](remove); [Link](add_2); [Link](tourPanel, [Link]); mainPanel = new JPanel(); [Link](list); [Link](add_1); [Link](mainPanel, [Link]); screen = new JTextArea(); [Link](false); [Link]([Link]); [Link]([Link]); [Link](new Font("Serif", [Link], 24)); [Link](screen, [Link]); } private void prepareButton(JButton button, String button_name, ActionListener listener) { button = new JButton(button_name); [Link](listener); }
177
public void actionPerformed(ActionEvent e) { if([Link]() == add_1) { if([Link] == null) [Link]= new LinkedList(); if([Link]([Link](this, "New Record"))); [Link]("Yeni kayit eklendi..."); [Link](); } else if([Link]() == [Link]) { StringBuffer buf = new StringBuffer(""); if([Link] != null) { ListIterator iter = (ListIterator)[Link](); while([Link]()) [Link]("\n"+(String)[Link]()); } else [Link]("nothing is recorded yet!!!"); [Link]([Link]()); [Link](); } } public static void main(String[] args) { new LinkedListHandler(); } }
178
Vector Nesnesi Bu nesne aslnda diziler gibi bir veri yapsn meydana getirir .Ancak dizilerde olmayan dinamik olarak byme zellii de Vector nesneleri ile birlikte gelir.
Herhangi bir zaman dilimi ierisinde bir Vector nesnesi kendi kapasitesinden daha az ya da eit sayda nesne barndrr. Eer kapasitesi dolduysa ve bymesi gerekiyorsa o zaman istenilen miktarda dinamik olarak geniletilebilir.
Eer kullanc herhangi bir kapasite art miktar belirtmezse o zaman vektor kendi boyutunun iki kat genilie bytlr. Vector nesnesi de dier yaplar gibi Object nesnelerini tar.
NOT: Vector nesnelerinin ArrayList nesnelerinden fark senkron edilmelidir. Eer birden fazla thread Vector zerinde kullnlyorsa Vector nesnesi srekli senkron olur. Ancak ArrayList byle bir ilem yapmaz. Eer birden fazla thread kullanlmyorsa senkron iin zaman harcamadndan dolay ArrayList tercih edilebilir.
Enumaration Nesnesi ile Vector ierisinde dolamak Aadaki rnekte kullanlan Enumaration nesnesi Vector snfnn elements isimli metodu tarafndan gnderilen bir nesnedir. Bu nesne vector ierisinde dolaabilmeyi salayan iki tane metoda sahiptir: nextElement() hasMoreElements() import import import import [Link].*; [Link].*; [Link].*; [Link].*;
public class VectorTest extends JFrame { public VectorTest() { super( "Vector Example" ); final JLabel status = new JLabel(); Container c = getContentPane(); final Vector v = new Vector( 1 ); [Link]( new FlowLayout() ); [Link]( new JLabel( "Enter a string" ) ); final JTextField input = new JTextField( 10 ); [Link]( input ); JButton addBtn = new JButton( "Add" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) {
179
[Link]( [Link]() ); [Link]( "Added to end: " + [Link]() ); [Link]( "" ); } } ); [Link]( addBtn ); // add the input value
JButton removeBtn = new JButton( "Remove" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { if ( [Link]( [Link]() ) ) [Link]( "Removed: " + [Link]() ); else [Link]( [Link]() + " not in vector" ); } } ); [Link]( removeBtn ); JButton firstBtn = new JButton( "First" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { try { [Link]( "First element: " + [Link]() ); } catch ( NoSuchElementException exception ) { [Link]( [Link]() ); } } } ); [Link]( firstBtn ); JButton lastBtn = new JButton( "Last" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { try { [Link]( "Last element: " +
[Link]() ); } catch ( NoSuchElementException exception ) { [Link]( [Link]() ); } } } ); [Link]( lastBtn );
180
JButton emptyBtn = new JButton( "Is Empty?" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( [Link]() ? "Vector is empty" : "Vector is not empty" ); } } ); [Link]( emptyBtn ); JButton containsBtn = new JButton( "Contains" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { String searchKey = [Link](); if ( [Link]( searchKey ) ) [Link]( "Vector contains " + searchKey ); else [Link]( "Vector does not contain " + searchKey ); } } ); [Link]( containsBtn ); JButton locationBtn = new JButton( "Location" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( "Element is at location " + [Link]( [Link]() ) ); } } ); [Link]( locationBtn ); JButton trimBtn = new JButton( "Trim" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link](); [Link]( "Vector trimmed to size" ); } } ); [Link]( trimBtn ); JButton statsBtn = new JButton( "Statistics" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( "Size = " + [Link]() + "; capacity = " + [Link]() ); } }
181
); [Link]( statsBtn ); JButton displayBtn = new JButton( "Display" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { Enumeration enum = [Link](); StringBuffer buf = new StringBuffer(); while ( [Link]() ) [Link]( [Link]() ).append( " [Link]( null, [Link](), "Display", JOptionPane.PLAIN_MESSAGE ); } } ); [Link]( displayBtn ); [Link]( status ); setSize( 300, 200 ); show(); } public static void main( String args[] ) { VectorTest app = new VectorTest(); [Link]( new WindowAdapter() { public void windowClosing( WindowEvent e ) { [Link]( 0 ); } } ); }
}
" );
Stack Nesnesi Bu nesne Vector nesnesinde tretilerek elde edilmi ve Stack ad verilen veri yaplarn ele almak iin tasarlanmtr. Vector snf gibi, Stack snf ierisinde Object trnden nesneler saklanmaktadr. Eer primitive type verileri bu yaplar iinde saklamak isterseniz bunlar daha nce incelediimiz Integer, Double gibi sarg snflar yardmyla nesne haline getirerek kullanabilirsiniz.
182
Bir stack nesnesi ierisine yeni bir eklemek push denilen bir operasyon ile gerekleir. Stack ierisine bir veri push ile eklendikten sonra pop ile elde dilebilir. Bu durumda Stack veri yaps zerinde LIFO (Last In First Out) mant geerlidir. Aadaki rnek Deitel&Deitel tarafndan yazlan Java HowTo Program, Third Edition kitabndan deitirilmeden alnmtr. import import import import [Link].*; [Link].*; [Link].*; [Link].*;
public class StackTest extends JFrame { public StackTest() { super( "Stacks" ); Container c = getContentPane(); final JLabel status = new JLabel(); final Stack s = new Stack(); [Link]( new FlowLayout() ); [Link]( new JLabel( "Enter a string" ) ); final JTextField input = new JTextField( 10 ); [Link]( input ); JButton pushBtn = new JButton( "Push" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( "Pushed: " + [Link]( [Link]() ) ); } } ); [Link]( pushBtn ); JButton popBtn = new JButton( "Pop" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e { try { [Link]( "Popped: " + [Link]() } catch ( EmptyStackException exception ) [Link]( [Link]() } } } ); [Link]( popBtn ); JButton peekBtn = new JButton( "Peek" ); [Link]( new ActionListener() {
) ); { );
183
public void actionPerformed( ActionEvent e ) { try { [Link]( "Top: " + [Link]() ); } catch ( EmptyStackException exception ) { [Link]( [Link]() ); } } } ); [Link]( peekBtn ); JButton emptyBtn = new JButton( "Is Empty?" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( [Link]() ? "Stack is empty" : "Stack is not empty" ); } } ); [Link]( emptyBtn ); JButton searchBtn = new JButton( "Search" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { String searchKey = [Link](); int result = [Link]( searchKey ); if ( result == -1 ) [Link]( searchKey + " not found" ); else [Link]( searchKey + " found at element " + result ); } } ); [Link]( searchBtn ); JButton displayBtn = new JButton( "Display" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { Enumeration enum = [Link](); StringBuffer buf = new StringBuffer(); while ( [Link]() ) [Link]( [Link]() ).append( " " ); [Link]( null, [Link](), "Display", JOptionPane.PLAIN_MESSAGE ); } } ); [Link]( displayBtn ); [Link]( status );
184
setSize( 675, 100 ); show(); } public static void main( String args[] ) { StackTest app = new StackTest(); [Link]( new WindowAdapter() { public void windowClosing( WindowEvent e ) { [Link]( 0 ); } } ); } }
rnekte kullanlan peek isimli metod stack nesnesi zerinde herhangi pop eleman grntlemeye yarar.
Bu rnek ierisinde de stack ierisinde dolamak iin yine Enumaration isimli nesne elde dilmitir. Stack nesnesinin aslnda Vector nesnesinden bir tretme olduu buradan da anlalabilir.
HashTable Nesnesi Hashing ilemi ve bu ilemi gerekletirmek iin kullanlan algoritma olduka detayl bir konudur. Burada nemli olan HashTable nesnesinin verileri nasl ele alddr.
HashTable verilerin fazla sayda olduu ve srasndan ziyade abuk ulalabilir olmasn tercih edildii durumlarda kullanlan bir yapdr. mekanizmas hashing ilemine dayanan bu yap verilere ok hzl bir ekilde eriebilmeyi salar. Ancak bu eriimde verilerin yerleimi Vector ve LinkedList yaplarnda olduu gibi belirli bir srada deildir. Onun yerine her veri iin zel bir hesapla atanan hash number anahtar yardmyla her eleman LinkedList olan bir diziye bu veriler yerletirilir. Bu hash number aslnda verinin lokasyonu konusunda bilgi ierdiinden verilere eriim olduka hzl bir ekilde gerekleir.
put metodu belirli bir key ile birlikte yeni bir nesne eklemeye yarar. Ancak bu metodu geri dn deeri Objecttir. Eer eklenecek olan anahtar tabloda zaten varsa, bu abahtarn gsterdii nesne kullancya geri dner. Eer eklenecek olan anahtar tabloda yoksa o zaman null deeri gei dnecektir. get metodu kendisine verilen anahtarla elemi olan Object nesnesini geri gnderir. Eer byle bir nahtarla ilikilendirilmi bir nesne tabloda yoksa, o zaman null deer geri dnecktir.
elements ve keys metodlar, tablodaki anahtar ve nesnelerin iteratrlerini yani Enumaration nesnelerini geri gnderir.
185
Aadaki rnek Deitel&Deitel tarafndan yazlan Java HowTo Program, Third Edition kitabndan deitirilmeden alnmtr.
public class HashTableTest extends JFrame { public HashTableTest() { super( "Hashtable Example" ); final JLabel status = new JLabel(); final Hashtable table = new Hashtable(); final JTextArea display = new JTextArea( 4, 20 ); [Link]( false ); JPanel northPanel = new JPanel(); [Link]( new BorderLayout() ); JPanel northSubPanel = new JPanel(); [Link]( new JLabel( "First name" ) ); final JTextField fName = new JTextField( 8 ); [Link]( fName ); [Link]( new JLabel( "Last name (key)" ) ); final JTextField lName = new JTextField( 8 ); [Link]( lName ); [Link]( northSubPanel, [Link] ); [Link]( status, [Link] ); JPanel southPanel = new JPanel(); [Link]( new GridLayout( 2, 5 ) ); JButton put = new JButton( "Put" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { Employee emp = new Employee( [Link](), [Link]() ); Object val = [Link]( [Link](), emp ); if ( val == null ) [Link]( "Put: " + [Link]() ); else [Link]( "Put: " + [Link]() + "; Replaced: " + [Link]() ); } } ); [Link]( put ); JButton get = new JButton( "Get" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { Object val = [Link]( [Link]() ); if ( val != null )
186
[Link]( "Get: " + [Link]() ); else [Link]( "Get: " + [Link]() + " not in table" ); } } ); [Link]( get ); JButton remove = new JButton( "Remove" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { Object val = [Link]( [Link]() ); if ( val != null ) [Link]( "Remove: " + [Link]() ); else [Link]( "Remove: " + [Link]() + " not in table" ); } } ); [Link]( remove ); JButton empty = new JButton( "Empty" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( "Empty: " + [Link]() ); } } ); [Link]( empty ); JButton containsKey = new JButton( "Contains key" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link]( "Contains key: " + [Link]( [Link]() ) ); } } ); [Link]( containsKey ); JButton clear = new JButton( "Clear table" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { [Link](); [Link]( "Clear: Table is now empty" ); } } ); [Link]( clear ); JButton listElems = new JButton( "List objects" );
187
[Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { StringBuffer buf = new StringBuffer(); for ( Enumeration enum = [Link](); [Link](); ) [Link]( [Link]() ).append( '\n' ); [Link]( [Link]() ); } } ); [Link]( listElems ); JButton listKeys = new JButton( "List keys" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { StringBuffer buf = new StringBuffer(); for ( Enumeration enum = [Link](); [Link](); ) [Link]( [Link]() ).append( '\n' ); [Link]( null, [Link](), "Display", JOptionPane.PLAIN_MESSAGE ); } } ); [Link]( listKeys ); Container c = getContentPane(); [Link]( northPanel, [Link] ); [Link]( new JScrollPane( display ), [Link] ); [Link]( southPanel, [Link] ); setSize( 540, 300 ); show(); } public static void main( String args[] ) { HashTableTest app = new HashTableTest(); [Link]( new WindowAdapter() { public void windowClosing( WindowEvent e ) { [Link]( 0 ); } } ); } } class Employee { private String first, last;
188
public Employee( String fName, String lName ) { first = fName; last = lName; } public String toString() { return first + " " + last; } }
JDBC Teknolojisi 1996 yaznda Sun JDBC aracnn ilk versiyonunu duyurdu. Byle bir aracn gelitirilmesindeki asl maksat tek bir arayz zerinde birbirinden bamsz veri tabanlarna eriimi salamakt.
Bu eriim salandktan sonra standart SQL dili ile veri taban zerinde sorgu yaplabilecekti.
Daha zel olarak bahsetmek gerekirse JDBC iki katmandan meydana gelir. En yukarda JDBC arayz vardr. Bu API JDBC src yneticisi ile haberleerek ona birtak SQL sorgular gnderir.
Src yneticisi de kendisi de API den gelen bu sorgular ele alr ve 3. parti veri taban sistemleri ile iletiim kurarak sorgular bu veri tabanlar zerinde altrr ve sonular tekrar APIye gnderir.
[Link]([Link].DB2Driver): Bu bildirim yukardaki emada belirtilen JDBC Driver API katmannn ihtiya duyaca 3. parti srcy kayt etmek iin (yklemek iin) kullanlr. O halde aslnda bu bildirim iin gerekli olan bu src (burada
189
Byle bir src sisteme indirildikten sonra CLASSPATH tarafndan grlen bir lokasyona ya da javann default olarak grebildii herhangi bir lokasyona yerletirilir. Bylece artk yukardaki bildirimi kullanmak iin bir engel kalmaz. ndirdiiniz src .zip ya ya da .jar uzantl olabilir. CLASSPATH ierisine koyulacak olan path bilgisinde bu .zip ya da .jar uzantl dosya da yer almaldr. rnein srcmz [Link] olsun:
eklindedir. Bu URL 3. parti veri taban sistemi tarafndan salanr. Bu url kullanlarak
SQL Komutlarnn altrlmas SQL komutlarnn altrlmas iin ncelikle Statement trnden bir nesne yaratlr. Bunun iin ceden yaratlm olan Connection nesnesi zerinden createStatement() metodu arlr. Statement st = [Link](); Bu Statement nesnesi zerinde
int executeUpdate(String query): [Link](UPDATE Books SET Price = Price 500 WHERE Title NOT LIKE %HTML 3%);
gibi bir tablo gncelleme komutu altrlabilir. Bu metodun geri dn deeri bu gncellemeden etkilenen satr saysdr.
executeUpdate komutu ile INSERT, UPDATE, DELETE, CREATE TABLE ve DROP TABLE operasyonlar altrlabilir.
ResultSet executeQuery(String query): Ancak bir sorgu altrldnda gelecek olan sonularla ilgileniriz. Statement nesnesinin executeQuery metodu bize bu sonular ieren bir ResultSet nesnesi gnderir.
190
Bylece ResultSet ierisine gelen her satr [Link]() ile elde edilirken bu satr ierisindeki her stun kendi adyla birlikte [Link](<stun adi>) nesnesi ierisinde kullanlr ve deerler elde edilir.
JDBC-ODBC Kprs ile Access Veri Tabanna Balant 1. Sistemde Access veri taban ykl olmaldr. Ayrca bu veri taban sistemi zerinde oluturulmu bir veri taban hazr olmaldr. (Bu rnekte [Link] kullanlacak)
2. Elde edilen bu veri taban ODBC zerinde kaydedilmelidir. Bu ilem iin Microsoft Control Panel zerinde Administrative Task -> Data Sources (ODBC) seilir. Daha sonra aadaki 3 adm gerekletirilir.
191
Daha sonra nceden hazrlanm olan Access Veri taban sistemden seilir:
Son olarak bu veri tabanna eriim iin gerekli olan ifre ve parola bilgisi girilir:
192
Artk JDBC-ODBC kprs hazrlanmtr. Geriye sadece uygun bir program yazmak ve program ierisinde bu veri tabanna eriimi salamaktr. Aadaki rnek kod paras bu eriimin nasl yaplacan gstermektedir:
String url = "jdbc:odbc:Books"; String username = "ermanaykac"; String password = "197919"; try {
[Link]("[Link]"); //Bu url JDBC-ODBC kprs iin gerekli connection = [Link](url, username, password ); } catch ( ClassNotFoundException cnfex ) { [Link]( "Failed to load JDBC/ODBC driver." ); [Link](); [Link]( 1 ); // terminate program } catch ( SQLException sqlex ) { [Link]( "Unable to connect" ); [Link](); [Link]( 1 ); // terminate program } Aadaki rnekte btnyle bu balant ve balant zerinde kullanlan sorgular incelenmektedir. import [Link].*;
193
public class DisplayQueryResults extends JFrame { // [Link] types needed for database processing private Connection connection; private Statement statement; private ResultSet resultSet; private ResultSetMetaData rsMetaData; // [Link] types needed for GUI private JTable table; private JTextArea inputQuery; private JButton submitQuery; public DisplayQueryResults() { super( "Enter Query. Click Submit to See Results." ); // The URL specifying the Books database to which // this program connects using JDBC to connect to a // Microsoft ODBC database. String url = "jdbc:odbc:Books"; String username = "ermanaykac"; String password = "197919"; // Load the driver to allow connection to the database try { [Link]( "[Link]" ); connection = [Link](url, username, password ); } catch ( ClassNotFoundException cnfex ) { [Link]( "Failed to load JDBC/ODBC driver." ); [Link](); [Link]( 1 ); // terminate program } catch ( SQLException sqlex ) { [Link]( "Unable to connect" ); [Link](); [Link]( 1 ); // terminate program } // If connected to database, set up GUI inputQuery =new JTextArea( "SELECT * FROM Authors", 4, 30 ); submitQuery = new JButton( "Submit query" ); [Link]( new ActionListener() { public void actionPerformed( ActionEvent e ) { getTable(); } } ); JPanel topPanel = new JPanel(); [Link]( new BorderLayout() ); [Link]( new JScrollPane( inputQuery), [Link] ); [Link]( submitQuery, [Link] );
194
table = new JTable( 4, 4 ); Container c = getContentPane(); [Link]( new BorderLayout() ); [Link]( topPanel, [Link] ); [Link]( table, [Link] ); getTable(); setSize( 500, 500 ); show(); } private void getTable() { try { String query = [Link](); statement = [Link](); resultSet = [Link]( query ); displayResultSet( resultSet ); } catch ( SQLException sqlex ) { [Link](); } } private void displayResultSet( ResultSet rs ) throws SQLException { // position to first record boolean moreRecords = [Link](); // If there are no records, display a message if ( ! moreRecords ) { [Link]( this, "ResultSet contained no records" ); setTitle( "No records to display" ); return; } Vector columnHeads = new Vector(); Vector rows = new Vector(); try { // get column heads ResultSetMetaData rsmd = [Link](); for ( int i = 1; i <= [Link](); ++i ) [Link]( [Link]( i ) ); // get row data do { [Link]( getNextRow( rs, rsmd ) ); } while ( [Link]() ); // display table with ResultSet contents table = new JTable( rows, columnHeads ); JScrollPane scroller = new JScrollPane( table ); Container c = getContentPane(); [Link]( 1 ); [Link]( scroller, [Link] ); [Link](); }
195
catch ( SQLException sqlex ) { [Link](); } } private Vector getNextRow( ResultSet rs, ResultSetMetaData rsmd ) throws SQLException { Vector currentRow = new Vector(); for ( int i = 1; i <= [Link](); ++i ) switch( [Link]( i ) ) { case [Link]: case [Link]: [Link]( [Link]( i ) ); break; case [Link]: [Link]( new Long( [Link]( i ) ) ); break; default: [Link]( "Type was: " + [Link]( i ) ); } return currentRow; } public void shutDown() { try { [Link](); } catch ( SQLException sqlex ) { [Link]( "Unable to disconnect" ); [Link](); } } public static void main( String args[] ) { final DisplayQueryResults app = new DisplayQueryResults(); [Link]( new WindowAdapter() { public void windowClosing( WindowEvent e ) { [Link](); [Link]( 0 ); } } ); } }
196