You are on page 1of 196

JAVA

Eitim Notlar

JAVA ile Programlama

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 http://java.sun.com/ adresini
incelemenizi tavsiye ederim. En ksa yoldan bu Java paketlerini incelemek istiyorsanz
http://java.sun.com/j2se/1.4.1/docs/api/ 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 http://java.sun.com/j2se/downloads.html 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-linux-i586.bin ya da j2sdk-1_4_1_04-linux-i586.rpm 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-linux-i586.bin
$ ./ j2sdk-1_4_1_04-linux-i586.bin
.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-linux-i586.rpm
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

Herhangi bir editorde aadaki kodu yazarak Mesaj.java adyla kaydediniz:

import javax.swing.*;
import java.awt.*;
public class Mesaj {
//1. satr
public Mesaj() {
//2. satr
JOptionPane.showMessageDialog(null, "java ile hayat guzel :)");
}
public static void main(String[] args) {

//3. satr

Mesaj A = new Mesaj();


System.exit(0);
}
}

imdi de komut satrnda nce bu dosyay kaydettiiniz klasre gidiniz (bu rnekte bu klasr c:\temp olarak
yaratlmtr) ve aadaki gibi nce javac Mesaj.java yazp enter tuuna basn. Bunu yaptnzda bilgisayar ksa
bir sre yazdnz kodu jvmnin anlayaca ekilde derleyecektir. Daha sonra da yine komut satrnda java
Mesaj.java yazp enter tuuna basn. Bu sefer de jvm derlenmi dosyay altracaktr:
C:\temp> javac Mesaj.java
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 javax.swing.* ve import java.awt.* 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: Mesaj.java - 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 uygulama.bat adyla kaydedersiniz dosya zerine tkladnzda uygulamanz direk olarak
alacaktr:
/*--- uygulama.bat ---*/
javac Mesaj.java
java Mesaj
/*--------------------*/

Ayn ilemi linux altnda yapmak iin uygulama.sh adnda bir dosya ierisine yukardaki satrlarn aynsn yazarak
dosyay kaydediniz ve konsol zerinde bu dosyaya aadaki gibi altrma izni vererek dosyay altrnz:
$ chmod 700 uygulama.sh
$ ./uygulama.sh

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() {
System.out.println("\nRapor");
System.out.println("********");
System.out.println("Kitap Adi: " + kitap_adi);
System.out.println("Yazari: " + yazar_adi);
System.out.println("Sayfa Sayisi: " + sayfa_sayisi);
System.out.println("\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";
kitap1.kitabiGoruntule();
kitap2.kitabiGoruntule();
}
}

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 kitap1.kitabiGoruntule() ve kitap2.kitabiGoruntule()
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

System.out.println("a degiskeninin sakladigi deger: " + a + " degeridir");


}
}

Bu kodu yazdktan sonra daha nceki derslerimizde gsterdiimiz gibi altrnz:

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:

Saysal Veri Tipi


int
short
long

Hafzada kapladg alan (byte)


4
2
8

byte

Snrlar
-2.147.483.648, +2.147.483.647
-32.768, +32.767
-9.223.372.036.854.775.808L ,
+8.223.372.036.854.775.807L
-128, 127

float
double

4
8

