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 »
Bir Programlama Macerası! August 1st, 2010
Fizik bölümü öğrencisiyim ve 2. sınıfta tırttan bir “programlama” dersi aldım, c ile programlama. Afedersiniz ama o derste hiç bi halt öğrenmedim. Programlama adına yani. Sadece bir dönem boyunca haftada 6 saatimin boşa geçtiğini öğrendim sonradan.
“Bu bana yetti mi?” diye sordum kendime her zamanki cevabı alacağımı bildiğim halde.
“Tabi ki hayır”, yapabileceksem her zaman bir adım daha atarım, bazen istemediğim halde atarım bu tarz adımlar, oğlak burcunun etkisi, bu adımlardan şimdiye kadar pişman olmadım, hayatımın geri kalanında da olmayı düşünmüyorum :)
Özellikle programlama adına böyle adımlar atmak çok işime yaradı.
Sonra okulumda bilgisayar mühendisliği bölümüne gidip orda java dersleri veren bir hoca ile görüştüm. Sağolsun kırmadı, kabul etti, 3 sınıf mühendis öğrencilerle beraber derslere girdim, gayet de anladım, kendi kendime bişeyler yapabiliyorum.
Temel Java, OOP ve JSP öğrendim, sonra kendime tekrar sordum :
“-Bu bana yetti mi?”
“-Tabi ki hayır.”
Evde J2ME öğrenmeye başladım, nede olsa temel Java biliyorum, ne kadar zor olabilir ki diye düşündüm, 2 – 3 döküman sonrasında ciddi yol kat ettiğimi gördüm, ilk aşamada türkçe dökümanlar okudum, haliyle “bu da yetmedi” diyerek ingilizce dökümanlara gömüldüm. Halen de tırmalamaktayım :)
Mutluyum, java öğrendikten sonra bambaşka bi adam oldum resmen :)
Bir kaynak bulup düzenli bir şekilde çalıştıktan sonra hızlıca öğrenilebilen bir dil Java, ayrıca çok da güzel, kendisine kucak dolu sevgilerimi iletip yanaklarından öpüyorum.
Ayrıca Java dilinin babası sayılan James Gosling’i de dayım kadar sevdim, Türkiye’ye gelirse kendisine iskender ya da adana-şalgam-bici üçlüsündenısmarlayıp kendi çapımda teşekkür etmeyi düşünüyorum :)
Bu sıralar Android ile uğraşmayı düşünüyorum, yakında Android ile ilgili yazılar da yazacağım…
Java for Kids – 9 June 6th, 2010
Layout Manager (Yapılandırma Yöneticileri)
Eski moda programlama dilleri, bizi pencere bileşenlerinin boyutunu ve kesin koordinatlarını ayarlamaya zorluyordu. Eğer sizin programınızı kullanacak olan bütün insanların ekran çözünürlüğünü (resolution) bilseydik gerçekten iyi bir iş olurdu. Bu arada, insanlar diye bahsettiğim sizin programınızı kullanacak olan kullanıcılar :) . Java pencere kontrollerinin kesin yerini atamaya gerek kalmadan, ekran üzerindeki bileşenlerinizi düzenlemeye, yerleştirmeye yardımcı olacak bir yapılandırma yöneticisine(layout manager) sahiptir. Layout manager kullanıcı ekranının pencere boyutları ne olursa olsun güzel bir görüntü sağlayacaktır.
Swing aşağıdaki Layout Managerleri içerir;
- FlowLayout
- GridLayout
- BoxLayout
- BorderLayout
- CardLayout
- GridBagLayout
Hangi layout manager’i kullanırsanız kullanın, bir programın gereksinimi olan bir örneğiyle desteklersiniz ve sonra bu nesneyi bir container’a atarsınız, örneğin simpleCalculator sınıfındaki panel’e atamak gibi.
Flow Layout
Bu layout bir penceredeki bileşenleri satır satır düzenleme matığıyla çalışır. Örneğin; labellar, textfieldlar, ve butonlar ilk olarak sanal bir satır olduğu varsayılarak sırayla eklenir. Daha sonra aktif olan satır dolduğunda, bu bileşenler alt sanıra geçilerek eklenir, bu şekilde devam eder. Eğer bir kullanıcı pencere boyutunu değiştirirse işte o zaman layout işi batırır.
Programımızın çalıştığı pencereyi, köşesinden tutup boyutunu değiştirin ve java.awt.FlowLayout managerin nasıl çalıştığına bakın.
Köşesinden tutup uzattığımızda;
şekline geliyor ki bunu FlowLayout sağlıyor.
Şimdiki kod örneğinde ise, this komutu, simpleCalculator nesnesinin bir örneğini gösterir.
FlowLayout fl = new FlowLayout(); windowContent.setLayout(fl);
FlowLayout, hesap makinemiz için en iyi seçim değil, farklı bir şey deneyelim.
Grid Layout
java.awt.GridLayout sınıfı bize, bileşenlerimizi bir ızgara içinde, satırlar ve sütunlar içinde yerleştirmemizi sağlar. Bileşenlerimizi, ızgara içindeki bu hücrelere hayali olarak yerleştireceğiz. Kullanıcılar ekran ayarlarını değiştirirlerse, ızgaranın hücreleri de buna göre değişecektir, fakat birbirlerine göreli durumları, yerleri aynı kalacaktır. Bizim hesap makinemizde 7 farklı bileşen bulunmaktadır, üçer etiket ve alan, bir de buton. Bunları 4 satır ve 2 sütunluk bir ızgaraya yerleştirebiliriz (bir hücre boş kalacak).
GridLayout gl = new GridLayout(4, 2); windowContent.setLayout(gl);
Hücreler arasına 5er piksellik yatay ve dikey boşluklar da ekleyebiliriz.
GridLayout gr = new GridLayout(4,2,5,5);
Hesap makinemize küçük değişiklikler yaptıktan sonra, aşağıda ki gibi daha güzel bir şekil vermiş olacağız.
Şimdi, simpleCalculatorGrid adında bir sınıf daha oluşturup kodları yazın ve derleyin.
package pack2;
import javax.swing.*;
import java.awt.GridLayout;
public class simpleCalculatorGrid {
public static void main(String[] args) {
// bir panel (pano) oluşturuyoruz
JPanel windowContent = new JPanel();
// bu pano için bir yapılandırma yöneticisi oluşturalım
GridLayout gl = new GridLayout(4, 2);
windowContent.setLayout(gl);
// hafızada kontrolleri oluşturalım
JLabel label1 = new JLabel("1. Sayı: ");
JTextField field1 = new JTextField(10);
JLabel label2 = new JLabel("2. Sayı: ");
JTextField field2 = new JTextField(10);
JLabel label3 = new JLabel("Toplam:");
JTextField result = new JTextField(10);
JButton OK = new JButton("Topla");
// panonun kontrollerini ekleyelim
windowContent.add(label1);
windowContent.add(field1);
windowContent.add(label2);
windowContent.add(field2);
windowContent.add(label3);
windowContent.add(result);
windowContent.add(OK);
// pencere oluşturup panoyu ekleyelim
JFrame frame = new JFrame("Toplama Makinesii :))");
frame.setContentPane(windowContent);
// pencere boyutunu ayarlayıp, görünür hale getirelim
frame.setSize(375, 100);
frame.setVisible(true);
}
}
Çalıştırdığımızda;
ve pencere boyutunu değiştirdiğimizde;
Daha önce söylediğimiz gibi, GridLayout ile yaptığımızda ve pencerenin boyutu değiştiğinde bileşenlerimizin boyutları da değişti fakat birbirlerine göre konumlarında herhangi bir değişiklik olmadı.
Bu konuda bilmemiz gereken bir şey daha:
GridLayout kullandığımızda, oluşturduğumuz tüm ızgara hücreleri aynı boyutlara sahip olmaktadır.
Posted in Java, Java for Kids - Çeviri, programlama | No Comments »




