Tekrardan merhaba, söz verdiğim gibi “Bir Kahve Molası – Java” yazı dizimize kaldığımız yerden devam ediyorum.Java yazı dizilerimi ilk defa görüyor ve bu başlıkla okumaya başlıyorsanız ilk önce diğer başlıklara sırasıyla gözatmanızı öneririm :Başlangıç( 1. Bölüm ) : Bir Kahve Molası – Java [Bölüm 1]Hesap Makinesi( 2. Bölümün 1. Kısmı ) : Bir Kahve Molası – Java [Bölüm 2-1]Şimde kaldığımız yerden devam ediyoruz :Hatırlarsınız en son tasarımımızı hazırlamıştık, ilk önce projemizi açalım :

Son Tasarımımız
Son Tasarımımız

Şimdi yapmamız gereken kodlamanın bir tasarımını çıkartalım :1. Aşama :
Butonlardan sayı olanlara tıklandığında ardı ardına gelen bir string ifademiz olacak ve her sayıya tıklandığında bu ifade genişleyecek.Örnek : ilk önce 1 tuşuna bastık, daha sonra 3 tuşuna bastık. Elimizdeki sayı : 13 oldu. Ardından bir de 4 tuşuna basarsak sonucumuz 134 olacaktı.2. Aşama :
elde edilen bu sayı 4 işlem yada eşittir tuşlarına basıldığında hafızaya alınacak ve 2. sayı için beklemeye geçilecek. Eğer daha önceden zaten bir sayı bulunuyorsa basılan işleme göre yazılan sayı işleme girecek ve sonuç ekrana yazdırılacak.Örnek : 13 sayımızı girdik daha sonra tuşuna bastık ve 12 sayısını girdik. sonucumuz 25 gösteriyor. Bundan sonra – ye bastık ve 21 girdik, sonuç olarak 4 gösterilmesi gerekiyor.3. Aşama :
C tuşuna basıldığında hafızadaki ilk sayı ve girilen sayılar silinecek, 0 dan işlemlere tekrardan başlanabilecektir( reset tuşu olarak düşünün )4. Aşama :
Projemizin çalışıp çalışmadığını detaylı bir şekilde test edin. Hatalı yer varsa yorum olarak bildirin :)Plan Haritamızı okuduysanız aklınızda bir sistem canlanmış demektir. Şimdi bu sistemi hayata geçirmek için gerekli adımları atıyoruz :1.Aşama( Sayı Butonlarına Tıklanma ) :
0 dan 9 a kadar olan sayılarımızın butonları formumuzda mevcut ve hepsinin bir isim değeri var hatırlarsanız. Bunları ben “Buton1”, “Buton2”, “Buton3″… şeklinde adlandırdım. Adlandırmayı yapmayı unuttuysanız şu şekilde yapabilirsiniz :

Not : Adlandırma, kod kısmı içerisinde bu elemana erişeceğimiz ismi belirliyor. Örnek vermek gerekirse : Buton1 adını koyduğumuz elemanın özelliklerine kod içerisinden
Buton1.text = “Butonun Texti”;şeklinde erişebilmekteyiz.

Adlandırma işlemini tamamladıysanız sıra geldi kodlama kısmına:Sol menüdeki projects sekmesinden Source Packages > hesapmakinesi nin üzerine gelin. Sağ tıklayın New > Java class deyin. İsmine islemler deyip Finish tuşuna basın.İşlemlerimizin tamamını düzen için yeni açtığımız bu dosyadan gerçekleştireceğiz. Rahat anlayabilmeniz için yazdığım dosyanın içerisine her eleman ve işlem için gerekli açıklamayı yaptım.

Java’nın class yapısını bir sonraki dökümanda yazmak zorundayım. Burada class yapısına değinmemiz durumunda kafanız çok karışacak. Tek bilmeniz gereken : Projeyi parçalara ayırmanıza, sadece gereken yerde gereken işlemlerin kullanılmasına ve projenizin rahatça genişletilebilmesine yarar class. Daha geniş bir tanım arıyorsanız OOP( Object Oriented Programming )’yi araştırabilirsiniz.