-+ 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;
System.out.println() 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:
Degiskenler.java
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
System.out.println("a nin degeri: " + a);
System.out.println("a nin degeri: " + a + " b nin degeri: " + b);
d = a + b + c;
System.out.println("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 System.out.println 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:
simGir.java

import javax.swing.*;

//s1

public class IsimGir {


public static void main(String arg[]) {
String isim, yas; //s2
isim = JOptionPane.showInputDialog(null, "Lutfen isminizi giriniz: "); //s3
yas = JOptionPane.showInputDialog(null, "Simdi de yasiniz giriniz: "); //s4
String rapor = "Adiniz: "+isim+"\nYasiniz: "+yas; //s5
JOptionPane.showMessageDialog(null, rapor);
//s6
//JOptionPane.showMessageDialog(null, "Adiniz:\t"+isim+"\nYasiniz:\t"+yas);s7
System.exit(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 JOptionPane.showInputDialog() 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 JOptionPane.showMessageDialog() 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:

Sabitler.java
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
System.out.println(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.

AnaSinif.java
import javax.swing.*;
public class AnaSinif{
public static void main(String arg[]){
boolean deger1 = true;
boolean deger2 = false;
boolean sonuc1 = deger1 && deger2;
JOptionPane.showMessageDialog(null, "deger1: " +deger1+"deger2: "+deger2+
"deger1 && deger2 ->"+ sonuc1);
boolean sonuc2 = deger1 || deger2;
JOptionPane.showMessageDialog(null, "deger1: " +deger1+"\ndeger2: "+deger2+
"\ndeger1 || deger2 -> "+ sonuc2);
deger2 = true;
sonuc1 = deger1 && deger2;
JOptionPane.showMessageDialog(null, "deger1: " +deger1+"\ndeger2: "+deger2+
"\ndeger1 && deger2 -> "+ sonuc1);
deger1 = false;
deger2 = false;
sonuc1 = deger1 || deger2;
JOptionPane.showMessageDialog(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

4 < 10 //true
3 >= 3 //true

() 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
yaplabilir.Bir 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;
System.out.println("k nin deeri: "+ k);
int c;
c = (int)k; //burada double trnden bir deer int trnden bir degiskene
atanyor.
System.out.println("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;
System.out.println("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
JOptionPane.showInputDialog() 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
Integer.parseInt() metodu yardmyla int trne dntrelim:
import javax.swing.*;
public class AnaSinif{
public static void main(String arg[]){
String yas = JOptionPane.showInputDialog(null, "Yasinizi
giriniz: ");
int sonuc = Integer.parseInt(yas) * 3;
JOptionPane.showMessageDialog(null, "Hesap sonucu: "+sonuc);
}
}

Buna benzer dier metodlar:


Integer.toString(12); --> parantez ierisinde verilen int trn String'e evirir.
Double.parseDouble(12); --> parantez ierisinde verilen int trn double trne evirir.
Double.toString(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:
string.length Deikeni
Bu deiken bir stringin ka karakterden olutuunu yani uzunluunu verir.
string.equals(diger string) Metodu
ki String trne ilikin deerlerin eitliini saysal deerlerde kulandmz == operatr ile kontrol edemeyiz.
Bunun yerine String.equals metodunu kullanrz. Bu metod, kendisine parametre olarak verilen diger string deeri
eer string degerine eitse true, degilse false degerini retir.
string.compareTo(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 javax.swing.*;
public class AnaSinif{
public static void main(String arg[]){
String isim = JOptionPane.showInputDialog(null, "Lutfen adnizi
giriniz");
int uzunluk = isim.length;
String mesaj = "Isminiz "+uzunluk+" tane karakterden
olumaktadir";
JOptionPane.showMessageDialog(null, mesaj);
String gercekSifre = "kkVVuuNN";
String girilenSifre = JOptionPane.showInputDialog(null, "Sifreyi
giriniz: ");
boolean sonuc = gercekSifre.equals(girilenSifre);
JOptionPane.showMessageDialog(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 isim.length 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 http://java.sun.com/j2se/1.4.1/docs/api/ 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 http://java.sun.com/j2se/1.4.1/download.html 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 SwingSet2.jar adndaki uygulamay nce jfc dizini ierisine girerek u ekilde altrabilirsiniz:
java -jar SwingSet2.jar
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.
/**** Main.java ****/
import javax.swing.*;
class Main {
public static void main(String[] args) {
int k = 10;
{
int c = 20;
JOptionPane.showMessageDialog(null, "k nin degeri: "+k+
"\nc nin degeri: "+c);
}
System.exit(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.
/**** Main2.java ****/
import javax.swing.*;
class Main2 {
public static void main(String[] args) {
int k = 10;
{
int c = 20;
}
JOptionPane.showMessageDialog(null, "k nin degeri: "+k+
"\nc nin degeri: "+c);
/*c degiskeni bu faliyet alannda tanml degildir*/
System.exit(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.

/***** Deyimler1.java ********/


import javax.swing.*;
class Deyimler1 {
public static void main(String[] args) {
String notStr;
int not;
notStr = JOptionPane.showInputDialog(null, "Notunuzu giriniz: ");
not = Integer.parseInt(notStr);
if(not > 50) {
JOptionPane.showMessageDialog(null, "Tebrikler. Bu dersten gectiniz :)");

23

}
System.exit(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:
/***** Deyimler2.java ********/
import javax.swing.*;
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 = JOptionPane.showInputDialog(null, "Notunuzu giriniz: ");
not = Integer.parseInt(notStr);
if(not > 50) {
JOptionPane.showMessageDialog(null, gectiMesaji);
}
else {
JOptionPane.showMessageDialog(null, kaldiMesaji);
}
System.exit(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

/****** Deyimler3.java ******/


import javax.swing.*;
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 = JOptionPane.showInputDialog(null, "Notunuzu giriniz: ");
not = Integer.parseInt(notStr);
if(not > 100 || not < 0) {
JOptionPane.showMessageDialog(null, yanlisNot );
}
else if(not <= 100 && not > 86) {
JOptionPane.showMessageDialog(null, "Dereceniz: A");
}
else if(not <= 85 && not > 71) {
JOptionPane.showMessageDialog(null, "Dereceniz: B");
}
else if(not <= 70 && not > 66 ) {
JOptionPane.showMessageDialog(null, "Dereceniz: C");
}
else if(not <= 65 && not > 50) {
JOptionPane.showMessageDialog(null, "Dereceniz: D");
}
else {
JOptionPane.showMessageDialog(null, kaldiMesaji);
}
System.exit(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

Bu durumda kullancmzn yeni isteine gre rnei tekrar dzenleyelim:


/**** Deyimler4.java ****/
import javax.swing.*;
class Deyimler4 {
public static void main(String[] args) {
String yanlisNot = "Yanlis not girisi! Tekrar deneyiniz.";
String giris = "Bir not giriniz (0 - 100)\nikis iin notu -1 giriniz";
String notStr;
int not;
notStr = JOptionPane.showInputDialog(null, giris);
not = Integer.parseInt(notStr);
while(not != -1) {

26

if (not > 100) {


JOptionPane.showMessageDialog(null, yanlisNot);
}
else if (not <= 100 && not > 86) {
JOptionPane.showMessageDialog(null, "Not: " +
not + " Derece: A");
}
else if (not <= 85 && not > 71) {
JOptionPane.showMessageDialog(null, "Not: " +
not + " Derece: B");
}
else if (not <= 70 && not > 66) {
JOptionPane.showMessageDialog(null, "Not: " +
not + " Derece: C");
}
else if (not <= 65 && not > 50) {
JOptionPane.showMessageDialog(null, "Not: " +
not + " Derece: D");
}
else {
JOptionPane.showMessageDialog(null, "Not: " +
not + " Derece: F");
}
notStr = JOptionPane.showInputDialog(null, giris );
not = Integer.parseInt(notStr);
}
JOptionPane.showMessageDialog(null, "Program Sonlandi.");
System.exit(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.
/**** Sifre.java ****/
import javax.swing.*;
public class Sifre {
public static void main(String arg[]) {
String kontrol_isim = "elvantasbas";
String k_adi = JOptionPane.showInputDialog(null, "Lutfen kullanici adini
giriniz:");
boolean x_flag = false;
while(!k_adi.equals(kontrol_isim)) {
if(k_adi.equals("x")) {
JOptionPane.showMessageDialog(null, "Islem sonland?r?l?yor..");
x_flag = true;
break;
}
k_adi = JOptionPane.showInputDialog(null, "Girdiginiz isim yanlis. Tekrar

27

giriniz:");
}
if(x_flag) {
JOptionPane.showMessageDialog(null, "Hoscakalin");
}
else {
JOptionPane.showMessageDialog(null, "Merhaba "+k_adi);
}
System.exit(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
System.exit(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:
/**** ForDongusu.java ****/
public class ForDongusu {
public static void main(String arg[]){
for(int i = 0; i < 10; i++) {
System.out.println("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

/**** Menu.java ****/


import javax.swing.*;
public class Menu {
public static void main(String arg[]){
boolean secim_flag = true;
while(secim_flag) {
String secim = JOptionPane.showInputDialog(null, "Bir sayi giriniz: (1, 2, 3,
4)");
int sayi = Integer.parseInt(secim);
secim_flag = false;
switch(sayi) {
case 1:
JOptionPane.showMessageDialog(null,
break;
case 2:
JOptionPane.showMessageDialog(null,
break;
case 3:
JOptionPane.showMessageDialog(null,
break;
case 4:
JOptionPane.showMessageDialog(null,
break;
default:
secim_flag = true;
JOptionPane.showMessageDialog(null,
girdiniz");
break;
}
}

"Sectiginiz sayi: bir");


"Sectiginiz sayi: iki");
"Sectiginiz sayi: uc");
"Sectiginiz sayi: dort");

"Beklenenden farkli bir sayi

System.exit(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:
/**** Toplama.java ****/
public class Toplama {
public static void main(String arg[]){
int toplam = 0;
for(int i = 0; i < 10; i++) {
if(i % 3 == 0) {
continue;
}

30

toplam += i;
}
JOptionPane.showMessageDialog(null, "Toplam: " + toplam);
System.exit(0);
}
}

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:
/**** Kayit.java ****/
1 import javax.swing.*;
2
3 public class Kayit {
4
public static void main(String arg[]){
5
6
String kayit_str = JOptionPane.showInputDialog(null, "Kac tane kayit
gireceksiniz:");
7
String cikisMesaji = "Hernagi bir anda cikmak icin "
8
int kayit = Integer.parseInt(kayit_str);
9
10
String isimler[] = new String[kayit];
11
for(int i = 0; i < isimler.length; i++) {
12
int sayi = i+1;
13
String giris = JOptionPane.showInputDialog(null, sayi + ". kaydi
giriniz:");
14
if(giris.equals(X))
15
break;
16
else
17
isimler[i] = giris;
18
}
19
20
String mesaj = "isim Listesi\n********";
21
22
for(int i = 0; i < isimler.length; i++) {
23
if(isimler[i] != null)
24
mesaj += "\n"+i+" --> "+isimler[i];
25
}
26
27
JOptionPane.showMessageDialog(null, mesaj);
28
System.exit(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;

2)

int a[] = {12, 3, 6, 7}

3)

new int[] {1,4,5,6}

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 java.awt.*;
import javax.swing.*;
public class Ara {
public static void main(String arg[]) {
String []isimler = {"Hakan Aykac", "Murat Akar", "Cenk Gndz",
"Cem Daggeen"};
String aranacak = JOptionPane.showInputDialog(null,
"Aradiginiz ismi giriniz: ");
int index = -1;
for(int i = 0; i < isimler.length; i++) {
if(isimler[i].equals(aranacak)) {
index = i;
break;
}
}
if(index == -1)
JOptionPane.showMessageDialog(null, aranacak+" ismi dizide mevcut degildir.");
else
JOptionPane.showMessageDialog(null, aranacak+" isminin index numarasi:
"+index);
System.exit(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 (Metod.java), ekrana sadece Merhaba yazan bir metod gsterilmektedir:

Mesaj.java 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 Mesaj.java 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 Double.parseDouble() 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: Math.power 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
Alan.java 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( Double.parseDouble(yrcp) );
ifadesi yerine sadece
alanHesapla( Double.parseDouble(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 javax.swing.*;
import java.util.Arrays;
import java.lang.System;
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");
System.exit(0);
}
public static String[] alfabetikSirala(String [] dizi) {
String sirali_dizi[] = new String[dizi.length];
System.arraycopy(dizi, 0, sirali_dizi, 0, dizi.length);
Arrays.sort(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 < dizi.length; i++)
mesaj += "dizinin "+i+". elemani: "+dizi[i]+"\n";
JOptionPane.showMessageDialog(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 javax.swing.*;
import java.util.Arrays;
import java.lang.System;
class HistogramSinifi {
public static void main(String[] args) {
int uzunluk = Integer.parseInt(JOptionPane.showInputDialog(null, "Dizi uzunlugu
ne olsun?"));
String []liste = diziYarat(uzunluk);
Histogram(liste);
System.exit(0);

40

}
public static String[] diziYarat(int boyut) {
String isimler[] = new String[boyut];
for(int i=0; i < isimler.length; i++)
isimler[i] = JOptionPane.showInputDialog(null, i+". ismi giriniz");
Arrays.sort(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 < dizi.length; i++) {
cikis += dizi[i] + "\t";
for(int k = 0; k < dizi[i].length(); k++)
cikis += "*";
cikis += "\n";
}
cikisEkrani.setText(cikis);
JOptionPane.showMessageDialog(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 JOptionPane.showMessageDialog 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 System.arraycopy
metodu kullanlr. Bu metodun kullanm:
System.arraycopy(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:

class DegiskenTutan {
int x;
public void setX(int c) {
this.x = c;

43

}
public int getX() {
return this.x;
}
}

DegiskenTutan.java dosyasndaki rnekte, bahsettiimiz bu snf yine snf ile ayn isimde olan
"DegiskenTutan.java" 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 "DegiskenTutan.java" 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 javax.swing.*;
public class GenelSinif {
public static void main(String arg[]) {
DegiskenTutan a = new DegiskenTutan();
DegiskenTutan b = new DegiskenTutan();
a.setX(10);
b.setX(20);
String message = "a daki x degeri: "+a.getX();
message += "\nb deki x degeri: "+b.getX();
JOptionPane.showMessageDialog(null, message);
System.exit(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 "DegiskenTutan.java" dosyasn ve "GenelSinif.java" dosyasn derleyelim:


javac DegiskenTutan.java
javac GenelSinif.java

45

3 Son olarak da GenelSinif.java dosyasn altralm:


java GenelSinif
Not: Burada gryoruz ki "DegiskenTutan.java" dosyas sadece derleniyor ancak GenelSinif.java 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:
/*** DegiskenTutan2.java ***/
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;
}
}

/*** GenelSinif2.java ***/


import javax.swing.*;
public class GenelSinif2 {
public static void main(String arg[]) {
DegiskenTutan2 a = new DegiskenTutan2();
DegiskenTutan2 b = new DegiskenTutan2(2);
String message = "a daki x degeri: "+a.getX();
message += "\nb deki x degeri: "+b.getX();
JOptionPane.showMessageDialog(null, message);
System.exit(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:
"java.lang.NoSuchMethodError: 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 "MainParametreleri.java" isimli
snf yazp kaydediniz:
class MainParametreleri {
public static void main(String arg[]) {
System.out.println("1. parametre:"+arg[0]);
System.out.println("2. parametre: "+arg[1]);
System.exit(0);
}
}
imdi aada gsterildii gibi bu snf nce javac komutu ile derleyip daha sonra java komutunun bu zel kullanm
ile altrnz:
javac MainParametreleri.java
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) {
this.resetX();
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);
a.resetX();
/*
YANLI! resetX private bir metoddur
Bu ekilde dardan kullanlamaz.*/
...
}
}
En son rnekte grdnz gibi "a.resetX()" 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 javax.swing.*;
class StatikTest {
String mesaj;
public StatikTest() {
mesaj = "";
}
public StatikTest(String m) {
this.mesaj = m;
}
public static void ozelMesaj(String m) {
JOptionPane.showMessageDialog(null, m);

50

}
public void kayitliMesaj() {
JOptionPane.showMessageDialog(null, this.mesaj);
}
}
class GenelSinif3 {
public static void main(String arg[]) {
StatikTest.ozelMesaj("Bu mesaji dogrudan gosterdim");
StatikTest a = new StatikTest("Bu mesaj icin nesne yarattim");
a.kayitliMesaj();
}
}
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

Java ile Programlama


Blm 6:

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() {
this.setName("No person");
this.setAge(0);
}
public Person(String name, int age) {
this.setName(name);
this.setAge(age);
}
public String toString() {
return "Person Name: " + this.getName() + "\nPerson Age: " +
this.getAge();
}
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();
temp.setAge(p1.getAge());
temp.setName(p1.getName());
p1.setAge(p2.getAge());
p1.setName(p2.getName());
p2.setAge(temp.getAge());
p2.setName(temp.getName());
}

52

public int compareTo(Person p) {


return this.getName().compareTo(p.getName());
}

/**
* @return Returns the age.
*/
public int getAge() {
return age;
}
/**
* @param age The age to set.
*/
public void setAge(int age) {
while(age < 0)
age = Integer.parseInt(
JOptionPane.showInputDialog(null, "Yas bilgisi 0 ya da
daha kucuk olamaz!\nTekrar giriniz"));
this.age = age;
}
/**
* @return Returns the name.
*/
public String getName() {
return name;
}
/**
* @param name The name to set.
*/
public void setName(String name) {
this.name = name;
}
public static void main(String[] args) {
Person array[] = {new Person("ali", 12), new Person("ahmet", 24), new
Person("zeren", 13)};
Person.sortPersonArray(array);
for(int i = 0; i < array.length; i++)
System.out.println(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 this.gercel 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:
http://java.sun.com/j2se/1.4.2/docs/api/index.html 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 this.gercel 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 Math.pow 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 Math.sqrt metodu ile elde ettik. Yani zetle;

56

Math.pow deerleri ile elde edilen gercel ve imajinel ksmlarn karelerinin toplamn, Math.sqrt 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 Math.abs(int a)
double Math.acos(double a)
double Math.cos(double a)
double Math.exp(double a)
int Math.max(int a, int b)

double Math.random()

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.

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
java.text.DecimalFormat 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 Double.parseDouble metodu ile tekrar
double trne dntrlebilir. Bu metodun rnek kullanm:
...
double yeniBicim = Double.parseDouble(ikiHane.format(a));
..
eklinde olacaktr. Bu dnmleri yapan dier baz sarg snflar ve metodlar da unlardr:
int Integer.parseInt(String str)
String Integer.toString(int a)
double Double.parseDouble(String str)
String Double.toString(double a)
float Float.parseFloat(String str)
String Float.toString(float a)
String String.valueOf(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:
dinamikDizi.add(merhaba);
ya da
int a = 3;
dinamikDizi.add(a);

58

ArrayList snfnn yukarda grdmz gibi add isimli metodunun yansra dier metodlarndan bazlar da
unlardr:

void remove(int index)

int size()
Object get(int index)
int indexOf(Object o)

Dizinin verilen indeks numarasndaki elemann kartr ve


diziyi buna gre dzenler. rnek kullanm:
int a = dinamikDizi.remove(2); //2.eleman siliniyor
Dizinin ierisindeki elelman saysn verir. rnek kullanm:
int a = dinamikDizi.size();
Dizinin index nolu elemann geri dndrr. rnek kullanm:
String str = dinamikDizi.get(0);
o ile temsil edilen nesnenin dizi ierisindeki indeks nuaarasn
geri dndrr. Eer eleman dizide yoksa -1 geri dndrr.

Aadaki KayitListesi.java 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

KayitListesi.java 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, KayitListesi.java uygulamamzda 19.satrda 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 = str.toString();
eklinde elde edilebilir.
Bu snfn sahip olduu baz metodlar unlardr:
StringBuffer append(String)

int capacity()
void ensureCapacity(int minCapacity)
char charAt(int index)
StringBuffer reverse()

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.

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;
System.out.println(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 java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
DecimalFormat formatter = new DecimalFormat("0.0000 YTL");
double x = 100.0/3.0;
System.out.println(x);
System.out.println(formatter.format(x));
}
}

Ayrca sistemde tanml olan yerel say, para birimi (currency) gibi deerleri kullanmak iin de NumberFormat
snfndan yararlanabiliyoruz.
import java.text.NumberFormat;
import java.util.*;
public class Main {
public static void main(String[] args) {
NumberFormat formatter = NumberFormat.getCurrencyInstance();
formatter.setMaximumFractionDigits(4);
formatter.setMaximumIntegerDigits(6);
formatter.setMinimumIntegerDigits(6);

double y = 1000.0/3.0;
String s = formatter.format(y);
System.out.print(s);
}
}

GregorianCalendar Snf
Javada tarihlerle ilgili ilemler yapmak iin kullanlabilecek 2 tane snf vardr.
Tarihte herhangi bir noktayi ifade etmek iin Date snf kullanlabilir.
import java.util.Date;
public class Main {
public static void main(String[] args) {

62

Date d1 = new Date();


d1.setYear(1999-1900);
d1.setDate(12);
d1.setMonth(0);
Date d2 = new Date();
d2.setTime(System.currentTimeMillis()); //1,1,1970 den bugune kadar gecen
milisaniye
if(d1.before(d2))
System.out.println(d1 + " tarihi,

" + d2 + " tarihinden daha once

geliyor");
System.out.print(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, Calendar.DECEMBER, 31, 23, 59, 59)
GregorianCalnedar kullanarak zaman elde etme ve istediimiz gibi deitirmeye
ilikin temel metodlar unlardr:
GregorianCalendar simdi = new GregorianCalendar();
int month = simdi.get(Calendar.MONTH);
simdi.setTime(Calendar.MONTH, 3);
simdi.add(Calendar.MONTH, 3);

import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main {
public static void main(String[] args) {
GregorianCalendar simdi = new GregorianCalendar();
int
int
int
int
int
int
int

ay = simdi.get(Calendar.MONTH);
gun = simdi.get(Calendar.DAY_OF_WEEK);
yil = simdi.get(Calendar.YEAR);
tarih = simdi.get(Calendar.DATE);
saat = simdi.get(Calendar.HOUR);
dakika = simdi.get(Calendar.MINUTE);
saniye = simdi.get(Calendar.SECOND);

System.out.println("Tarih: " + tarih + " " +

hangiAy(ay)

+ " " + hangiGun(gun)

+ " " + yil);


System.out.println("Saat: " + saat + ":" +
}

public static String hangiAy(int n) {

63

dakika

+ ":" + saniye);

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";

return "Jupiter :)";


}
public static String hangiGun(int n) {

switch (n) {
case 1:
return
case 2:
return
case 3:
return
case 4:
return
case 5:
return
case 6:
return
case 7:
return
}

"Pazar";
"Pazartesi";
"Sali";
"Carsamba";
"Persembe";
"Cuma";
"Cumartesi";

return "Pazoncesi :)";


}
}

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

Java ile Programlama


Blm 9 - 10

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:
a)
b)
c)
d)
e)
f)
g)

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.

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. Kisi.java, Ogrenci.java ve
KisiDeneme.java 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) {
this.isimSetEt(gelenIsim);
this.adresSetEt(gelenAdres);
this.cinsiyetSetEt(gelenCinsiyet);
}
public void isimSetEt(String yeniIsim) {
this.isim = yeniIsim.toUpperCase();
}

67

public void adresSetEt(String yeniAdres) {


this.adres = yeniAdres.toUpperCase();
}
public void cinsiyetSetEt(char gCinsiyet) {
if(gCinsiyet != 'e' && gCinsiyet != 'k') {
System.out.println("Cinsiyet bilgisi \"e\" ya da \"k\"
olmali.");
System.out.println("Yanlis bir deger girdiniz...");
System.out.println("Program sonlaniyor");
System.exit(0);
}
else
this.cinsiyet = gCinsiyet;
}
public String ismiGetir() {
return this.isim;
}
public String adresiGetir() {
return this.adres;
}
public char cinsiyetiGetir() {
return this.cinsiyet;
}
public String toString() {
String str="";
str
str
str
str

+=
+=
+=
+=

"Kisi Bilgileri\n";
"Isim: "+this.ismiGetir()+"\n";
"Cinsiyet :"+this.cinsiyetiGetir()+"\n";
"Adres: "+this.adresiGetir()+"\n";

return 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);
this.bolumSetEt(blm);
this.donemiSetEt(dnm);
}
public String bolumuGetir() {
return this.bolum;
}

68

public void bolumSetEt(String yBolum) {


this.bolum = yBolum.toUpperCase();
}
public int donemiGetir() {
return this.donem;
}
public void donemiSetEt(int yDonem) {
this.donem = yDonem;
}
public String toString() {
String str = super.toString();
str += "Bolum: "+this.bolumuGetir()+"\n";
str += "Donem: "+this.donemiGetir()+"\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);
System.out.println(o1);
o1.donemiSetEt(3);
System.out.println(o1);
}
}
KisiDeneme.java 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 Ogrenci.java dosyasnn 7. satrndaki
super(ad, cns, adr);
kullanm ile Ogrenci snfnn tredii Kisi snfnn uygun parametreli balang metodunun arldn
syleyebiliriz. Bylece KisiDeneme.java 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 Ogrenci.java 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) {
this.isimSetEt(gelenIsim);
this.cinsiyetSetEt(gelenCinsiyet);
}
public void isimSetEt(String yeniIsim) {
this.isim = yeniIsim.toUpperCase();
}
public void cinsiyetSetEt(char gCinsiyet) {
if(gCinsiyet != 'e' && gCinsiyet != 'k') {
System.out.println("Cinsiyet bilgisi \"e\" ya da \"k\" olmali.");
System.out.println("Yanlis bir deger girdiniz...");
System.out.println("Program sonlaniyor");
System.exit(0);
}
else
this.cinsiyet = gCinsiyet;
}
public String ismiGetir() {
return this.isim;
}
public char cinsiyetiGetir() {
return this.cinsiyet;
}
public String toString() {
String str="";
str += "Kisi Bilgileri\n";
str += "Isim: "+this.ismiGetir()+"\n";
str += "Cinsiyet :"+this.cinsiyetiGetir()+"\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);
this.bolumSetEt(blm);
this.donemiSetEt(dnm);
this.numaraSetEt(ogrNo);
this.ortalamaSetEt(ort);
}
public String bolumuGetir() {
return this.bolum;
}
public void bolumSetEt(String yBolum) {
this.bolum = yBolum.toUpperCase();
}
public int donemiGetir() {
return this.donem;
}
public void donemiSetEt(int yDonem) {
this.donem = yDonem;
}
public int numarayiGetir() {
return this.ogrenci_no;
}
public void numaraSetEt(int ogrNo) {
this.ogrenci_no = ogrNo;
}
public String ortalamayiGetir() {
return this.ortalama;
}
public void ortalamaSetEt(double yeniOrt) {
if(yeniOrt < 1.0)
this.ortalama = "F";
else if(yeniOrt >= 1.0 && yeniOrt < 1.5)
this.ortalama = "D";
else if(yeniOrt >= 1.5 && yeniOrt<2.0)
this.ortalama = "C";
else if(yeniOrt >= 2.0 && yeniOrt<3.6)
this.ortalama = "B";
else if(yeniOrt >= 3.6 && yeniOrt <= 4.0)
this.ortalama = "A";
}
public String toString() {
String str = super.toString();
str += "Bolum: "+this.bolumuGetir()+"\n";
str += "Donem: "+this.donemiGetir()+"\n";
str += "Ogrenci No: "+this.numarayiGetir()+"\n";
str += "Ortalamasi: "+this.ortalamayiGetir()+"\n";
return str;
}
}

71

class Kayitlar {
Ogrenci2 dizi[];
public Kayitlar() {
}
public Kayitlar(Ogrenci2 yeniEleman) {
this.dizi = new Ogrenci2[1];
this.dizi[0] = yeniEleman;
}
public void ekle(Ogrenci2 eklenecekOgr) {
if(this.dizi == null) {
dizi = new Ogrenci2[1];
this.dizi[0] = eklenecekOgr;
}
else {
Ogrenci2 tmp[] = new Ogrenci2[dizi.length+1];
for(int i=0; i < dizi.length; i++)
tmp[i] = dizi[i];
tmp[tmp.length-1] = eklenecekOgr;
this.dizi = tmp;
}
}
public void cikart(int id) {
Ogrenci2 tmp[] = new Ogrenci2[dizi.length-1];
int indeks=-1;
for(int i=0; i < dizi.length; i++)
if(dizi[i].numarayiGetir() == id)
indeks = i;
for(int i=0; i < indeks; i++)
tmp[i] = dizi[i];
for(int i = indeks; i < dizi.length-1; i++)
tmp[i] = dizi[i+1];
dizi = tmp;
}
public void listele() {
System.out.println("Kayitlar listeleniyor:");
System.out.println("--------------------");
for(int i=0; i < dizi.length; i++)

72

System.out.println(""+dizi[i]);
}
public Ogrenci2 enBuyukOrtalamaliOgrenci() {
Ogrenci2 max=dizi[0];
for(int i=0; i < dizi.length; i++) {
if(dizi[i].ortalamayiGetir().compareTo(max.ortalamayiGetir()) == -1)
max = dizi[i];
}
return max;
}
}
class KayitlarDeneme {
public static void main(String arg[]) {
Kayitlar x = new Kayitlar();
x.ekle(new
x.ekle(new
x.ekle(new
x.ekle(new
x.ekle(new
x.ekle(new

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));

x.listele();
Ogrenci2 sonuc = x.enBuyukOrtalamaliOgrenci();
System.out.println("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 Kisi2.java, Ogrenci2.java ve Kayitlar.java dosyalarndan olumakta ve en son olarak
KayitlarDeneme.java dosyasnda altrlmaktadr.
imdi de gelelim bu uygulamann detayl bir incelemesine: KayitlarDeneme.java 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)
x.ekle(o2);
...
Ancak bizim kullandmz yntem hem daha pratik hem de gereksiz deikenlerden arnm bir program yazmamz
salamaktadr.
Kayitlar.java snfnn ierisindeki
public Kayitlar(Ogrenci2 yeniEleman)

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 KayitlarDeneme.java 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.

Polymorphism ve Final Metodlar genel aklama

Ornek:
class TemelSinif {
public void method() {
System.out.println("Temel sinifin metodu");
}
public final void method2() {
System.out.println("Temel sinifin final metodu");
}
}

74

class TuremisSinif1 extends TemelSinif {


/*Temel sinifin metodunu override etmis*/
public void method() {
System.out.println("TuremisSsinif_1 sinifin metodu");
}
/*Temel sinifin metodunu override etmis*/
public void method2() {
System.out.println("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();
t1.method();
t2.method();
tt = t1;
tt.method();
tt = (TemelSinif)t1;
tt.method();

}
}
Instanceof Ornek
public static void main(String[] args) {
Object ar[] = {new Student("A", 12, 1232, 2), new Sayi(13)};
for(int i = 0; i < ar.length; 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.

class ObjectDeneme {
public static void main(String arg[]) {

Object ar[] = {new Deneme(), "String ekledik", new Integer(12), new BaskaBirSinif()};
BaskaBirSinif temp = (BaskaBirSinif)ar[3];
System.out.println(temp.methodX());
/*Olmaz!*/
//ar[3].methodX();

}
}
class Deneme {
public static void methodY() {
System.out.println("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 Arrays.sort 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) {
this.name = name;
}
public String toString() {
return this.name;
}
public void setName(String new_name) {
this.name = new_name;
}
public static void main(String[] args) {
Person p1 = new Person("Hakan Gozutok");
Person p2 = p1;
System.out.println("Birinci nesne icersindeki isim: " + p1);
System.out.println("Birinci nesne icersindeki isim: " + p2);
p2.setName("Caglar Aytek");
//p1 iersindeki isim degistirilmedigi halde Caglar Aytek
//olacaktir
System.out.println("Birinci nesne icersindeki isim: " + p1);
System.out.println("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) {
this.name = name;
}
public String toString() {
return this.name;
}
public void setName(String new_name) {
this.name = new_name;
}
public static void main(String[] args) {
Person p1 = new Person("Hakan Gozutok");
Person p2 = p1;
System.out.println("Birinci nesne icersindeki isim: " + p1);
System.out.println("kinci nesne icersindeki isim: " + p2);
p2.setName("Caglar Aytek");
//p1 iersindeki isim degistirilmedigi halde Caglar Aytek
//olacaktir
System.out.println("Birinci nesne icersindeki isim: " + p1);
System.out.println("kinci nesne icersindeki isim: " + p2);
Person p3 = new Person("");
try {
p3 = (Person)p1.clone();
} catch (Exception e) {};
p3.setName("Ahmet Aykac");
System.out.println("Birinci nesne icersindeki isim: " + p1);
System.out.println("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 super.clone();
}
}
...
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)super.clone();
/*nesnenin kendi kopyasn tutan geici
deikenin b alannn da klonu alnyor. Artk geici kopya da
adres kopyalam ilemi dzeltildi.*/
cloned_a.b = (B) b.clone();
/*Geici nesne geri gnderiliyor*/
return cloned_a;
}
}
}

dev: (2 haftalik)
ok kapsaml bir Student nesnesi yaratnz. Bir Student nesnesinin veri elemanlar:
abcde-

String 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

try {
openFile();
readFile();
closeFile();
}
catch(Exception e) {
doSomething();
}

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 javax.swing.*;
public class HataYakalama {
public static void main(String[] args) {
String str = JOptionPane.showInputDialog(null, "Bir say
giriniz");
try {
int n = Integer.parseInt(str);
System.out.println("Girilen sayi: " + n);
}
catch(NumberFormatException e) {
e.printStackTrace();
System.exit(0);
}
}
}

87

Eer kullanc bir say yerine yanlsklkla bir metin girerse, o zaman bu metinin Integer.parseInt 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:
java.lang.NumberFormatException: For input string: "gdg"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at HataYakalama.main(HataYakalama.java:9)

import javax.swing.*;
public class HataYakalama {
public static void main(String[] args) {
int n;
String str = JOptionPane.showInputDialog(null, "Bir say giriniz");
try {
n = Integer.parseInt(str);
}
catch(NumberFormatException e) {
JOptionPane.showMessageDialog(null, "Exception yakaland");
n = Integer.parseInt(JOptionPane.showInputDialog(null, "Giris
yanlis tekrar deneyiniz:"));
}
System.out.println("Girilen sayi: " + n);
}
}

KISACA REKURSIF METODLAR


Uygulama:
Kullancdan doru giri alana kadar alan bir say isteme mekanizmas yaznz.
Cevap:
import javax.swing.*;
public class HataYakalama {
public static int sayiAl(String onEk) {
JOptionPane.showMessageDialog(null, "DEBUG: metoddayiz");
int n = -1;
String str = JOptionPane.showInputDialog(null, onEk + " Bir say
giriniz");
try {
JOptionPane.showMessageDialog(null, "DEBUG: try blogundayiz");
n = Integer.parseInt(str);
}
catch(NumberFormatException e) {

88

JOptionPane.showMessageDialog(null, "Exception yakaland");


onEk = "Giris yanlis tekrar tekar deneyiniz.\n";
return sayiAl(onEk);
}
return n;
}
public static void main(String[] args) {
System.out.println("Girilen sayi: " + sayiAl(""));
System.exit(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
Integer.parseInt 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 >= values.length) {
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

catch(IOException e) {
code b;
}
finally {
code c;
}

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 {
System.out.println("Satir 1");
throw new Exception();
}
catch(Exception e) {
System.out.println("Catch blogu icindeyiz");
}
finally {
System.out.println("Finally blogu icindeyiz.");
}
System.out.println("Catch blogu disindayiz");
}
}
NOT: finally bloklarn alan streamleri, exception olsa bile kapatabilmek amacyla kullanabiliriz.

90

Java ile Programlama


Blm 8:

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(Dosya.txt);
File dosya2 = new File(c:\ornekler\dosya.txt);
File dosya3 = new File(/home/Academytech/Dosyam.txt)
...
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 Dosya.txt ya da
c:\ornekler\ dizini altnda bir dosya.txt ya da /home/Academytech/ dizini ierisinde bir Dosyam.txt 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/dosya.txt 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.

System.out.println 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++) {
System.out.println("i: " + i);
try {
System.in.read();
}
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
Sytem.out.print(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
System.in 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 java.io.*;
public class DosyaIslemleri {
public static void main(String[] args) {
String str;
String fileName = "deneme.txt";
try {
BufferedWriter out = new BufferedWriter(
new FileWriter(fileName));
out.write("Deneme Satir 1 ");
out.write("Deneme Satir 2\n");
out.write("Deneme Satir 3");
out.close();
BufferedReader in = new BufferedReader(
new FileReader(fileName));
while((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();

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

Ham Veri--->DataOutputStream-->BufferedOutputStream--->FileOutputStream--->DOSYA
Ham Veri<---DataInputStream<--BufferedInputStream<---FileInputStream<---

(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 CikisDosyasi.dat dosyamza okunabilir ve yazlabilir modda erimek istiyorsak nesneyi u ekilde
yaratmamz gerekir:
RandomAccessFile myFile = new RandomAccessFile(CikisDosyasi.dat, "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 java.awt.*;
import java.io.*;
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..",
FileDialog.SAVE );
fd.show();
filePath = new String( fd.getDirectory() + fd.getFile() );
// 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
outStream.writeObject( serialObject1 );
outStream.writeObject( serialObject2 );
outStream.flush();
outStream.close();
// Allow the user to specify an input file.
fd = new FileDialog( new Frame(), "Nesnelerin cekilecegi dosya",FileDialog.LOAD

);
fd.show();
filePath = new String( fd.getDirectory() + fd.getFile() );
ObjectInputStream inStream = new ObjectInputStream( new FileInputStream(
filePath ));
// Retrieve the Serializable object.
MySerialObject serialObject = ( MySerialObject )inStream.readObject();
//MySerialObject serialObject2 = ( MySerialObject )inStream.readObject();
// Display what we retrieved:
System.out.println( serialObject );
inStream.close();
}
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)
http://java.sun.com/j2se/1.4.2/docs/api/index.html 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 javax.swing ve java.awt 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 javax.swing.*;
import java.awt.*;
public class Cerceve extends JFrame {
public Cerceve() {
super("Benim ilk uygulamam");
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setSize(300, 400);
this.setResizable(false);
this.show();
}
public void paint(Graphics g) {
g.setColor(new Color(200, 20, 208));
g.drawString("Merhaba ", 150, 200);
g.drawLine(0, 0, 300, 300);
g.setColor(Color.BLACK);
g.drawRect(149, 188, 50, 20);
g.setColor(Color.CYAN);
g.drawOval(30, 30, 100, 150);
g.fillOval(30, 30, 80, 120);
}

101

public static void main(String[] args) {


new Cerceve();
}

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

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

public class SwingOrnek1 extends JFrame

Container c;
JButton dugme;
Dinleyici dinleyici;
public SwingOrnek1() {
super("GUI Nesneleri");
c = this.getContentPane();
dinleyici = new Dinleyici();
dugme = new JButton("Mesaji Goster");
dugme.addActionListener(dinleyici);
c.add(dugme);
this.addWindowListener(new WindowAdapter() {
public void WindowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setSize(300, 300);
this.show();
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Dinleyici implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == "Mesaji Goster") {
JOptionPane.showMessageDialog(null, "Dugmeye Basildi.");
}
}
}
public class Monitor {
public static void main(String[] args) {
new SwingOrnek1();

103

rneimiz 3 dosyadan olumaktadr. Bu dosyalardan Monitor.java dosyas aslnda kendi bana bir ilevi olmayan
ve genel olarak tm uygulamay altrmaya ynelik bir snf olarak yazlmtr.
Dinleyici.java 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 SwingOrnek1.java
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,
SwingOrnek1.java 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(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
putValue(color, c);
putValue(Action.SHORT_DESCRIPTION, Set panel color to +
name.toLowerCase);
}
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(blue.gif), Color.BLUE);
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.

import
import
import
import

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

public class LayoutDeneme1 extends JFrame implements ActionListener {

106

Container c;
JButton dugmeler[] = new JButton[10];
public LayoutDeneme1() {
c = 0this.getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT));
for(int i = 0; i < dugmeler.length; i++) {
dugmeler[i] = new JButton("dugme_"+i);
dugmeler[i].setSize(10,15);
dugmeler[i].addActionListener(this);
c.add(dugmeler[i]);
}
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setSize(300, 300);
this.show();
}
public void actionPerformed(ActionEvent e) {
for(int i = 0; i < dugmeler.length; i++)
if(e.getSource() == dugmeler[i]) {
JOptionPane.showMessageDialog(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

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

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();
c.add(dugmeler[0], BorderLayout.WEST);
c.add(dugmeler[1], BorderLayout.EAST);
c.add(dugmeler[2], BorderLayout.SOUTH);
c.add(dugmeler[3], BorderLayout.NORTH);
c.add(dugmeler[4], BorderLayout.CENTER);
for(int i = 0; i < dugmeler.length; i++)
dugmeler[i].addActionListener(this);

108

this.addWindowListener(new WindowAdapter() {
public void WindowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setSize(300, 300);
this.show();
}
public void actionPerformed(ActionEvent e) {
for(int i = 0; i < dugmeler.length; i++)
if(e.getSource() == dugmeler[i]) {
JOptionPane.showMessageDialog(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: JpanelOrnek1Cikis.png
ALT BALIK: JPanelOrnek1 Uygulamasnn almas
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
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 = this.getContentPane();
c.setLayout(new BorderLayout());
southPanel = new JPanel();
southPanel.setLayout(new BorderLayout());
colorPanel = new JPanel(new FlowLayout());
yellowButton = new JButton("Sari");
yellowButton.addActionListener(this);
colorPanel.add(yellowButton);
redButton = new JButton("Kirmizi");
redButton.addActionListener(this);
colorPanel.add(redButton);
blueButton = new JButton("Mavi");
blueButton.addActionListener(this);
colorPanel.add(blueButton);
yellowButton.setBackground(Color.BLACK);
yellowButton.setForeground(Color.WHITE);
redButton.setBackground(Color.BLACK);
redButton.setForeground(Color.WHITE);
blueButton.setBackground(Color.BLACK);
blueButton.setForeground(Color.WHITE);
southPanel.add(colorPanel, BorderLayout.SOUTH);
editPanel = new JPanel(new FlowLayout());
group = new ButtonGroup();
editable = new JRadioButton("Duzenlenebilir", false);
group.add(editable);
editable.addActionListener(this);
editPanel.add(editable);
noneditable = new JRadioButton("Duzenlenemez", true);
group.add(noneditable);
noneditable.addActionListener(this);
editPanel.add(noneditable);
southPanel.add(editPanel, BorderLayout.NORTH);
text = new JTextArea();
text.setText("Deneme Yazisi");
text.setEditable(true);
c.add(text, BorderLayout.CENTER);
c.add(southPanel, BorderLayout.SOUTH);
this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setSize(300, 300);
this.show();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == yellowButton) {
text.setBackground(Color.YELLOW);

110

yellowButton.setBackground(Color.YELLOW);
redButton.setBackground(Color.BLACK);
blueButton.setBackground(Color.BLACK);
}
else if(e.getSource() == redButton) {
text.setBackground(Color.RED);
yellowButton.setBackground(Color.BLACK);
redButton.setBackground(Color.RED);
blueButton.setBackground(Color.BLACK);
}
else if(e.getSource() == blueButton) {
text.setBackground(Color.BLUE);
yellowButton.setBackground(Color.BLACK);
redButton.setBackground(Color.BLACK);
blueButton.setBackground(Color.BLUE);
}
if(e.getSource() == editable)
text.setEditable(true);
else if(e.getSource() == noneditable)
text.setEditable(false);
repaint();
}

public static void main(String[] args) {


new JPanelOrnek1();

}
}
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) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.birseyler..
....
}

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(...);
g2.draw(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 Rectangle2D.Double ya da Rectangle2D.Float 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.

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

public class SekilCizim extends JFrame {


DrawPanel panel;
Container c;
public SekilCizim() {
c = this.getContentPane();
panel = new DrawPanel();
c.add(panel);
this.setSize(400, 400);
this.setTitle("Sekiller");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
public static void main(String arg[]) {
new SekilCizim();
}
}
class DrawPanel extends JPanel {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Rectangle2D rectangle = new Rectangle2D.Double(100, 100, 200, 150);
Ellipse2D ellipse = new Ellipse2D.Double();
super.setBackground(Color.BLACK);
g2.setColor(Color.GREEN);
ellipse.setFrame(rectangle);
g2.draw(rectangle);
g2.draw(ellipse);
}
}

Aadaki rnekte de yine Graphics2D kutuphanesi kullanlarak 2 boyutlu basit bir grafik ugulamas gelitirilmitir:

114

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.geom.*;
public class Eksen extends JFrame implements ActionListener {
JTextField xpoint, ypoint;
JButton setPointsButton;
CoordinatePanel coordinate;
JPanel settings;
Container c;
public Eksen() {
this.prepareComponents();
this.prepareFrame();
}
public void prepareFrame() {
this.setSize(420, 470);
this.setTitle("Sekiller");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
public void prepareComponents() {
c = this.getContentPane();
c.setLayout(new BorderLayout());
coordinate = new CoordinatePanel();

115

c.add(coordinate, BorderLayout.CENTER);
xpoint = new JTextField(3);
ypoint = new JTextField(3);
setPointsButton = new JButton("set point to new coordinates");
setPointsButton.addActionListener(this);
settings = new JPanel();
settings.setLayout(new FlowLayout());
settings.add(new JLabel("x: "));
settings.add(xpoint);
settings.add(new JLabel("y: "));
settings.add(ypoint);
settings.add(setPointsButton);
c.add(settings, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == this.setPointsButton) {
JOptionPane.showMessageDialog(this, "dugmeye basldi");
coordinate.setPoint(Integer.parseInt(xpoint.getText()),
Integer.parseInt(ypoint.getText()));
this.repaint();
}
}
public static void main(String arg[]) {
new Eksen();
}
}
class CoordinatePanel extends JPanel {
int currentX, currentY;
Ellipse2D nokta = new Ellipse2D.Double();
int xSize = 400, ySize = 400;
public CoordinatePanel() {
this.setSize(this.xSize, this.ySize);
this.currentX = 10;
this.currentY = 20;
this.setPoint(currentX, currentY);

}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
Line2D
this.ySize);
Line2D
this.ySize/2);
//

yline
xline

=
=

new
new

Line2D.Double(this.xSize/2,
Line2D.Double(0,

0,

this.ySize/2,

noktanin yeni koordinatlari relative olarak belirleniyor

116

this.xSize/2,
this.xSize,

nokta.setFrame(this.xSize/2+this.currentX-5,

this.ySize/2-this.currentY-

5, 10, 10);
g2.draw(xline); g2.draw(yline);
g2.fill(nokta);
}
//Bu metod notanin yeni koordinatlarini set ediyor.
public void setPoint(int x, int y) {
this.currentX = x;
this.currentY = y;
this.repaint();
}
}

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


frame.setBackground(SystemColor.desktop)
Text ve Fontlar
2 Boyutlu uygulamalar ierisinde kesinlikle ele alnmas gereken nesneleri ierisinde textler ve fontlar gelmektedir.
Daha nceki rneklerimizden biliyoruz ki g.drawString 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, Font.BOLD, 12);
Font iin kullnlabilecek style listesi
-

Font.BOLD

117

Font.ITALIC
Font.PLAIN
Font.BOLD + Font.ITALIC

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 javax.swing.*;
import java.awt.*;
public class Fonts {
public static void main(String[] args) {
String str= "";
String systemFonts[] =
GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

for(int i = 0; i < systemFonts.length; i++)


str += i+": "+systemFonts[i]+"\n";
System.out.println(str);
}
}

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 sunset.jpg isimli bir resim olsun:

import javax.swing.*;
import java.awt.*;
public class ImageFrame extends JFrame {
JScrollPane scroll;
ImagePanel imPanel;
Container c;
int WIDTH;
int HEIGHT;

118

public ImageFrame() {
c = this.getContentPane();
c.setLayout(new BorderLayout());
imPanel = new ImagePanel();
this.WIDTH = imPanel.getWidth();
this.HEIGHT = imPanel.getHeight();
c.add(imPanel);
this.prepareFrame();
}
public void prepareFrame() {
this.setSize(this.WIDTH, this.HEIGHT);
this.setTitle("ImageFrame");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
public static void main(String[] args) {
new ImageFrame();
}
}
class ImagePanel extends JPanel {
Image myImage;
public ImagePanel() {
myImage =
Toolkit.getDefaultToolkit().getImage("G:\\egitim_yazil_seminer\\egitimler\\"+
"ACADEMYTECH\\javaDersleri\\derstekiOrnekler\\Sunset.jpg");
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(myImage, 0);
try {
tracker.waitForID(0);
} catch(InterruptedException e) {}
this.setSize(new Dimension(800, 600));
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(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 = Toolkit.getDefaultToolkit();
int screenX = (int)kit.getScreenSize().getWidth();
int screenY = (int)kit.getScreenSize().getHeight();
this.setLocation(screenX/2 -this.WIDTH/2, screenY/2- this.HEIGHT/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 java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicLookAndFeel;
import java.awt.event.*;
public class PlafTest extends JFrame implements ActionListener{
Container c;
JButton metalButton, motifButton, windowsButton;
public PlafTest() {
c = this.getContentPane();
c.setLayout(new FlowLayout());
this.metalButton = new JButton("Metal");
this.metalButton.addActionListener(this);
c.add(this.metalButton);
this.motifButton = new JButton("Motif");
this.motifButton.addActionListener(this);
c.add(this.motifButton);
this.windowsButton = new JButton("Windows");
this.windowsButton.addActionListener(this);
c.add(this.windowsButton);
this.setSize(400, 400);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}

public void actionPerformed(ActionEvent e) {


if(e.getSource() == this.metalButton) {

120

this.changeToMetal();
}
else if(e.getSource() == this.windowsButton) {
this.changeToWin();
}
else if(e.getSource() == this.motifButton) {
this.changeToMotif();
}

}
private void changeToMetal() {
try {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e) {}
}
private void changeToWin() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e) {}
}
private void changeToMotif() {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e) {}
}

public static void main(String arg[]) {


new PlafTest();
}
}

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.

/*WindowEvents.java*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class WindowEvents extends JFrame {
Container c;
PencereDinleyici dinleyici = new PencereDinleyici();
public WindowEvents() {

c = this.getContentPane();
c.setLayout(new FlowLayout());
this.addWindowListener(dinleyici);
this.setSize(400, 400);
this.setResizable(false);
//this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
public static void main(String arg[]) {
new WindowEvents();

122

}
}
class PencereDinleyici extends WindowAdapter {
public void windowClosing(WindowEvent e) {
JOptionPane.showMessageDialog(null, "Pencere kapaniyor");
System.exit(0);
}
public void windowIconified(WindowEvent e) {
JOptionPane.showMessageDialog(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

int keyCode = e.getKeyCode();


if(keyCode == KeyEvent.VK_SHIFT)
....

Baslan tuun rettii tam karakter elde edilmek istendiinde getKeyChar() metodu da kullanlabilir.
imdi tm bu bilgilerimizi pekitirmek amacyla aadaki rnei deneyelim:
/* SketchPanel.java*/
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import javax.swing.JPanel;
class SketchPanel extends JPanel {
Point2D last;
ArrayList lines;
public SketchPanel() {
last = new Point2D.Double(100,100);
lines = new ArrayList();
KeyHandler listener = new KeyHandler();
this.addKeyListener(listener);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
//listedeki tum cizgileri ciziliyor
for(int i = 0; i < lines.size(); i++)
g2.draw((Line2D)lines.get(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 Point2D.Double(last.getX() + dx, last.getY() + dy);
//son noktadan yeni noktaya kadar olan cizgi hazirlaniyor
Line2D line = new Line2D.Double(last, end);
//bu cizgi diger cizgilerin listesine kayit ediliyor
lines.add(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 = e.getKeyCode();
//uzakligi ayarliyoruz
int d;
if(e.isShiftDown())
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 = e.getKeyChar();
//uzakligi ayarliyoruz
int d;
if(Character.isUpperCase(keyChar)) {
d = this.LARGE_INCREMENT;
keyChar = Character.toLowerCase(keyChar);
}
else
d = this.SMALL_INCREMENT;
}
}
}

/*SketchFrame.java*/
import javax.swing.*;
import
import
import
import

java.awt.event.*;
java.awt.*;
java.awt.geom.*;
java.util.*;

125

public class SketchFrame extends JFrame {


Container c;
public SketchFrame() {
c = this.getContentPane();
SketchPanel panel = new SketchPanel();
c.add(panel);
this.setTitle("Sketch");
this.setSize(400, 400);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.show();
}
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 = e.getX();
int y = e.getY();
if(e.isShiftDown && e.getClickCount() > 2) {

126

Graphics g = getGraphics();
g.drawString(Selam, x, y);
g.dispose();
}
}

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..

/*MouseTracker.java*/
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class MouseTracker extends JFrame implements MouseListener,
MouseMotionListener {
private JLabel statusBar;
public MouseTracker() {
super("Mouse olaylarini ele aliyoruz");
statusBar = new JLabel();
this.getContentPane().add(statusBar, BorderLayout.SOUTH);
this.addMouseListener(this);
this.addMouseMotionListener(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 400);
this.show();
}
public void mouseClicked(MouseEvent arg0) {
statusBar.setText("Clicked at [" + arg0.getX() + ", " + arg0.getY() +
"]");
}
public void mouseEntered(MouseEvent arg0) {
statusBar.setText("Mouse is in window");
}
public void mouseExited(MouseEvent arg0) {
statusBar.setText("Mouse is not in window");
}
public void mousePressed(MouseEvent arg0) {
statusBar.setText("Pressed at [" + arg0.getX() + ", " + arg0.getY() +

127

"]");
}
public void mouseReleased(MouseEvent arg0) {
statusBar.setText("Released at [" + arg0.getX() + ", " + arg0.getY() +
"]");
}
public void mouseDragged(MouseEvent arg0) {
statusBar.setText("Dragged at [" + arg0.getX() + ", " + arg0.getY() +
"]");
}
public void mouseMoved(MouseEvent arg0) {
statusBar.setText("Moved at [" + arg0.getX() + ", " + arg0.getY() + "]");
}
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.

BorderLayout JFrame iin ntanml olan layout dur

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();
c.add(nesne, BorderLayout.SOUTH);

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:
panel.setLayout(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 = Box.createHorizontalBox();
Box b = Box.createVerticalBox();
b.add(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 geniletilir.Nesneler 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 = Box.cerateHorizontalBox();
b.add(label)
b.add(Box.createHorizontalStrut(10));
b.add(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:
b.add(Box.createRigidArea(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.
b.add(button1);
b.add(Box.createGlue());
b.add(button2);
/*** BoxLayoutTest.java *****/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
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);
textField1.setMaximumSize(textField1.getPreferredSize());
Box hbox1 = Box.createHorizontalBox();
hbox1.add(label1);
hbox1.add(Box.createHorizontalStrut(10));
hbox1.add(textField1);
JLabel label2 = new JLabel("Password: ");
JTextField textField2 = new JTextField(10);
textField2.setMaximumSize(textField2.getPreferredSize());
Box hbox2 = Box.createHorizontalBox();
hbox2.add(label2);
hbox2.add(Box.createHorizontalStrut(10));
hbox2.add(textField2);
JButton button1 = new JButton("Ok");
JButton button2 = new JButton("Cancel");
Box hbox3 = Box.createHorizontalBox();
hbox3.add(button1);
hbox3.add(Box.createHorizontalStrut(10));
hbox3.add(button2);
Box vbox = Box.createVerticalBox();
vbox.add(hbox1);

131

vbox.add(hbox2);
vbox.add(Box.createVerticalGlue());
vbox.add(hbox3);
this.getContentPane().add(vbox);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
show();
}
}

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:
GridBagConstraints.NONE: alan hi doldurmaz
GridBagConstraints.VERTICAL: sadece dikeyde doldurur
GridBagConstraints.HORIZONTAL: sadece yatayda doldurur
GridBagConstraints.BOTH: tum alan doldurur
anchor, eer nesne alan doldurmuyorsa (hibiryerde doldurmuyorsa, dikeyde doldurmuyorsa ya da yatayda
doldurmuyorsa) bu blgede nerede yer alacan belirlemek iin kullanlr.
GridBagConstraints.NORTH: doldurmad alanda kuzeye dayal
GridBagConstraints.CENTER: doldurmad alanda merkezde
GridBagConstraints.NORTHEAST: ...
GridBagConstraints.EAST: ...
...

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 javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class GridBagDemo extends JFrame {
private Container container;
private GridBagLayout gbLayout;
private GridBagConstraints gbConstraints;
public GridBagDemo()
{
super( "GridBagLayout" );
container = getContentPane();
gbLayout = new GridBagLayout();
container.setLayout( 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
gbConstraints.fill = GridBagConstraints.BOTH;
//gbConstraints.fill = GridBagConstraints.HORIZONTAL;
addComponent( ta, 0, 0, 1, 3 );
// button b1
// weightx and weighty are both 0: the default
gbConstraints.fill = GridBagConstraints.HORIZONTAL;
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
gbConstraints.weightx = 1000; // can grow wider
gbConstraints.weighty = 1;
// can grow taller
gbConstraints.fill = GridBagConstraints.BOTH;
addComponent( b2, 1, 1, 1, 1 );
// button b3
// fill is BOTH
gbConstraints.weightx = 0;
gbConstraints.weighty = 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
gbConstraints.gridx = column;
gbConstraints.gridy = row;
// set gridwidth and gridheight
gbConstraints.gridwidth = width;
gbConstraints.gridheight = height;

134

// set constraints
gbLayout.setConstraints( c, gbConstraints );
container.add( c );
// add component
}
public static void main( String args[] )
{
GridBagDemo app = new GridBagDemo();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}

/*** FontDialog.java ***/


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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 = this.getContentPane();
GridBagLayout gbl = new GridBagLayout();
c.setLayout(gbl);
ActionListener listener = new FontAction();
JLabel faceLabel = new JLabel("Face: ");

135

face = new JComboBox(new String[] {"Serif", "SansSerif", "Monospaced",


"Dialog", "DialogInput"});
face.addActionListener(listener);
JLabel sizeLabel = new JLabel("Size: ");
size = new JComboBox(new String[] {"8", "10", "12", "15", "18", "24"} );
size.addActionListener(listener);
bold = new JCheckBox("Bold");
bold.addActionListener(listener);
italic = new JCheckBox("Italic");
italic.addActionListener(listener);
sample = new JTextArea();
sample.setText("Bugun, bundan sonraki gunlerinin ilk gunudur");
sample.setEditable(false);
sample.setLineWrap(true); //satir bitince alt satira gecis
sample.setBorder(BorderFactory.createEtchedBorder());
/*Grid tanimlamalarimini hazirliyoruz*/
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.EAST;
constraints.weightx = 0;
constraints.weighty = 0;
add(faceLabel, constraints, 0, 0, 1, 1);
add(sizeLabel, constraints, 0, 1, 1, 1);
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 100;
add(face, constraints, 1, 0, 1, 1);
add(size, constraints, 1, 1, 1, 1);
constraints.weighty = 100;
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.CENTER;
add(bold, constraints, 0, 2, 2, 1);
add(italic, constraints, 0, 3, 2, 1);
constraints.fill = GridBagConstraints.BOTH;
add(sample, constraints, 2, 0, 1, 4);
show();
}
public void add(Component c, GridBagConstraints constraints, int x, int y, int
w, int h) {
constraints.gridx = x;
constraints.gridy = y;
constraints.gridwidth = w;
constraints.gridheight = h;
getContentPane().add(c, constraints);
}

136

private class FontAction implements ActionListener {


public void actionPerformed(ActionEvent e) {
String fontFace = (String)face.getSelectedItem();
int fontStyle = (bold.isSelected() ? Font.BOLD : 0) +
(italic.isSelected() ? Font.ITALIC : 0);
int fontSize = Integer.parseInt( (String)size.getSelectedItem() );
sample.setFont(new Font(fontFace, fontStyle, fontSize));
sample.repaint();
}
}
}

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:
textField.getDocument().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 javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
public class TextTest extends JFrame implements ActionListener, KeyListener {
Container c;
JButton dugme;
JTextField text;
public TextTest() {
c = getContentPane();
c.setLayout(new FlowLayout());

dugme = new JButton("Gonder");


dugme.setToolTipText("int bilgiyi gonderir");
dugme.addActionListener(this);
dugme.setBackground(Color.BLUE);
dugme.setForeground(Color.WHITE);
c.add(dugme);
text = new JTextField("0", 10);
text.addKeyListener(this);
c.add(text);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(240, 120);
setResizable(false);
show();

138

public void actionPerformed(ActionEvent e) {


int strInt = strInt = Integer.parseInt(text.getText());
if(strInt == 42)
System.exit(0);
else
JOptionPane.showMessageDialog(this, ""+strInt);
}
public void keyPressed(KeyEvent e) {
int k = e.getKeyCode();
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) {

JOptionPane.showMessageDialog(this, "rakam giriniz..");


String str = text.getText();
str = str.substring(0, str.length()-1);
text.setText(str);
text.validate();
}
c.repaint();
}
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));
contentPane.add(scroll, BorderLayout.CENTER);
Gereginden fazla text girisi yapildiginda scroll bar otomatik olarak belirecektir.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextAreaTest
{
public static void main(String[] args)
{
TextAreaFrame frame = new TextAreaFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
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");
buttonPanel.add(insertButton);
insertButton.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
textArea.append("The quick brown fox "
+ "jumps over the lazy dog. ");
}
});
// add button to turn line wrapping on and off
wrapButton = new JButton("Wrap");
buttonPanel.add(wrapButton);
wrapButton.addActionListener(new
ActionListener()

140

{
public void actionPerformed(ActionEvent evt)
{
boolean wrap = !textArea.getLineWrap();
textArea.setLineWrap(wrap);
scrollPane.validate();
wrapButton.setText(wrap ? "No Wrap" : "Wrap");
}
});
contentPane.add(buttonPanel, BorderLayout.SOUTH);
// add a text area with scroll bars
textArea = new JTextArea(8, 40);
scrollPane = new JScrollPane(textArea);
contentPane.add(scrollPane, BorderLayout.CENTER);
}
public static final int WIDTH = 300;
public static final int HEIGHT = 300;
private
private
private
private

JTextArea textArea;
JScrollPane scrollPane;
JPanel buttonPanel;
JButton wrapButton;

}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextEditTest
{
public static void main(String[] args)
{
TextEditFrame frame = new TextEditFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
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");
panel.add(replaceButton);
replaceButton.addActionListener(new ReplaceAction());

141

from = new JTextField("brown", 8);


panel.add(from);
panel.add(new JLabel("with"));
to = new JTextField("purple", 8);
panel.add(to);
contentPane.add(panel, BorderLayout.SOUTH);
// add text area with scroll bars
textArea = new JTextArea(8, 40);
textArea.setText
("The quick brown fox jumps over the lazy dog.");
JScrollPane scrollPane = new JScrollPane(textArea);
contentPane.add(scrollPane, BorderLayout.CENTER);
}
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 = from.getText();
int n = textArea.getText().indexOf(f);
if (n >= 0 && f.length() > 0)
textArea.replaceRange(to.getText(), n,
n + f.length());
}
}
}
Etiketler ve Nesnelerin Etiketlendirilmesi
JLabel(String str, int alignment)
SwingConstants.LEFT, 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 javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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);
l.setFont(f);
r1 = new JRadioButton("Blue");
r1.addActionListener(this);
r2 = new JRadioButton("Red");
r2.addActionListener(this);
group = new ButtonGroup();
group.add(r1);
group.add(r2);
c1 = new JCheckBox("Bold");
c1.addActionListener(this);
c2 = new JCheckBox("Italic");
c2.addActionListener(this);
bp = new JPanel();
bp.add(r1);
bp.add(r2);
bp.add(c1);
bp.add(c2);
/*label icin hazirlanan panel*/
lp = new JPanel();
lp.add(l);
c.add(lp, BorderLayout.CENTER);
c.add(bp, BorderLayout.SOUTH);

143

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 400);
show();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == r1)
l.setForeground(Color.BLUE);
else if(e.getSource() == r2)
l.setForeground(Color.RED);
if(e.getSource() == c1 || e.getSource() == c2) {
boldvalue = c1.isSelected() ? Font.BOLD : 0;
italicvalue = c2.isSelected() ? Font.ITALIC : 0;
f = new Font("Serif", boldvalue + italicvalue, size);
l.setFont(f);
}
l.validate();
c.repaint();
}
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();
faceCombo.setEditable(true);
faceCombo.addItem(Serif);
faceCombo.addItem(SansSerif);
Object getSelectedItem()
JComboBox(String []str)
void removeItemAt(int index)
void removeItem(String item)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
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);
l.setFont(f);
r1 = new JRadioButton("Blue");
r1.addActionListener(this);
r2 = new JRadioButton("Red");
r2.addActionListener(this);
group = new ButtonGroup();
group.add(r1);
group.add(r2);
c1 = new JCheckBox("Bold");
c1.addActionListener(this);
c2 = new JCheckBox("Italic");
c2.addActionListener(this);
sizecombo = new JComboBox(new String [] {"8", "12", "24", "48"});
sizecombo.setSelectedItem("24");
sizecombo.setEditable(true);
sizecombo.addActionListener(this);
bp = new JPanel();
bp.add(r1);
bp.add(r2);
bp.add(c1);
bp.add(c2);
bp.add(sizecombo);
/*label icin hazirlanan panel*/
lp = new JPanel();
lp.add(l);
c.add(lp, BorderLayout.CENTER);
c.add(bp, BorderLayout.SOUTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 400);
show();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == r1)
l.setForeground(Color.BLUE);
else if(e.getSource() == r2)
l.setForeground(Color.RED);
if(e.getSource() == c1 || e.getSource() == c2) {
boldvalue = c1.isSelected() ? Font.BOLD : 0;
italicvalue = c2.isSelected() ? Font.ITALIC : 0;
l.setFont(new Font("Serif", boldvalue + italicvalue, size));

145

}
if(e.getSource() == sizecombo) {
m("combo");
size = Integer.parseInt(sizecombo.getSelectedItem().toString());
l.setFont(new Font("Serif", boldvalue + italicvalue, size));
}
l.validate();
c.repaint();
}
public void m(String str) {
JOptionPane.showMessageDialog(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(SwingConstants.VERTICAL, 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:
slider.setMajorTickSpacing(20)
slider.setMinorTickSpacing(5);
slider.setPaintTicks(true): Bu dekorlarn gorunur olmasn salar.
slider.setPaintLabels(true)

146

metoldarndan yararlanlr.
slider.setPaintLabels(true): Major tick space leri gorunur klar
Slider boyutlandirmasi iin:
sl.setPreferredSize(new Dimension(550, 50));
sl.setMinimumSize(new Dimension(550, 50));
sl.setMaximumSize(new Dimension(550, 50));

import
import
import
import

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

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);
l.setFont(f);
r1 = new JRadioButton("Blue");
r1.addActionListener(this);
r2 = new JRadioButton("Red");
r2.addActionListener(this);
group = new ButtonGroup();
group.add(r1);
group.add(r2);
c1 = new JCheckBox("Bold");
c1.addActionListener(this);
c2 = new JCheckBox("Italic");
c2.addActionListener(this);
sizecombo = new JComboBox(new String [] {"8", "12", "24", "48"});
sizecombo.setSelectedItem("24");
sizecombo.setEditable(true);
sizecombo.addActionListener(this);
sl = new JSlider(0, 100, 24);
sl.setMajorTickSpacing(5);
sl.setMinorTickSpacing(10);
sl.setPaintTicks(true);

147

sl.setPaintLabels(true);
sl.addChangeListener(this);

bp = new JPanel();
bp.add(r1);
bp.add(r2);
bp.add(c1);
bp.add(c2);
bp.add(sizecombo);
/*label icin hazirlanan panel*/
lp = new JPanel();
lp.add(l);
np = new JPanel();
np.add(sl);
c.add(lp, BorderLayout.CENTER);
c.add(bp, BorderLayout.SOUTH);
c.add(np, BorderLayout.NORTH);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 400);
show();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == r1)
l.setForeground(Color.BLUE);
else if(e.getSource() == r2)
l.setForeground(Color.RED);
if(e.getSource() == c1 || e.getSource() == c2) {
boldvalue = c1.isSelected() ? Font.BOLD : 0;
italicvalue = c2.isSelected() ? Font.ITALIC : 0;
l.setFont(new Font("Serif", boldvalue + italicvalue, size));
}
if(e.getSource() == sizecombo) {
m("combo");
size = Integer.parseInt(sizecombo.getSelectedItem().toString());
l.setFont(new Font("Serif", boldvalue + italicvalue, size));
}
l.validate();
c.repaint();
}
public void m(String str) {
JOptionPane.showMessageDialog(null, str);
}
public static void main(String[] args) {

148

new ButtonsTest();
}
public void stateChanged(ChangeEvent e) {
l.setFont(new Font("Serif", boldvalue + italicvalue, sl.getValue()));
}
}
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();


labelTable.put(new Integer(0), new JLabel(A));
labelTable.put(new Integer(20), new JLabel(B));
.
labelTable.put(new Integer(100), new JLabel(F));
slider.setLabelTable(labelTable);
import
import
import
import
import

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

public class SliderTest


{
public static void main(String[] args)
{
SliderTestFrame frame = new SliderTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
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();
sliderPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
// 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)event.getSource();
textField.setText("" + source.getValue());
}
};
// add a plain slider
JSlider slider = new JSlider();
addSlider(slider, "Plain");
// add a slider with major and minor ticks
slider = new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Ticks");
// add a slider that snaps to ticks
slider = new JSlider();
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Snap to ticks");
// add a filled slider
slider = new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
slider.putClientProperty("JSlider.isFilled",
Boolean.TRUE);
addSlider(slider, "Filled");
// add a filled and inverted slider
slider = new JSlider();
slider.setPaintTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
slider.putClientProperty("JSlider.isFilled",
Boolean.TRUE);
slider.setInverted(true);
addSlider(slider, "Inverted");
// add a slider with numeric labels
slider = new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
addSlider(slider, "Labels");
// add a slider with alphabetic labels
slider = new JSlider();
slider.setPaintLabels(true);
slider.setPaintTicks(true);

150

slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(5);
Hashtable labelTable = new Hashtable();
labelTable.put(new Integer(0), new JLabel("A"));
labelTable.put(new Integer(20), new JLabel("B"));
labelTable.put(new Integer(40), new JLabel("C"));
labelTable.put(new Integer(60), new JLabel("D"));
labelTable.put(new Integer(80), new JLabel("E"));
labelTable.put(new Integer(100), new JLabel("F"));
slider.setLabelTable(labelTable);
addSlider(slider, "Custom labels");
// add a slider with icon labels
slider = new JSlider();
slider.setPaintTicks(true);
slider.setPaintLabels(true);
slider.setSnapToTicks(true);
slider.setMajorTickSpacing(20);
slider.setMinorTickSpacing(20);
labelTable = new Hashtable();
// add card images
labelTable.put(new Integer(0),
new JLabel(new ImageIcon("nine.gif")));
labelTable.put(new Integer(20),
new JLabel(new ImageIcon("ten.gif")));
labelTable.put(new Integer(40),
new JLabel(new ImageIcon("jack.gif")));
labelTable.put(new Integer(60),
new JLabel(new ImageIcon("queen.gif")));
labelTable.put(new Integer(80),
new JLabel(new ImageIcon("king.gif")));
labelTable.put(new Integer(100),
new JLabel(new ImageIcon("ace.gif")));
slider.setLabelTable(labelTable);
addSlider(slider, "Icon labels");
// add the text field that displays the slider value
textField = new JTextField();
Container contentPane = getContentPane();
contentPane.add(sliderPanel, BorderLayout.CENTER);
contentPane.add(textField, BorderLayout.SOUTH);
}
/**
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)
{
s.addChangeListener(listener);
JPanel panel = new JPanel();
panel.add(s);
panel.add(new JLabel(description));
sliderPanel.add(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:
frame.setJMenuBar(menuBar);
menubar icerisine bir takm menuler eklenebilir
JMenu editMenu = new JMenu(Edit);
menuBar.addMenu(editMenu);
Her menu icerisinde menu nesneleri vardr.
JMenuItem pasteItem = new JMenuItem(Paste);
JMenuItem cutItem = new JMenuItem(Cut);
(JMenuItem iconedItem = new JMenuItem(Iconed, icon);
editMenu.add(pasteItem);
editMenu.add(cutItem);
Menu nesneleri arasna ayrac da eklenebilir:
JMenu optionMenu = new JMenu(Select);
editMenu.addSperator();
editMenu.add(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);
item.addActionListener(listener);
popup.add(item);

Bir popup menusunu her seferinde aka gostermek gerekir. Bunun iin
popup.show(panel, x, y)
metodu kullanlr. panel nesnesi popup menusunu parent olan nesnesini temsil eder. X ve y de menunun
gpsterilecegi lokasyon bilgisini belirtir.

Bir popup menusu asagidaki sekilde ele alnabilir:

153

1. bir mouse listener yuklenir.


2. public void mouseReleased(MouseEvent e) {
if(e.isPopupTrigger())
popup.show(e.getComponent(), e.getX(), e.getY());
}

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:
cutItem.setMnemonic(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:
openItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
import
import
import
import
import
import
import
import
import
import

java.awt.BorderLayout;
java.awt.Color;
java.awt.Container;
java.awt.Dimension;
java.awt.FlowLayout;
java.awt.Font;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.awt.event.InputEvent;
java.awt.event.KeyEvent;

import
import
import
import
import
import
import
import
import
import
import

javax.swing.ButtonGroup;
javax.swing.JButton;
javax.swing.JCheckBoxMenuItem;
javax.swing.JComboBox;
javax.swing.JFrame;
javax.swing.JMenu;
javax.swing.JMenuBar;
javax.swing.JPanel;
javax.swing.JRadioButton;
javax.swing.JTextArea;
javax.swing.KeyStroke;

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 = this.getContentPane();
c.setLayout(new BorderLayout());
southPanel = new JPanel();
southPanel.setLayout(new BorderLayout());
colorPanel = new JPanel(new FlowLayout());
yellowButton = new JButton("Sari");
yellowButton.addActionListener(this);
colorPanel.add(yellowButton);
redButton = new JButton("Kirmizi");
redButton.addActionListener(this);
colorPanel.add(redButton);
blueButton = new JButton("Mavi");
blueButton.addActionListener(this);
colorPanel.add(blueButton);
yellowButton.setBackground(Color.BLACK);
yellowButton.setForeground(Color.WHITE);
redButton.setBackground(Color.BLACK);
redButton.setForeground(Color.WHITE);
blueButton.setBackground(Color.BLACK);
blueButton.setForeground(Color.WHITE);
southPanel.add(colorPanel, BorderLayout.SOUTH);
editPanel = new JPanel(new FlowLayout());
group = new ButtonGroup();
editable = new JRadioButton("Duzenlenebilir", false);
group.add(editable);
editable.addActionListener(this);
editPanel.add(editable);
noneditable = new JRadioButton("Duzenlenemez", true);
group.add(noneditable);
noneditable.addActionListener(this);
editPanel.add(noneditable);
southPanel.add(editPanel, BorderLayout.NORTH);
text = new JTextArea();
text.setText("Deneme Yazisi");
text.setEditable(true);
c.add(text, BorderLayout.CENTER);
c.add(southPanel, BorderLayout.SOUTH);

155

menuBar = new JMenuBar();


fontMenu = new JMenu("Font");
fontMenu.setToolTipText("Fontlarla ilgili ayarlari yapabilirsiniz");
fontMenu.setMnemonic('F');
fontStyleMenu = new JMenu("StyLe");
boldItem = new JCheckBoxMenuItem("bold");
boldItem.addActionListener(this);
boldItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B,
InputEvent.CTRL_MASK));
fontStyleMenu.add(boldItem);
italicItem = new JCheckBoxMenuItem("italic");
italicItem.addActionListener(this);
fontStyleMenu.add(italicItem);
fontMenu.add(fontStyleMenu);
this.comboMenu = new JComboBox(new String[] {"12", "24", "48"});
this.comboMenu.setMaximumSize(new Dimension(50, 30));
this.comboMenu.addActionListener(this);
menuBar.add(fontMenu);
menuBar.add(comboMenu);
this.setJMenuBar(menuBar);

this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
this.setSize(300, 300);
//this.show();
}

public void actionPerformed(ActionEvent e) {


if(e.getSource() == yellowButton) {
text.setBackground(Color.YELLOW);
yellowButton.setBackground(Color.YELLOW);
redButton.setBackground(Color.BLACK);
blueButton.setBackground(Color.BLACK);
}
else if(e.getSource() == redButton) {
text.setBackground(Color.RED);
yellowButton.setBackground(Color.BLACK);
redButton.setBackground(Color.RED);
blueButton.setBackground(Color.BLACK);
}
else if(e.getSource() == blueButton) {
text.setBackground(Color.BLUE);

156

yellowButton.setBackground(Color.BLACK);
redButton.setBackground(Color.BLACK);
blueButton.setBackground(Color.BLUE);
}
if(e.getSource() == editable)
text.setEditable(true);
else if(e.getSource() == noneditable)
text.setEditable(false);
if(e.getSource() == this.boldItem || e.getSource() == this.italicItem ||
e.getSource() == this.comboMenu) {
this.boldValue = this.boldItem.isSelected() ? Font.BOLD : 0;
this.italicValue = this.italicItem.isSelected() ? Font.ITALIC : 0;
this.size = Integer.parseInt((String)this.comboMenu.getSelectedItem());
this.text.setFont(new Font(this.face, this.boldValue + this.italicValue,
this.size));
}
this.repaint();
}
public static void main(String[] args) {
JPanelOrnek1 jp = new JPanelOrnek1();
jp.show();
}
}

NOT: Hzlandrclar sadece menu nesnelerine eklenebilir. Menulere hzlandrc atamas yaplmaz.

Menu Nesnelerinin Geerli ya da Geersiz Hale Getirilmesi


JMenuItem openItem = new JMenuItem(Open, O);
openItem.setEnabled(false);
ya da
openItem.setEnabled(true);

javax.swing.awt 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) ;
}

Ara ubuklar (Toolbars)

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();
bar.add(blueButton);
bar.addSeperator();
Ornek:
contentPane.add(bar, BorderLayout.NORTH);
Ornek::
bar = new JToolBar(Title, SwingConstants.VERTICAL);
Aadaki rnek Sun Microsytems tarafndan yaynlanan Core Java 1 kitabndan aynen alnmtr.
import
import
import
import

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

public class ToolBarTest


{
public static void main(String[] args)
{
ToolBarFrame frame = new ToolBarFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
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();
contentPane.add(panel, BorderLayout.CENTER);
// set up actions
Action
new
Action
new
Action
new

blueAction = new ColorAction("Blue",


ImageIcon("blue-ball.gif"), Color.blue);
yellowAction = new ColorAction("Yellow",
ImageIcon("yellow-ball.gif"), Color.yellow);
redAction = new ColorAction("Red",
ImageIcon("red-ball.gif"), Color.red);

Action exitAction = new


AbstractAction("Exit", new ImageIcon("exit.gif"))

158

{
public void actionPerformed(ActionEvent event)
{
System.exit(0);
}
};
exitAction.putValue(Action.SHORT_DESCRIPTION, "Exit");
// populate tool bar
JToolBar bar = new JToolBar();
bar.add(blueAction);
bar.add(yellowAction);
bar.add(redAction);
bar.addSeparator();
bar.add(exitAction);
contentPane.add(bar, BorderLayout.NORTH);
// populate menu
JMenu menu = new JMenu("Color");
menu.add(yellowAction);
menu.add(blueAction);
menu.add(redAction);
menu.add(exitAction);
JMenuBar menuBar = new JMenuBar();
menuBar.add(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(Action.NAME, 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");
panel.setBackground(c);
panel.repaint();
}
}
}

DialogPencereleri
Olduka fazla sayda hazr dialog pencereleri kullanlabilir:

159

Aadaki rnekte hazr olarak kullanlabilecek tm dialog pencereleri olduka detayl bir ekilde ele alnmtr:
import
import
import
import
import
import

java.awt.*;
java.awt.event.*;
java.awt.geom.*;
java.util.*;
javax.swing.*;
javax.swing.border.*;

public class OptionDialogTest


{
public static void main(String[] args)
{
OptionDialogFrame frame = new OptionDialogFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
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(BorderFactory.createTitledBorder
(BorderFactory.createEtchedBorder(), title));
setLayout(new BoxLayout(this,
BoxLayout.Y_AXIS));
group = new ButtonGroup();
// make one radio button for each option
for (int i = 0; i < options.length; i++)
{
JRadioButton b = new JRadioButton(options[i]);
b.setActionCommand(options[i]);
add(b);
group.add(b);
b.setSelected(i == 0);
}
}
/**
Gets the currently selected option.
@return the label of the currently selected radio button.
*/
public String getSelection()
{
return group.getSelection().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();
gridPanel.setLayout(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

});
gridPanel.add(typePanel);
gridPanel.add(messageTypePanel);
gridPanel.add(messagePanel);
gridPanel.add(optionTypePanel);
gridPanel.add(optionsPanel);
gridPanel.add(inputPanel);
// add a panel with a Show button
JPanel showPanel = new JPanel();
JButton showButton = new JButton("Show");
showButton.addActionListener(new ShowAction());
showPanel.add(showButton);
Container contentPane = getContentPane();
contentPane.add(gridPanel, BorderLayout.CENTER);
contentPane.add(showPanel, BorderLayout.SOUTH);
}
/**
Gets the currently selected message.
@return a string, icon, component or object array,
depending on the Message panel selection
*/
public Object getMessage()
{
String s = messagePanel.getSelection();
if (s.equals("String"))
return messageString;
else if (s.equals("Icon"))
return messageIcon;
else if (s.equals("Component"))
return messageComponent;
else if (s.equals("Object[]"))
return new Object[]
{
messageString,
messageIcon,
messageComponent,
messageObject
};
else if (s.equals("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 = optionsPanel.getSelection();
if (s.equals("String[]"))
return new String[] { "Yellow", "Blue", "Red" };
else if (s.equals("Icon[]"))
return new Icon[]
{
new ImageIcon("yellow-ball.gif"),
new ImageIcon("blue-ball.gif"),

162

new ImageIcon("red-ball.gif")
};
else if (s.equals("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 = panel.getSelection();
try
{
return JOptionPane.class.getField(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 (typePanel.getSelection().equals("Confirm"))
JOptionPane.showConfirmDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(optionTypePanel),
getType(messageTypePanel));
else if (typePanel.getSelection().equals("Input"))
{
if (inputPanel.getSelection().equals("Text field"))
JOptionPane.showInputDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(messageTypePanel));
else
JOptionPane.showInputDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(messageTypePanel),

163

null,
new String[] { "Yellow", "Blue", "Red" },
"Blue");
}
else if (typePanel.getSelection().equals("Message"))
JOptionPane.showMessageDialog(
OptionDialogFrame.this,
getMessage(),
"Title",
getType(messageTypePanel));
else if (typePanel.getSelection().equals("Option"))
JOptionPane.showOptionDialog(
OptionDialogFrame.this,
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

ButtonPanel
ButtonPanel
ButtonPanel
ButtonPanel
ButtonPanel
ButtonPanel

typePanel;
messagePanel;
messageTypePanel;
optionTypePanel;
optionsPanel;
inputPanel;

private
private
private
private

String messageString = "Message";


Icon messageIcon = new ImageIcon("blue-ball.gif");
Object messageObject = new Date();
Component messageComponent = new SamplePanel();

}
/**
A panel with a painted surface
*/
class SamplePanel extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Rectangle2D rect = new Rectangle2D.Double(0, 0,
getWidth() - 1, getHeight() - 1);
g2.setPaint(Color.yellow);
g2.fill(rect);
g2.setPaint(Color.blue);
g2.draw(rect);
}
public Dimension getMinimumSize()
{
return new Dimension(10, 10);
}
}

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
contentPane.add(new JLabel(
"<HTML><H1><I>Core Java</I></H1><HR>"
+ "By Cay Horstmann and Gary Cornell</HTML>"),
BorderLayout.CENTER);
// Ok button closes the dialog
JButton ok = new JButton("Ok");
ok.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
setVisible(false);
}
});
// add Ok button to southern border
JPanel panel = new JPanel();
panel.add(ok);
contentPane.add(panel, BorderLayout.SOUTH);
setSize(250, 150);
}
}

import
import
import
import

java.awt.Container;
java.awt.FlowLayout;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
/**
* @author DATAPRO
*

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();
c.setLayout(new FlowLayout());
d = new AboutDialog(this);
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d.show();
}
});
c.add(button);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300, 300);
this.show();
this.setResizable(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

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

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();
c.setLayout(new FlowLayout());

166

tf = new JTextField("Enter val", 10);


JButton b = new JButton("Tamam");
b.addActionListener(this);
c.add(tf);
c.add(b);
setSize(300, 80);
setResizable(false);
}
String getValue() {
show();
return entered;
}
public void actionPerformed(ActionEvent e) {
entered = tf.getText();
setVisible(false);
}
}

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class DialogTesFrame extends JFrame implements ActionListener {
Container c;
DialogTesFrame() {
c = getContentPane();
c.setLayout(new FlowLayout());
JButton dugme = new JButton("Dialog Goster");
dugme.addActionListener(this);
c.add(dugme);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(600, 600);
show();
}
public void actionPerformed(ActionEvent e) {
CustomDialog cd = new CustomDialog(this);
System.out.print(cd.getValue());
}
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();


fc.setCurrentDirectory(new File(.));
fc.setMultiSelectionEnabled(true);
//birden fazla dosya seimine izin verir.
fc.setFileSelectionMode(FileChooser.FILES_ONLY);
fc.setFileSelectionMode(FileChooser.DIRECTORIES_ONLY);
fc.setFileSelectionMode(FileChooser.FILES_AND_DIRECTORIES);
int result = fc.showOpenDialog(parent);
int result = fc.showSaveDialog(parent);
//JFileChooser.APPROVE_OPTION ya da JFileChooser.CANCEL_OPTION geri dnecektir.
String filename = fc.getSelectedFile().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 com.academytech.A ya da com.academytech.*;
...
A a = new A();
...
b) ...
com.academytech.A a = new com.academytech.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 com.academytech.utils paketine ait olsun.
A_2 snf com.academytech. 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
--------A.java
com
|-------- academytech
|
|----------- utils
|
----|
A_1.java
|
|
|
|----------- messages
-------------A_2.java
A_1 ve A_2 snflarnn bildirimleri u ekilde yaplr:
/**** A_1.java ***/
package com.academytech.utils;
class A_1 {
}
/*** A_2.java ***/
package com.academytech.messages;
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 com.academytech.utils.A_1
Bu durumda A snf ierisinde A_1 ve A_2 nesneleri kullanabilmek iin A snfnn iinde:
/*** A.java ***/
import com.academytech.utlis.*;
import com.academytech.messages.*;
class A {

169

...
A_1 a = new A_1(...);
...
A_2 b = new A_2(...);
}

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:. A.java
# java classpath /home/academytech/javapaketleri:. A
Bu rnekte A.java com.academytech 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 A.java, B.java ve C.java dosyalar ile a.gif dosyasn ieren bir .jar arivi
oluturmak iin:
#jar cvf program.jar A.class B.class C.class a.gif
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 rt.jar byle bir arivdir.
Sonu olarak .jar arivleri bir programn ihtiya duyaca tm dosyalar barndran sktrlm bir dosyadr. Ayrca
arivin tm teknik bilgilerini barndran MANIFEST.MF dosyas da arivin ierisinde yer alr.
Manifest Dosyasnn erii
/*** MANIFEST.MF ***/
Manifest-Version: 1.0
<arsivi tanimlayan satirlar>
Name: Person.class
<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 program.jar manifest.mf com/academytech/*.class A.class
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 program.jar

Konsolda basit bir uygulama:


1) Aadaki iki sinifi yaziniz.
import com.academytech.*;
class A {

public static void main(String arg[]) {


B b = new B();
b.show();
}
}

package com.academytech;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class B extends JFrame implements ActionListener {
Container c;
public B() {
c = getContentPane();
c.setLayout(new FlowLayout());
JButton b = new JButton("submit");
b.addActionListener(this);
c.add(b);
setSize(300, 400);
}
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "Merhaba");
}
public static void main(String arg[]) {
B b = new B();
b.show();
}
}

2) B.java snfn com/academytech dizini altna yerletiriniz. Daha sonra bu com dizinini yerletirdiniz
lokasyonu classpath olarak ayarlaynz.

172

3) Aadaki gibi manifest.mf dosyasn oluturunuz:


/*** manifest.mf ***/
Manifest-Version: 1.0
Main-Class: A
/***************/
NOT: Main-Class: A yazdktan sonra bir satr boluk brakldna dikkat
ediniz.
4) komut: java cvfm program.jar manifest.mf A.class com\academytech\B.class
5) sonuc: java jar program.jar

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:

Object next()
boolean hasNext()
void remove()

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 = c.iterator();
while(iter.hasNext()) {
Object obj = iter.next();

...
}
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.

Iterator iter = c.iterator();


Object obj = iter.next();

sradki eleman alnd.

174

iter.remove(); az once alnan eleman silindi.

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();

ogrenciler.add(Academytech);
ogrenciler.add(Caglar);
ogrenciler.add(Ahmet);

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 = ogrenciler.iterator();

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.

Object eskiDeger = iter.next();


iter.set(yeniDeger);

DEV:
Aadaki rnekte henz operasyonlar tanmlanmam olan Next, Previous, Add New Object ve Remove Object
metodlarn hazrlaynz ve program tamamlaynz.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import java.util.ListIterator;
import javax.swing.JButton;

175

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;

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) {
this.setSize(x_size, y_size);
this.setResizable(resizable);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
if(show)
this.show();

}
private void prepareComponents() {
c = getContentPane();

add_1 = new JButton("Add");


add_1.addActionListener(this);

176

list = new JButton("List All");


list.addActionListener(this);
next = new JButton("Next Object");
next.addActionListener(this);
previous = new JButton("Previous Object");
previous.addActionListener(this);
remove = new JButton("Remove Current Object");
remove.addActionListener(this);
add_2 = new JButton("Add New Object");
add_2.addActionListener(this);
tourPanel = new JPanel();
tourPanel.add(next);
tourPanel.add(previous);
tourPanel.add(remove);
tourPanel.add(add_2);
c.add(tourPanel, BorderLayout.SOUTH);
mainPanel = new JPanel();
mainPanel.add(list);
mainPanel.add(add_1);
c.add(mainPanel, BorderLayout.NORTH);
screen = new JTextArea();
screen.setEditable(false);
screen.setBackground(Color.BLACK);
screen.setForeground(Color.GREEN);
screen.setFont(new Font("Serif", Font.BOLD, 24));
c.add(screen, BorderLayout.CENTER);
}
private void prepareButton(JButton button, String button_name, ActionListener
listener) {
button = new JButton(button_name);
button.addActionListener(listener);
}

177

public void actionPerformed(ActionEvent e) {


if(e.getSource() == add_1) {
if(this.objectlist == null)
this.objectlist= new LinkedList();
if(this.objectlist.add(JOptionPane.showInputDialog(this, "New
Record")));
screen.setText("Yeni kayit eklendi...");
screen.validate();
}
else if(e.getSource() == this.list) {
StringBuffer buf = new StringBuffer("");
if(this.objectlist != null) {
ListIterator iter = (ListIterator)objectlist.iterator();
while(iter.hasNext())
buf.append("\n"+(String)iter.next());
}
else
buf.append("nothing is recorded yet!!!");
screen.setText(buf.toString());
screen.validate();
}
}
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

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

public class VectorTest extends JFrame {


public VectorTest()
{
super( "Vector Example" );
final JLabel status = new JLabel();
Container c = getContentPane();
final Vector v = new Vector( 1 );
c.setLayout( new FlowLayout() );
c.add( new JLabel( "Enter a string" ) );
final JTextField input = new JTextField( 10 );
c.add( input );
JButton addBtn = new JButton( "Add" );
addBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{

179

v.addElement( input.getText() );
status.setText( "Added to end: " +
input.getText() );
input.setText( "" );
}
}
);
c.add( addBtn );

// add the input value

JButton removeBtn = new JButton( "Remove" );


removeBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
if ( v.removeElement( input.getText() ) )
status.setText( "Removed: " +
input.getText() );
else
status.setText( input.getText() +
" not in vector" );
}
}
);
c.add( removeBtn );
JButton firstBtn = new JButton( "First" );
firstBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
try {
status.setText( "First element: " +
v.firstElement() );
}
catch ( NoSuchElementException exception ) {
status.setText( exception.toString() );
}
}
}
);
c.add( firstBtn );
JButton lastBtn = new JButton( "Last" );
lastBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
try {
status.setText( "Last element: " +
v.lastElement() );
}
catch ( NoSuchElementException exception ) {
status.setText( exception.toString() );
}
}
}
);
c.add( lastBtn );

180

JButton emptyBtn = new JButton( "Is Empty?" );


emptyBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( v.isEmpty() ?
"Vector is empty" : "Vector is not empty" );
}
}
);
c.add( emptyBtn );
JButton containsBtn = new JButton( "Contains" );
containsBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
String searchKey = input.getText();
if ( v.contains( searchKey ) )
status.setText( "Vector contains " +
searchKey );
else
status.setText( "Vector does not contain " +
searchKey );
}
}
);
c.add( containsBtn );
JButton locationBtn = new JButton( "Location" );
locationBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( "Element is at location " +
v.indexOf( input.getText() ) );
}
}
);
c.add( locationBtn );
JButton trimBtn = new JButton( "Trim" );
trimBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
v.trimToSize();
status.setText( "Vector trimmed to size" );
}
}
);
c.add( trimBtn );
JButton statsBtn = new JButton( "Statistics" );
statsBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( "Size = " + v.size() +
"; capacity = " + v.capacity() );
}
}

181

);
c.add( statsBtn );
JButton displayBtn = new JButton( "Display" );
displayBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
Enumeration enum = v.elements();
StringBuffer buf = new StringBuffer();
while ( enum.hasMoreElements() )
buf.append(
enum.nextElement() ).append( "

" );

JOptionPane.showMessageDialog( null,
buf.toString(), "Display",
JOptionPane.PLAIN_MESSAGE );
}
}
);
c.add( displayBtn );
c.add( status );
setSize( 300, 200 );
show();
}
public static void main( String args[] )
{
VectorTest app = new VectorTest();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 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

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

public class StackTest extends JFrame {


public StackTest()
{
super( "Stacks" );
Container c = getContentPane();
final JLabel status = new JLabel();
final Stack s = new Stack();
c.setLayout( new FlowLayout() );
c.add( new JLabel( "Enter a string" ) );
final JTextField input = new JTextField( 10 );
c.add( input );
JButton pushBtn = new JButton( "Push" );
pushBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( "Pushed: " +
s.push( input.getText() ) );
}
}
);
c.add( pushBtn );
JButton popBtn = new JButton( "Pop" );
popBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e
{
try {
status.setText( "Popped: " + s.pop()
}
catch ( EmptyStackException exception )
status.setText( exception.toString()
}
}
}
);
c.add( popBtn );
JButton peekBtn = new JButton( "Peek" );
peekBtn.addActionListener(
new ActionListener() {

183

)
);
{
);

public void actionPerformed( ActionEvent e )


{
try {
status.setText( "Top: " + s.peek() );
}
catch ( EmptyStackException exception ) {
status.setText( exception.toString() );
}
}
}
);
c.add( peekBtn );
JButton emptyBtn = new JButton( "Is Empty?" );
emptyBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( s.empty() ?
"Stack is empty" : "Stack is not empty" );
}
}
);
c.add( emptyBtn );
JButton searchBtn = new JButton( "Search" );
searchBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
String searchKey = input.getText();
int result = s.search( searchKey );
if ( result == -1 )
status.setText( searchKey + " not found" );
else
status.setText( searchKey +
" found at element " + result );
}
}
);
c.add( searchBtn );
JButton displayBtn = new JButton( "Display" );
displayBtn.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
Enumeration enum = s.elements();
StringBuffer buf = new StringBuffer();
while ( enum.hasMoreElements() )
buf.append(
enum.nextElement() ).append( " " );
JOptionPane.showMessageDialog( null,
buf.toString(), "Display",
JOptionPane.PLAIN_MESSAGE );
}
}
);
c.add( displayBtn );
c.add( status );

184

setSize( 675, 100 );


show();
}
public static void main( String args[] )
{
StackTest app = new StackTest();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
}
}

rnekte kullanlan peek isimli metod stack nesnesi zerinde herhangi pop

ilemi yapmadan en yukardaki

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.

import
import
import
import

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

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 );
display.setEditable( false );
JPanel northPanel = new JPanel();
northPanel.setLayout( new BorderLayout() );
JPanel northSubPanel = new JPanel();
northSubPanel.add( new JLabel( "First name" ) );
final JTextField fName = new JTextField( 8 );
northSubPanel.add( fName );
northSubPanel.add( new JLabel( "Last name (key)" ) );
final JTextField lName = new JTextField( 8 );
northSubPanel.add( lName );
northPanel.add( northSubPanel, BorderLayout.NORTH );
northPanel.add( status, BorderLayout.SOUTH );
JPanel southPanel = new JPanel();
southPanel.setLayout( new GridLayout( 2, 5 ) );
JButton put = new JButton( "Put" );
put.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
Employee emp = new Employee(
fName.getText(), lName.getText() );
Object val = table.put( lName.getText(), emp );
if ( val == null )
status.setText( "Put: " + emp.toString() );
else
status.setText( "Put: " + emp.toString() +
"; Replaced: " + val.toString() );
}
}
);
southPanel.add( put );
JButton get = new JButton( "Get" );
get.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
Object val = table.get( lName.getText() );
if ( val != null )

186

status.setText( "Get: " + val.toString() );


else
status.setText( "Get: " + lName.getText() +
" not in table" );
}
}
);
southPanel.add( get );
JButton remove = new JButton( "Remove" );
remove.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
Object val = table.remove( lName.getText() );
if ( val != null )
status.setText( "Remove: " +
val.toString() );
else
status.setText( "Remove: " +
lName.getText() + " not in table" );
}
}
);
southPanel.add( remove );
JButton empty = new JButton( "Empty" );
empty.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( "Empty: " + table.isEmpty() );
}
}
);
southPanel.add( empty );
JButton containsKey = new JButton( "Contains key" );
containsKey.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
status.setText( "Contains key: " +
table.containsKey( lName.getText() ) );
}
}
);
southPanel.add( containsKey );
JButton clear = new JButton( "Clear table" );
clear.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
table.clear();
status.setText( "Clear: Table is now empty" );
}
}
);
southPanel.add( clear );
JButton listElems = new JButton( "List objects" );

187

listElems.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
StringBuffer buf = new StringBuffer();
for ( Enumeration enum = table.elements();
enum.hasMoreElements(); )
buf.append(
enum.nextElement() ).append( '\n' );
display.setText( buf.toString() );
}
}
);
southPanel.add( listElems );
JButton listKeys = new JButton( "List keys" );
listKeys.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
StringBuffer buf = new StringBuffer();
for ( Enumeration enum = table.keys();
enum.hasMoreElements(); )
buf.append(
enum.nextElement() ).append( '\n' );
JOptionPane.showMessageDialog( null,
buf.toString(), "Display",
JOptionPane.PLAIN_MESSAGE );
}
}
);
southPanel.add( listKeys );
Container c = getContentPane();
c.add( northPanel, BorderLayout.NORTH );
c.add( new JScrollPane( display ), BorderLayout.CENTER );
c.add( southPanel, BorderLayout.SOUTH );
setSize( 540, 300 );
show();
}
public static void main( String args[] )
{
HashTableTest app = new HashTableTest();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 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.

Class.forName(COM.ibm.db2.jdbc.app.DB2Driver):
Bu bildirim yukardaki emada belirtilen JDBC Driver API katmannn ihtiya duyaca 3. parti srcy kayt etmek
iin

(yklemek

iin)

kullanlr.

halde

aslnda

bu

bildirim

iin

gerekli

olan

bu

COM.ibm.db2.jdbc.app.DBDriver) 3. parti veri taban reticileri tarafndan sunulmaldr.

