Yıllar önce ben üniversitede öğrenciyken (sanırım
1996 veya 1997 yılıydı) değerli bir sınıf arkadaşımı ziyarete gitmiştim. Kendisi
bilgisayar teknolojilerine son derece ilgili birisiydi ve bu anlamda ortak pek
çok yönümüz vardı. O yıllarda ikimizde, özellikle görsel programlamaya yönelik
yazılım geliştirme ortamlarına ilgi duyuyorduk. O günkü ziyaretimde, dostumun
elinde o güne kadar gördüğüm en kalın kitap duruyordu. Sanırım o zamanlar gözüme
çok büyük gözükmüştü. Öyleki o güne dek hiç 900 sayfalık bir bilgisayar kitabı
görmemiştim. Oysaki şimdi o 900 sayfalık kitapları arar oldum. En son çalıştığım
bilgisayar kitabı 1500 sayfaya yakın olunca, insan ister istemez özlüyor.
Neyse sözün kısası, arkadaşımın elinde tuttuğu
kitap, ingilizce bir bilgisayar kitabıydı ve Java diye bir şeyden bahsediyordu.
Oha falan oldum yani der gibi arkadaşımın gözlerine baktım. Çünkü ilk aklıma
gelen StarWars serisindeki Java olmuştu. Hemen ne demek
istediğimi anladı ve anlatmaya başladı. Java'nın yeni bir programlama dili
olduğunu, C++'ın syntax'ına çok benzer yer yer aynı yazımları kullandığını ancak
işin içinde platform bağımsızlığın yer aldığını söyledi. O zamanlar bende
pek çok kişi gibi platform bağımsız kısmına geldiğinde, hafif bir tebessümle
hadi canım demiştim. Çok geçmeden bana kitabın ilk kaynak uygulamsından
geliştirdiği kodu gösterdi. Burada komik bir çizgi karakter (kırmızı burunlu) bir internet explorer
penceresinde bir oraya bir oraya taklalar atıyordu. Bu nedir diye sorduğumda
bana bunun bir Applet olduğunu ve browser'ın üzerinde dinamik olarak yerel
makinede çalıştığını söyledi. O zamanlar elbetteki browser üzerinde çalışan
dinamik uygulamalara hiç aşina değildim.
Java dilini öğrenmeye başladığımda, günün birinde
bu değerli arkadaşımı hatırlayacağımı ve kulaklarını çınlatacağımı biliyordum.
Artık o zamanlar söyledikleri şimdi kulağıma daha teknik olarak geliyor. Eeee ne
demişler "geç olsunda güç olmasın". İşe appletlerin ne olduğunu
kavramak ile başlamam gerekiyordu. Daha sonraki kahve molalarımda ise appletleri
kullanıcı ile dinamik olarak etkileşime sokmaya çalışacaktım. Ama önce teknik
bilgi ve basit kodlara ihtiyacım vardı. Tabiki appletin basit bir tanımından
sonra.
Bir applet, istemci uygulamada yada başka bir
deyişle yerel makinede, Java Virtual Machine'e sahip herhangibir tarayıcıda
(browser)
derlenerek çalıştırılan dinamik bir java programcığından başka bir şey değildir.
Applet'leri normal java programları yazar gibi java dosyaları olarak yazar ve
javac aracı ile class olarak byte-code'a çeviririz. Tek
fark, bu program parçalarının, tarayıcıdan talep edilmeleri halinde, tarayıcının
sahip olduğu JVM sayesinde derlenerek bu tarayıcının yer aldığı yerel makinede
dinamik olarak çalışacak olmalarıdır. Dolayısıyla normal java byte kodları gibi,
bu kodlarda çalıştırıldıklarında derlenirler. Ancak çalışma sistemleri,
içerdikleri olay yapıları konsol veya görsel arabirime sahip java
uygulamalarından biraz daha farklıdır. Herşeyden önce, tarayıcıda çalıştıkları
için, belirli bir alan içerisinde çizilebilirler yada kullanılabilirler. Bununla
birlikte dinamik çalışmaya müsait oldukları için aşağıdaki olayları
gerçekleştirmelerine, yerel makinelerin güvenliği açısından izin verilmez.
| Applet'lere Özgü
Kısıtlamalar |
| Yerel
makineden (çalıştıkları makine) dosya kopyalayamazlar. |
| Dosya
silemezler. |
| Dosya
açamazlar veya oluşturamazlar. |
|
İndirildikleri sunucudan başka bir sunucu ile herhangibir ağ bağlantısı
kuramazlar. |
|
İndirildikleri bilgisyarda başka programları çalıştıramazlar. |
| Dosya
sistemine erişemezler veya okuyamazlar. |
Applet'lerin çalışması ile ilgili olarak en dikkat
çekici nokta, çağırıldıkları sunucudan istemci bilgisayarın tarayıcısına
indirilmeleridir. Nitekim, bu işlemin gerçekleştirilmesi için, applet'e ait
class dosyasının bir şekilde html kodu içerisine gömülmesi gerekecektir. Bunun
nasıl yapıldığını görmek için öncelikle bir applet geliştirmek gerektiği
kanısındayım. Ne kadar basit olursa olsun en azından nasıl çalıştığını görmem
gerekiyor. Kaynaklarımı inceledikten sonra, aşağıdaki gibi bir örnek java
dosyasını oluşturdum.
import java.awt.*;
import java.applet.Applet;
public class IlkApplet extends Applet
{
public void Paint(Graphics g)
{
g.drawString("Yihuuu",50,50);
}
} |
Burada oluşturduğum java dosyasını javac ile
derlediğimde herhangibir sorun ile karşılaşmadım. Peki ama kodum ne yapıyordu?
Herşeyden önce ilk dikkatimi çeken, kullanılmak üzere eklediğim awt ve applet
paketleriydi. Awt paketini ileride detaylı incelemeyi düşünüyordum zaten. Ancak
yinede ön bilgiye ihtiyacım vardı. Awt paketi içerisinde, java ile
kullanabileceğimiz görsel arayüzlere ait nesneler için bir çok sınıf
bulunuyordu. Applet'lerde sonuç itibariyle, tarayıcı penceresinde
çalışacaklarından, kullanıcılar ile görsel iletişim sağlamamıza yarayacak
buton,textbox gibi nesneler içerebilirdi. İşte bu amaçla awt paketi vardı.
Gerçi kullandığımız bir nesne yok gibi gözükebilir ancak, Graphics sınıfı awt
paketi içerisinde yer alan ve appletin çalıştığı alan içerisine bir şeyler
çizmek için (örnekte olduğu gibi yazı yazmak için mesela) kullanılan bir
sınıftır.
Diğer önemli bir kavramda, sınıfın Applet
sınıfından türetilmiş olmasıydı. Bu, yazılan java sınıfının bir applet olarak
değerlendirileceğini belirtmekteydi. Dolayısıyla applet sınıfından bir takım
özellikleri kalıtımsal olarak alacağımız kesindi. Gelelim, Paint metoduna. İşte
işin en can alıcı noktası burasıydı. Bu metod, tarayıcı pencersinde, appletin
çalıştığı alana birşeyler çizmek için kullanılıyordu. Daha doğrusu applet,
sınırları ile birlikte tarayıcı penceresinde çizilmeye başladığında çalışıyordu.
Artık, değerli dostumun tarihi java kitabındaki kırmızı burunlu kahramanın nasıl
taklalar attığını daha iyi anlamaya başlamıştım. O zamanlar çizgi filim gibi
gelmişti. Ancak şimdi gerçeğin ta kendisi karşımdaydı. Peki şimdi ne olacak? Bir
şekilde yazdığım appleti test etmem gerekiyor. İlk aklıma gelen ancak denemek
istemediğim şeyi deneyerek işe başladım. Şöyleki,

