Java for Kids – 12 July 20th, 2011
PENCERE OLAYLARI
Program çalışırken, kullanıcı, penceredeki bir butonu tıklayabilir ya da tarayıcı pencereyi yeniden şekillendirmeye çalışabilir bunun gibi olaylar gerçekleşebilir. Eminim ki; yaptığımız hesap makinemizdeki butonlara tıklamaktan sıkıldınız :) , makinemizdeki butonlar, boş butonlardır ve tıklandığında herhangi bir tepki vermemektedir. Ki insanlar ile bilgisayarların iletişime geçtiği ana durumdayız. Yani en heycanlı yeri!
Her bir pencere bileşeni, birkaç işlem yapabilir, ya da bizim deyimimizle(hani biz programcıyız ya) olayları dinleyebilir(listen). Programımız, pencere bileşenlerini Java sınıflarının dinleyicileri ile kaydeder. Dinleme işlerini(olayları) bileşenlerinize, yalnızca onlarla ilgili olan sınıflar ile dinletmelisiniz. Örneğin, kullanıcı fare imlecini, hesap makinesinin bir butonuna getirdiğinde, kullanıcının tam olarak nerde tıkladığı ve butonun üstünde ne kadar uzun süre basılı kaldığı önemli değildir. Bu sebepten, butona, MouseMotionListener sınıfını kaydetmemize gerek yoktur. Öte yandan bu dinleyici sınıfı (MouseMotionListener), bir çok çeşit çizim programı için çok kullanışlıdır.
Makinemizin butonları, buton tıklama olaylarıyla ilgili olan ActionListener sınıfıyla kaydedilmelir. Tüm bu dinleyiciler, özel Java sınıflarıdır ve arayüzler(interface) olarak adlandırılırlar.
Arayüzler / Interfaces
Sınıfların birçoğu, çeşitli eylemler yapan metotlar tanımlarlar, örneğin, butona basıldığında ne olacağı, fare hareketlerinde ne olacağı vs. gibi. Böyle eylemlerin birleşimine, sınıf davranışı (class behavior) adı verilir.
Arayüzler, kodlanmayan, kısmi eylemler yapabilen özel sınıfların ismidir, örneğin,
interface MouseMotionListener{
void MouseDragged (MouseEvent e);
void MouseMoved (MouseEvent e);
}
Görebildiğiniz gibi, MouseDragged() ve MouseModev() metotlarında herhangi bir kod yok, sadece interface içinde tanımlandılar ve MouseMotionListener olarak adlandırıldılar. Eğer sınıfınızın, fare hareket etmeye başladığında ya da sürüklendiğinde, tepki/cevap vermesi gerekiyorsa, bu arayüzü uygulamalıdır(implements). implements kelimesi/komutu; bu sınıfın metotlarının kesinlikle olacağını ve bu interface içinde tanımlayacağını belirtir, örneğin:
import java.awt.event.MouseMotionListener;
class DrawingPad implements MouseMotionListener {
//programımızın kodları
MouseDragged(MouseEvent e){
//Fare sürüklendiğinde programımızın vereceği tepki ya da yapacağı işlem
}
MouseMoved (MouseEvent e){
// Fare hareket ettirildiğinde programımızın vereceği tepki ya da yapacağı işlem
}
}
Burada interface’i tanımlamadık ancak eclipse bize uyarı verecek ve bunu bizim yerimize yapacak ayrıca kullandığımız metotları override edeceğimiz için bu konuda da yardımcı olacak, metotların başına @Override koyacak. Büyük bi olay değil ve fakat o olmadan olmuyor.
import java.awt.event.MouseMotionListener;
interface MouseMotionListener{
void MouseDragged (MouseEvent e);
void MouseMoved (MouseEvent e);
}
class DrawingPad implements MouseMotionListener {
//programımızın kodları
@Override
public void MouseDragged(MouseEvent e){
//Fare sürüklendiğinde programımızın vereceği tepki ya da yapacağı işlem
}
@Override
public void MouseMoved (MouseEvent e){
// Fare hareket ettirildiğinde programımızın vereceği tepki ya da yapacağı işlem
}
}
interface oluştururken, kod yazma sıkıntısı çekmediğimiz için şaşırmış olabilirisiniz. Bunun sebebi, bir interface oluşturulduğunda, birçok sınıf tarafından tekrar kullanılabilir. Eğer JVM ya da bir sınıf, cizimTahtam sınıfını gördüğünde, MouseMotionListener interface ‘i uygulamaya geçirir, ve bu sınıfın kesinlikle fareSurukle() ve fareHareket() metotlarını içerdiğini bilir. Kullanıcı fareyi hareket ettirdiği zaman, JVM fareHareket() metodunu çağıracak ve metoda yazdığımız kodu çalıştıracak. Şimdi her programcının fare hareketi metoduna farklı isimler koyduğunu düşünelim, (movedMouse(), fareHareketEtti() vs.) gibi, bu durumda JVM karmaşaya düşecek ve hangi metodu çağıracağını bilemeyecek. ( Bu yüzden, mouseMoved() ve mouseDragged() kullanacağız. )
Bir Java sınıfı, birden çok interface uygulayabilir, örneğin fare hareketlerine ve tıklamaya cevap vermeli:
Burda eclipse bize çok yardımcı oluyor, class’ın başındaki “olmadı bu” uyarısına tıklayıp “quick fix” seçeneğini tıklayalım. Burda karşımıza olması gereken çözümler getiriyor eclipse, bunlardan uygun olanları seçiyoruz ama tek tek. Java’daki deneyimimiz arttıkça bu quick fix şekerciği bizim çok seveceğimiz bir arkadaşımız olacak. Hata uyarsını tıklıyoruz ve quick fix penceresinden öncelikle “import MouseMotionListener” seçeneği tıklıyoruz ve eclipse hızlı bir şekilde programımıza gerekli sınıfı (MouseMotionListener) import ediyor. Hata uyarısı kaybolmadı farkettiysek! Çünkü daha devam edeceğiz, tekrar uyarıyı tıklayıp quick fix penceresinden “add unimplemented methods” seçeneğini tıklıyoruz ve eclipse teşekkür ediyoruz. Aynı 2 işlemi “ActionListener” sınıfı için de yapıyoruz.
Java ile gelen interface’leri öğrendikten sonra, kendi interfacelerimizi de oluşturabileceğiz, fakat bu konu ileri seviye olduğu için şu an buna değinmeyeceğiz. Kitapta öğrendik diyor ama tüm interface’leri öğrenmedik, sadece ne olduğunu, nasıl kullanacağımızı öğrendik. Tavsiyem google’dan yardırın! :)
Action Listener
Şimdi hesap makinemize geri dönüyoruz. Eğer, geçen bölümde verdiğim ödevleri tanımladıysanız (özellikle makinemize +,-,*,/ koymayı) görsel kısmı tamamladınız demektir (Ödevi yapmadıysanız bile ben yapılmış halini vereceğim). Şimdi Listener sınıfı oluşturacağız ve kullanıcı tıkladığında gerçekleşecek olayları butonlara tek tek atayacağız. Aslında biz Listener sınıfı oluşturmadan, aynı sınıf içinde de listener komutlarını kodlayabiliriz, fakat iyi programcılar (yani biz!) görsel ve işlem gibi farklı işleri, ayrı sınıflarda yaparlar.
Şimdi calculatorEngine (ya da istediğiniz bir isim) isminde bir sınıf oluşturuyoruz. Ve bu sınıf, kesinlikle java.awt.ActionListener interface i implements etmeli ve actionPerformed(ActionEvent) metodunu tanımlamalı. Kullanıcı butonlara tıkladığında, JVM bu interface metodunu çağırmalı ve uygulamalı.
Aşağıdaki gibi basit bir sınıf oluşturun:
Bu sınıfın sonraki sürümünde, actionPerformed() metodundan bir “mesaj kutusu” görünecek. JOptionPane ve showConfirmDialog() metodu ile isteğimiz mesajı görüntüleyebiliriz. Biraz ilerde bir örneğimiz var, ki hepimiz biliyoruz bunu Windows’un bazı durumlarda “doynk”, “dınks” ve türevleri seslerle çıkardığı kutucuk mesajlarından. Onları kullanacığız. Tabi ben linux kullandığım için daha karizmatik! görünecek o ayrı :)
showConfirmDialog() metodunun farklı çeşitleri vardır, biz burada 4 argümanlı olan birini kullanacağız. Aşağıdaki kodda, null bu mesaj kutusunun, ata penceresinin olmadığı anlamındadır, ikinci argüman ise, mesaj kutusunun başlığıdır, üçüncü mesaj, dördüncü buton seçmemize/tıklamamıza izin vermektedir. (PLAIN_MESSAGE sadece bir OK butonu olduğu anlamına gelmektedir.)
Sonraki kısımda, hesap makinemizi nasıl derleyip çalıştıracağımızı açıklayacağım ve Mesaj Kutusunu görüntüleyeceğiz.
ActionListener ile Bileşenleri Kaydetmek
Kim, ne zaman actionPerformed() metdounu çağıracak? Bu metodu JVM çağıracak tabi biz CalcutaorEngine sınıfına, bu butonları kaydedersek ya da linklersek (bağlama işlemi). Şimdi Calculator sınıfımızın yapıcı metodunun sonuna 2 satırlık şu kodu ekleyin;
CalculatorEngine calcEngine = new CalculatorEngine(); //sınıfımızdan bir örnek (instance) üretiyoruz button0.addActionListener(calcEngine);//button0 bileşenimize actionListener atıyoruz ve parametre olarak ürettiğimiz calcEngine sınıfını veriyoruz.
Çalıştırdığımızda, hesap makinemizin 0 butonuna basınca kutucuk mesajı çıkacak. Hatta makinemizin diğer tuşlarına da bu actionListener’i ekleyelim. Herhangi bir tuşa basıldığında da kutucuk mesajımız görüntülensin.
button1.addActionListener(calcEngine); . . . buttonEsittir.addActionListener(calcEngine);
Bir Olayın Kaynağı Nedir?
Şimdi listener/dinleyicimizi biraz daha zekileştireceğiz, her buton için farklı mesaj kutuları gösterecek. Bir eylem olayı olduğunda, JVM listener sınıfımızdaki, actionPerformed(ActionEvent) metodunu çağıracak ve ActionEvent deki argüman hakkında bilgi sağlayacak. Bu bilgiyi, uygun metodu çağırarak elde edebileceğiz.
Kalıplama (Casting)
Sıradaki örnekte, hangi butona basıldığını, getSource() metodununu çağıran kaynağı, ActionEvent sınıfının e değişkenin bu nesneyi bilgisayarın hafızasında nerde referans ettiğini bulacağız. Bu işlem, java dökümantasyonuna göre, olayın kaynağını bir nesne döndürüyor ki java’nın tüm pencere bileşenleri için bu işlem böyle yapılıyor.
Bu şekilde bunu tüm bileşenler için çalışan, genel (global-evrensel) metot olarak yapılabilir. Ama şunu kesin olarak biliyoruz ki, penceremiz için bir olaya yalnızca butonlarımız sebep olabilir! Bu yüzden geri dönen nesnemiz olan basılan buton için bir şekil oluşturacağız ( basılan butona bir rol atayacağız).
İşte kalıplamanın mantığı burda yatıyor. Java, olay kaynağını bir nesne örneği üzerinden işliyor. Kalıplama işlemi ise “(BileşenTipi)” eklenerek yapılıyor.
JButton clickedButton = (JButton) evt.getSource();
getSource() metodundan bir nesne geri döndüğü halde eşitliğin sol tarafında bir JButton tanımlıyoruz, JVM ye “ merak etme, JButton un bir örneğini aldığımı biliyorum “ demiş oluyoruz.
Yalnızca, JButtondan nesne kalıbını yaptıktan sonra, JButton sınıfına ait olacak olan getSource() metodunu çağırabileceğiz.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;
public class CalculatorEngine implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
JButton clickedButton = (JButton) e.getSource();//olayın kaynağını kalıplayarak alıyoruz
String clickedButtonLabel = clickedButton.getText();//olay kaynağının etiketini alıyoruz
JOptionPane.showConfirmDialog(null, "Basılan tuş: " + clickedButtonLabel, "Just a test!", JOptionPane.PLAIN_MESSAGE);
}
}
Pencere olayları bölümünde yapacağımız birkaç işlem daha var, ancak saat geç oldu ve yarın okul var :)
Herhangi bi ‘t’ anında görüşmek üzere, hepimize iyi çalışmalar!
Posted in Java, Java for Kids - Çeviri, programlama | 1 Comment »
Java for Kids – 2 May 24th, 2010
ECLIPSE ile Başlıyoruz
IDE olarak hem kolay kullanılabilen hem de ücretsiz olan Eclipse’i kullanacağız. Buradan Eclipse‘i indirebilirsiniz. Eclipse portable olarak geliyor. Bilgisayarımızda JVM yüklü ise, direkt olarak Eclipse simgesini tıklayarak çalışma alanınızı “Workspace” seçip hemen başlayabiliyoruz. Bu bölümde Eclipse ‘ i kullanarak hızlıca program oluşturmayı ve çalıştırmayı göstereceğim. Ayrıca Eclipse de Help -> Help Contents ve Java Development User Guide tıklayarak güzel bir ders bulabilirsiniz. (fakat İngilizce ) Kodlamaya başlamak için ilk olarak bir proje oluşturmanız gerekiyor. Bunu yapmak için Eclipse ‘ de menüden File > New > Java Project,
projemizi isimlendiriyoruz, örneğin; ilkprojem ve Finish butonunu tıklıyoruz.
Sonra oluşturduğumuz projede sağ tıklayarak sırayla bir package bir class oluşturuyor ve isimlendiriyoruz.
Package bizim sınıflarımızın toplandığı paket ya da kutu olarak düşünülebilir, sınıflar ise kodları yazacağımız ve derlenecek olan kısım. (İlerledikçe daha iyi anlaşılıyor.)
package paket;
public class merhabadunya {
public static void main ( String Args[] ){
System.out.println("Merhaba Dünya!");
}
}
yazıp, run project diyoruz.
Basitçe Eclipse de dosya oluşturmayı öğrendiniz, yakında Java ile ilgili uygulamalara geçiyoruz.
Posted in Java, Java for Kids - Çeviri, programlama | No Comments »