189

src

(burada

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 mysql.jar olsun:

CLASSPATH = /bir/yer; ....; /home/drivers/ java/mysql.jar


Database URL
Database sistemde yklendikten ve yukardaki gibi src yklendikten sonra veri tabanna balanma aamasna
gelinmitir. Bu aamada balanmak iin kullanlan veri taban sistemine uygun bir URL ile balant kurulur. Bu
URLnin en genel hali:

jdbc:<alt protokol ismi>:<dier bilgiler>

eklindedir. Bu URL 3. parti veri taban sistemi tarafndan salanr. Bu url kullanlarak

Connection conn=DriverManager.getConnection(url, username, password);

Bilgisi ile veri tabanna JDBC API zerinden balant salanr.

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 = conn.createStatement();
Bu Statement nesnesi zerinde

int executeUpdate(String query):


st.executeUpdate(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

ResultSet rs = st.executeQuery(SELECT * FROM Books);


while(rs.next()) {
String name = rs.getString(Name);
...
}

Bylece ResultSet ierisine gelen her satr rs.next() ile elde edilirken bu satr ierisindeki her stun kendi adyla
birlikte rs.getString(<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 Books.mdb 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";

//Books veri taban ismi

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//Bu url JDBC-ODBC kprs iin gerekli
connection = DriverManager.getConnection(url, username, password );
} catch ( ClassNotFoundException cnfex ) {
System.err.println( "Failed to load JDBC/ODBC driver." );
cnfex.printStackTrace();
System.exit( 1 ); // terminate program
}
catch ( SQLException sqlex ) {
System.err.println( "Unable to connect" );
sqlex.printStackTrace();
System.exit( 1 ); // terminate program
}
Aadaki rnekte btnyle bu balant ve balant zerinde kullanlan sorgular
incelenmektedir.
import java.sql.*;

193

import
import
import
import

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

public class DisplayQueryResults extends JFrame {


// java.sql types needed for database processing
private Connection connection;
private Statement statement;
private ResultSet resultSet;
private ResultSetMetaData rsMetaData;
// javax.swing 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 {
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
connection = DriverManager.getConnection(url, username, password );
}
catch ( ClassNotFoundException cnfex ) {
System.err.println(
"Failed to load JDBC/ODBC driver." );
cnfex.printStackTrace();
System.exit( 1 ); // terminate program
}
catch ( SQLException sqlex ) {
System.err.println( "Unable to connect" );
sqlex.printStackTrace();
System.exit( 1 ); // terminate program
}
// If connected to database, set up GUI
inputQuery =new JTextArea( "SELECT * FROM Authors", 4, 30 );
submitQuery = new JButton( "Submit query" );
submitQuery.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e )
{
getTable();
}
}
);
JPanel topPanel = new JPanel();
topPanel.setLayout( new BorderLayout() );
topPanel.add( new JScrollPane( inputQuery),
BorderLayout.CENTER );
topPanel.add( submitQuery, BorderLayout.SOUTH );