Böyle birşeyin başıma geleceği kesindi
diyebilirim. Elbetteki appletin çalışma sistemine bakıldığında farklı şekilde
uygulanmaları gerekirdi. Her şeyden önce, bu applet bir tarayıcıya indirilecek
ve oradaki JVM tarafından derlenecekti. Bunu test etmenin iki yolu vardı.
Birincisi bir applet tagı ile bu sınıfı bir html sayfasına koymak yada Applet
Viewer aracını kullanmaktı. İlk önce applet tagını aşağıdaki gibi denedim. Bunun
için applet sınıfım ile aynı klasörde olan bir html sayfası hazırladım.
<html>
<head>
<meta http-equiv="Content-Language" content="tr">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<title>New Page 1</title>
</head>
<body>
<APPLET CODE="IlkApplet.class" WIDTH="500" HEIGHT="200">
</APPLET>
</body>
</html> |
Applet tagı içinde en önemli kısım CODE anahtar
kelimesinin olduğu kısım idi. Burada, belirtilen 500 piksel genişlik ve 200
piksel yüksekliğindeki alanda hangi applet sınıfının çalıştırılacağını
belirtiyorduk. Şimdi oluşturduğum bu html sayfasını tarayıcıda açtım. Ancak hiç
beklemediğim aşağıdaki sonucu elde ettim.

500 piksel'e 200 piksellik bir alan açılmıştı.
Ancak yazmak istediğim yazıyı görememiştim. Bunun tek nedeni olabilirdi. JVM, ya
sınıf dosyasını derlememişti yada appet sınıfını tarayıcı penceresine
indirememiştim. Tabi bir diğer ihtimalde tarayıcının özelliklede Microsoft
Internet Explorer olduğu için, JVM desteğinin kaldırılmış olabileceğiydi. Aklıma
ilk gelen en güncel java plug-in indirmek oldu. Ancak daha öncesinde en azından
yazdığım appletin doğru olup olmadığından emin olmalıydım. Neyseki, java'nın
appletviewer aracı yardımıma yetişti. Komut satırında aşağıdaki satır ile
appletimin çalışmasının sonucunu gördüm. Applet Viewer programı, yazılmış olan
appletlerin tarayıcı penceresine ihtiyaç duyulmadan çalıştırılabilmelerini
sağlıyordu.