İşlemler Sınıfımızın içeriği :package hesapmakinesi; // hesapmakinesi paketinin içerisinde bulunduğunu belirtir. Bu sayede hesapmakinesi paketinin içerisindeki scriptlere erişebiliriz. C#daki namespace ile aynı işlemi görür.public class Islemler { // Genel class tanımıprivate HesapMakinesiView m_View;// Hesap makinemizin eventları HesapMakinesiView adlı classımızın içerisinde bulunuyor. HesapMakinesiView classından gelen verileri okumamız gerektiğinden nesnenin bir kopyasını burada tutmak durumundayız. Bu sayede hesap makinesindeki tüm elemanlara erişebileceğiz.( Bu haliyle henüz o nesneye ayarlanmadı. Bu class HesapMakinesiView içerisinden istendiğinde yükleme işlemi yapılacak )public Islemler( HesapMakinesiView view ) { m_View = view; }// Constructor( Kurucu ) metodumuz. Bu metod sayesinde nesnemiz kurulabilir hale geliyor. Kurabilmemiz için kullanmak istediğimiz sınıf metodunun içinde Islemler islem = new Islemler( HesapMakinesiView ); şeklinde tanıtmamız gerekiyor.public void Islem_Yap( String islem_adi ){// İşlemin son haline göre hesabını yapar, daha sonra gönderilen parametreyi son isleme verir.}public void Esittir(){// Eğer ilk sayı var ve 2. sayı da girilmişse işlemine göre sonucunu verir( işlem tipini de hafızada tutmamız gerekecek ). Eğer ilk sayı var ama 2. sayı girilmemişse ilk sayıyı sonuc adlı TextLabele yazar. Eğer yeni sayı girilmiş ama ilk sayı yoksa girilen sayıyı sonuc adlı TextLabele yazar}public void Sifirla(){// C tuşuna basıldığında tetiklenir. Bütün hafızayı sıfırlar.( reset ) Bu sayede işlemlere 0dan başlanabilir.}}
Bu sınıfın içerisinden işlemlerimizi gerçekleştireceğiz. İşlemlerin içeriğini henüz yazmadık, sadece bir taslak hazırladık. Şimdi esas tasarımımızın olduğu HesapMakinesiView.java adlı dosyamıza geçiyoruz ve bu işlemleri yapabilmemiz için gerekli tanımlamaları yapıyoruz :public class HesapMakinesiView extends FrameView { yazan yerin tam altına şunları ekliyoruz :public int m_IlkSayi = 0; // Önceden girilen sayımızı tutacakpublic String m_IslemTipi = null; // İşlem tipimizi tutacak( toplama, çıkarma gibi )public Islemler m_Islemler; // İşlemler classımızın bir kopyasını tutacak. Not : Bu fonksiyon henüz kurulmadı. Kurabilmek için bir sonraki aşamayı yapmalısınız.
Bunları ekledikten sonra Islemler adlı classımızı bu class içerisinde kuruyoruz :public HesapMakinesiView(SingleFrameApplication app) {
yazan yeri buluyoruz ve kapanış etiketinden önce( ‘}’ ) :m_Islemler = new Islemler(this); // Kurucu metodumuzun içerisinde Islemler adlı classımızı kurduk. Artık proje içerisinde kullanabileceğiz.
kodumuzu ekliyoruz.

Not : Netbeans programında kapanış etiketini bulmak için açılış etiketinin soluna ya da sağına tıklayın. Açılış etiketinin arkaplan rengi sarıya döndüğünde sayfanın yavaşça aşağısına inip arkaplanı sarı renkte olan ‘}’ karakterini bulun.

Artık Islemler sınıfımızı HesapMakinesiView sınıfı içerisinden kullanabileceğiz.Sıra geldi sayı tuşlarımıza tıkladığımızda olacak işlemleri tanımlamamıza.

Hatırlatma :
1. Aşama :
Butonlardan sayı olanlara tıklandığında ardı ardına gelen bir string ifademiz olacak ve her sayıya tıklandığında bu ifade genişleyecek.Örnek : ilk önce 1 tuşuna bastık, daha sonra 3 tuşuna bastık. Elimizdeki sayı : 13 oldu. Ardından bir de 4 tuşuna basarsak sonucumuz 134 olacaktı.