194

table = new JTable( 4, 4 );


Container c = getContentPane();
c.setLayout( new BorderLayout() );
c.add( topPanel, BorderLayout.NORTH );
c.add( table, BorderLayout.CENTER );
getTable();
setSize( 500, 500 );
show();
}
private void getTable()
{
try {
String query = inputQuery.getText();
statement = connection.createStatement();
resultSet = statement.executeQuery( query );
displayResultSet( resultSet );
}
catch ( SQLException sqlex ) {
sqlex.printStackTrace();
}
}
private void displayResultSet( ResultSet rs )
throws SQLException
{
// position to first record
boolean moreRecords = rs.next();
// If there are no records, display a message
if ( ! moreRecords ) {
JOptionPane.showMessageDialog( 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 = rs.getMetaData();
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
columnHeads.addElement( rsmd.getColumnName( i ) );
// get row data
do {
rows.addElement( getNextRow( rs, rsmd ) );
} while ( rs.next() );
// display table with ResultSet contents
table = new JTable( rows, columnHeads );
JScrollPane scroller = new JScrollPane( table );
Container c = getContentPane();
c.remove( 1 );
c.add( scroller, BorderLayout.CENTER );
c.validate();
}

195

catch ( SQLException sqlex ) {


sqlex.printStackTrace();
}
}
private Vector getNextRow( ResultSet rs,
ResultSetMetaData rsmd )
throws SQLException
{
Vector currentRow = new Vector();
for ( int i = 1; i <= rsmd.getColumnCount(); ++i )
switch( rsmd.getColumnType( i ) ) {
case Types.VARCHAR:
case Types.LONGVARCHAR:
currentRow.addElement( rs.getString( i ) );
break;
case Types.INTEGER:
currentRow.addElement(
new Long( rs.getLong( i ) ) );
break;
default:
System.out.println( "Type was: " +
rsmd.getColumnTypeName( i ) );
}
return currentRow;
}
public void shutDown()
{
try {
connection.close();
}
catch ( SQLException sqlex ) {
System.err.println( "Unable to disconnect" );
sqlex.printStackTrace();
}
}
public static void main( String args[] )
{
final DisplayQueryResults app =
new DisplayQueryResults();
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
app.shutDown();
System.exit( 0 );
}
}
);
}
}

196

You might also like