Evet appletim çalışmıştı. Applet viewer bir
applet'i test etmek için ideal bir yoldu. Ama kafam halen daha internet explorer
tarayıcısında neden çalışmadığındaydı. Hemen internete girdim ve java plug-in
için en güncel sürümü aradım.
http://java.sun.com/products/plugin/reference/codesamples/index.html
Bu adreste örnek java appletleri vardı. En son
sürüme ait olanlardan bir tanesini çalıştırmak istediğimde, JVM için gerekli
sürümü yüklemek isteyip istemediğimi sordu. Tabiki bunu istiyordum. Hemen
yükledim. Hemen derken yüklemek biraz zaman aldı tabiki ama sonuça herşey yoluna
girdi. Bu işlemin sonucunda html sayfamı tarayıcıdan tekrar çalıştırdığımda
aşağıdaki sonucu elde ettim.

Appletim html sayfasından da çalışmıştı. Harika.
Bu appletin ardından daha gelişmiş bir applet yazmam gerektiğini düşünüyordum ki
karşıma appletlerin çalıştırıldığında gerçekleşen olayların bir listesi
geliverdi. Bir applet çalıştırıldığında aslında aşağıdaki olaylar
gerçekleştiriliyordu.

Görüldüğü gibi bir appletin çalışması sırasında
işleyen 4 temel olay var. Bu metodlardan ilki init metodu, applet tarayıcı
bilgisayara indirildiğinde çalıştırılmaktadır. Start metodundaki kod satırları ise applet çalışmaya
başladığında tetiklenir. Stop metodunda yer alan kodlar, appletin bulunduğu sayfadan
başka bir sayfaya atlandığında dolayısıyla applet kapatıldığında çalıştırılır.
Destroy metodundaki kodlar ise, tarayıcı penceresi kapatıldığı sırada
çalıştırılır. Elbette birde paint metodumuz var. Bu metod ile, appletin
içerisinde tarayıcı penceresinde belirlenen alanlarda birşeyler çizdirmek için
kullanacağımız kodlar yer alır. Diğer yandan, kullanıcı ile etkişim halinde olan
appletlerde, kullanıcının tepkisine göre applet üzerinde yapılacak yeni çizimler
repaint isimli metodlar içerisinde gerçekleştirilir.
Şimdi bana bu metodların bir appletin çalışması
sırasında nerelerde devreye girdiğini gösterecek bir örnek gerekliydi. Hemde
appleti biraz daha geliştirmiş olurdum. Bu amaçla kaynaklarımdan edindiğim
bilgiler ışığında aşağıdaki gibi bir java applet sınıfı oluşturdum.
import java.awt.*;
import java.applet.Applet;
public class IlkApplet extends Applet
{
public void init()
{
setBackground(Color.yellow);
System.out.println("Applet
yuklendi...");
}
public void paint(Graphics g)
{
g.drawString("paint",50,50);
}
public void start()
{
System.out.println("Applet
calistirildi...");
}
public void stop()
{
System.out.println("Applet
sonlandirildi...");
}
} |
Bu applet sınıfını derleyip appletviewer ile
çalıştırdığımda ilk olarak aşağıdaki görüntüyü elde ettim.

Görüldüğü gibi ilk önce init metodu devreye girdi.
Ardından applet'in start
metodunda yer alan kodlar çalıştırıldı ve sonrasında ise paint metodundaki
kodlar devreye girdi. Çalışan bu applet'i Appet Viewer'ın Applet menüsünden stop
komutu ile durdurduğumda ise aşağıdaki ekran görüntüsünü elde ettim.

Bu kez applet'in stop metodundaki kodlar devreye
girmişti ve applet'in çalışmasıda sona ermişti. Applet'lerin çalışma sistemini
anladıktan, yaşam süresi boyunca çalıştıracağı metodları ve gerçekleşen olayları inceledikten ve bir
buçuk satırlık applet kodu yazdıktan sonra, daha işe yarar bir örnek görmek
istiyordum. Hatta yazmak istiyordum. Ancak işe yaramasa bile beni etkilyebilecek bir örnek
bulmanın daha iyi olacağı kanısına vardım. Bu
amaçla Sun'ın sitesinden örnek appletlere baktım.
http://java.sun.com/products/plugin/1.5.0/demos/plugin/applets/MoleculeViewer/example2.html
Bu adreste yer alan applet'i güzelce bir
inceledim. Applet'te yapılması gereken, mouse'a
basılı tutup şekli herhangibir yöne doğru sürüklemeye çalışmaktı. Açıkçası bu
applet'e bakınca ve şu an java dilinde bulunduğum yeri düşününce kendi kendime
şöyle dedim. "ÇOOOOK ÇALIŞMAM LAZIMMM. ÇOOOOKK!!!". Neyseki önümüzdeki hafta
boyunca, java appletlerinde awt sınıfına ait GUI nesnelerini kullanarak
kullanıcılar ile nasıl dinamik etkileşime geçileceğini öğrenmeye çalışacağım.
Artık dinlenmenin tam zamanı. Kahvemde bitmiş zaten.
Burak Selim ŞENYURT
selim@bsenyurt.com