Hatırlarsanız bu işlemleri yapabilmek içinpublic int m_IlkSayi = 0;public String m_IslemTipi = null;public Islemler m_Islemler;alanlarını eklemiştik. Şimdi sıra geldi o alanlarımızı kullanmaya :Önceki yazımda anlattığım gibi Netbeans içerisinde her nesnenin özelliklerinin ve etkileşimlerinin tutulduğu bir alan var. Bu alanın içerisinde 4 adet sekme var ve bu sekmelerden düzenlemelerimizi hızlı bir şekilde yapabiliyoruz. Şimdi bu sekmeleri kullanma vakti.0 ile 9 arası tüm rakamlar için sadece yazdırma işi yapacağımız için kod kısmına gelip ilk başta pratik bir metod yazmamız, hem koddan, hemde alandan bize kâr elde ettirecektir.Source kısmına geçiyoruz,public void showAboutBox() {if (aboutBox == null) {JFrame mainFrame = HesapMakinesiApp.getApplication().getMainFrame();aboutBox = new HesapMakinesiAboutBox(mainFrame);aboutBox.setLocationRelativeTo(mainFrame);}HesapMakinesiApp.getApplication().show(aboutBox);}
Bu kısmı bulup altına yeni bir fonksiyon tanımlıyoruz :public void ButonaBasildi( buton_id ) {// Her buton için metod yazacağımıza, tek fonksiyon içerisinden bütün butonların tıklanma işlemlerini toplayabiliriz.}
Bunu eklediysek, tekrardan tasarım( Design ) kısmına geçelim ve 0 butonunun mouseClicked eventını bulup sağındaki aşağı okuna tıklıyoruz. Bir adet metod çıkaracaktır, ona tıkladığınızda otomatik olarak bir kod alanı çıkaracaktır. Çıkan alanın içerisine şu kodu yerleştiriyoruz :ButonaBasildi( 0 );
Bunu 0 dan 9 a kadar tüm tuşlar için uyguluyoruz.Örnek : 2 butonu için ButonaBasildi( 2 ); yazmalıyız.

Kolaylık :Netbeans’ın bize sağladığı kolaylıklar saymakla bitmiyor. Bunlardan güzel bir tanesi daha : Tasarım alanında elemanı seçip events kısmına gidip oradan tekrardan bir araştırmaya girip istediğiniz eventı bulmaya kasmak istemiyorsanız pratik olarak seçmek istediğiniz elemana sağ tıklayıp Events alanından gruplandırılmış eventlardan istediğimizi daha hızlı bir şekilde seçebiliriz.

Bunu uyguladıktan sonra public void ButonaBasildi( buton_id ) adlı fonksiyonumuzun içerisini artık yazabiliriz.( 1. Aşamanın son öğesi )İlk önce sonucun gösterileceği alana gelelim ve variable name’ini sonuc yapalım. Daha sonra yazdığımız sayının gözükeceği alana gelelim ve variable name’ini hesap_formulu yapalım. Daha sonra kodumuza geçelim :private void TusaBasildi( int id ) {if( hesap_formulu.getText() != “” ) { // Eğer girilen sayı alanımız boş değilseif( hesap_formulu.getText().startsWith(“0”) ) { // Eğer sayı 0 la başlıyorsahesap_formulu.setText(Integer.toString(id)); // 0 la başlayan sayı olmayacağından direk yeni girdiğimiz numarayı ekle.} else { // Eğer sayı 0 la başlamıyorsahesap_formulu.setText(hesap_formulu.getText() + Integer.toString(id)); // Yeni sayıyı eski sayının yanına ekle}} else { // Eğer girilen sayı alanımız boşsahesap_formulu.setText(Integer.toString(id)); // Basılan sayıyı alana gir.}}
Bu fonksiyonu eklemişseniz ve eventları da düzgün bir şekilde yapabilmişseniz artık sayı girişimiz kullanılabiliyor haldedir. CTRL + F5 tuşlarına basarak projenizi compile edip denemeye başlayın. Sonucu gözlemleyin :)Sonucu gözlemlediyseniz 1. aşamamızı ve büyük bir kısmı başarıyla bitirdik demektir.2. Aşama
İlk aşamayı atlattık, artık rahat bir nefes alabilir miyiz? Malesef hayır :)Şimdi işlemlerimizin yapılacağı kısma geldik. Bunun için kahvenizi hazır tutmanızı ya da gidip hazırlamanızı tavsiye ediyorum. Siz hazırlayadurun ben birkaç fonksiyon karalayayım aşağıya, gelince okursunuz :)İşlemlerimizin yapılacağı Islemler.java dosyamıza gözatıyorum :package hesapmakinesi; // hesapmakinesi paketinin içerisinde bulunduğunu belirtir. Bu sayede hesapmakinesi paketinin içerisindeki scriptlere erişebiliriz. C#daki namespace ile aynı işlemi görür.public class Islemler { // Genel class tanımıprivate HesapMakinesiView m_View;// Hesap makinemizin eventları HesapMakinesiView adlı classımızın içerisinde bulunuyor. HesapMakinesiView classından gelen verileri okumamız gerektiğinden nesnenin bir kopyasını burada tutmak durumundayız. Bu sayede hesap makinesindeki tüm elemanlara erişebileceğiz.( Bu haliyle henüz o nesneye ayarlanmadı. Bu class HesapMakinesiView içerisinden istendiğinde yükleme işlemi yapılacak )public Islemler( HesapMakinesiView view ) { m_View = view; }// Constructor( Kurucu ) metodumuz. Bu metod sayesinde nesnemiz kurulabilir hale geliyor. Kurabilmemiz için kullanmak istediğimiz sınıf metodunun içinde Islemler islem = new Islemler( HesapMakinesiView ); şeklinde tanıtmamız gerekiyor.public void Islem_Yap( String islem_adi ){}public void Esittir(){// Eğer ilk sayı var ve 2. sayı da girilmişse işlemine göre sonucunu verir( işlem tipini de hafızada tutmamız gerekecek ). Eğer ilk sayı var ama 2. sayı girilmemişse ilk sayıyı sonuc adlı TextLabele yazar. Eğer yeni sayı girilmiş ama ilk sayı yoksa girilen sayıyı sonuc adlı TextLabele yazar}public void Sifirla(){// C tuşuna basıldığında tetiklenir. Bütün hafızayı sıfırlar.( reset ) Bu sayede işlemlere 0dan başlanabilir.}}
Şimdi bize gerekli olan kodları teker teker yerleştiriyorum( eski yorumları karmaşıklık olmasın diye sildim ) :// Bu fonksiyon sayesinde gönderilen objenin sayı olup olmadığını test ediyoruz. hesap_formulu kısmından gelen String verisinin sayı olup olmadığını kontrol etmemize yarıyor.public boolean isInt( Object value ) {try {Integer.parseInt(String.valueOf(value));return true;}catch( Exception e ) { }return false;}public void Islem_Yap( String islem_adi ){Esittir(); // Hafızada olan işlemi yapıyoruz ve yeni işleme başlamak için işlem tipini boşaltıyoruz.m_View.m_IslemTipi = islem_adi; // Yeni işlemimizin tipini bu elemanımızda saklıyorduk. Birdahaki eşittir ya da 4 işlem tuşlarına basıldığında bu işlemi yapması için hafızaya alıyoruz.}public void Esittir(){int sonuc = 0; // Sonuç alanına yazılacak sayıyı tutuyor.if( m_View.m_IlkSayi != 0) { // Bundan önce bir sayı hafızaya almışsakif( m_View.hesap_formulu.getText() == “” ) // ve yeni bir sayı girmemişseksonuc = m_View.m_IlkSayi; // Sonuç ilk girdiğimiz sayıdır.else { // ama yeni bir sayı girdiysek hafızaya alınan işlem tipine göre işlemimizi gerçekleştirsonuc = m_View.m_IlkSayi;if( m_View.m_IslemTipi == “bol” && isInt(m_View.hesap_formulu.getText()) ) { // Bölme işlemi ise ilk sayıyı yeni girdiğimiz sayıya böl( dikkat edin hesap_formulu alanının int olup olmadığını kontrol ettik. Boş olması durumunda int olarak sayılmıyor )sonuc /= Integer.parseInt( m_View.hesap_formulu.getText() );}else if( m_View.m_IslemTipi == “carp” && isInt(m_View.hesap_formulu.getText()) ) { // diğer işlemleri de aynı şekilde gerçekleştirdiksonuc *= Integer.parseInt( m_View.hesap_formulu.getText() );}else if( m_View.m_IslemTipi == “topla” && isInt(m_View.hesap_formulu.getText()) ) {sonuc += Integer.parseInt( m_View.hesap_formulu.getText() );}else if( m_View.m_IslemTipi == “cikar” && isInt(m_View.hesap_formulu.getText()) ) {sonuc -= Integer.parseInt( m_View.hesap_formulu.getText() );}else { // Eğer yukarıdaki şartlara uymayan bir durum olursa( Yeni sayı girilmemiş ve ya işlem tipi hatalı ise )if( isInt(m_View.hesap_formulu.getText()) )m_View.m_IlkSayi = Integer.parseInt(m_View.hesap_formulu.getText()); // Yeni sayı girilmişse yeni sayıyı ilk sayı olarak ata( sonuc alanında gösterebilmek için )sonuc = m_View.m_IlkSayi; // sonucu ilk sayıya ata}}} else { // Diğer durumlardaif( isInt(m_View.hesap_formulu.getText()) )sonuc = Integer.parseInt(m_View.hesap_formulu.getText());elsesonuc = 0;}m_View.sonuc.setText(Integer.toString(sonuc)); // Sonuç alanına sonucumuzu yazıyoruz.m_View.m_IlkSayi = sonuc; // ilk sayıyı sonucumuz olarak ayarlıyoruzm_View.hesap_formulu.setText(“”); // Hesap formülü alanımızı boşaltıyoruzm_View.m_IslemTipi = “”; // işlem tipini sıfırlıyoruz.( taki 4 işlem tuşlarından herhangi birine basılana kadar )}
2. kısımda düşündüğümüz tüm işlemler bunlar. Tasarım kısmımıza dönüp 4 işlem ve eşittir tuşlarının tıklanma anlarına gereken fonksiyonları yazalım :Eşittir için :m_Islemler.Esittir();
Toplama için :m_Islemler.Islem_Yap( “topla” );
Çıkarma için :m_Islemler.Islem_Yap( “cikar” );
Bölme için :m_Islemler.Islem_Yap( “bol” );
Çarpma için :m_Islemler.Islem_Yap( “carp” );
Bu işlemleri tamamladıysak artık 4 işlem ve eşittir fonksiyonlarını da tanıyor ve hesap makinesi işlevini yerine getirmeye başlamış demektir. Hemen CTRL + F5 ile debug modunda açıyoruz ve testimizi yapıyoruz.Testimiz başarılı olmuşsa hesap makinemizin neredeyse tamamını bitirdik demektir. Sıra geldi 3. kısım – değerleri sıfırlamaya :Değer sıfırlamak için Islemler içerisindeki Sifirla fonksiyonumuzu şu şekilde düzenliyoruz :public void Sifirla(){m_View.m_IslemTipi = “”; // İşlem tipini sıfırladıkm_View.sonuc.setText(“”); // sonuç alanını boşalttıkm_View.m_IlkSayi = 0; // ilk sayımızı boşalttıkm_View.hesap_formulu.setText(“”); // hesap formülümüzü boşalttık.}
Daha sonra tasarım kısmına geri dönüp eşittir işaretimizin mouseClick eventının içerisineIslemler.Sifirla();
kodunu ekliyoruz. Bunu da yaptıysak bu kısmı da atlattık demektir.Artık tam teşekküllü bir tam sayı hesap makinemiz var. Bütün denemelerinizi yapın bende bu arada bir kahve daha dolduracağım( kahve komasına girmeyi kafaya koydum da 😛 )Klavye yollarını da yazacaktım fakat şuanda ağar gelebilir. Hesap makinemize devam ettiğimiz süre zarfında bir çok şey daha ekleyeceğiz. Lisanda sürçme olduysa affola, konu bütünlüğünden kopmuş olabilirim, çünkü Java’yı sizlerle beraber bende yeni keşfetmekteyim. Bu yazıyı yazmadan önce 100lerce deneme yapmam gerekiyor 🙂 Umarım herkese yararlı bir makale olmuştur.Şimdilik bukadar gelecek bölümlerde görüşmek üzere, kendinize iyi bakın…Kodlar :
.jar ( Çalıştırılabilir-Derlenmiş Dosya ) : Buradan.java ( Kaynak Dosyalar + Derlenmiş Dosya ) : Buradan