Bir Bilgisayar Mühendisi İçin Programlama Dili, Öğrendiklerini Sınadığı, Deneyler Yaptığı Bir Laboratuardır. Ve Mühendisler Deneylerini, Kestiremedikleri Sonuçları Gözlemlemek İçin Değil, Öngördükleri Sonuçları Doğrulamak İçin Yaparlar...
Programlama Günlüğü > Java > Java ME > Merhaba Java ME
Java ME
Sayfalar: 1
 
Üye Girişi
E-mail:

Şifre:



 
Blog Arama Motoru
 
Son Güncellenenler
 
Sosyal Ağlarda Paylaş
 
Merhaba Java ME
İlk java me uygulamam
   Öss dönemindeyken sürekli deneme sınavı yapardık ve sınavdan çıkar çıkmaz puanımızı hesaplamaya koyulurduk. Onu çarp, bununla topla... uzun iş. Bunu cep telefonlarına yaptırmamı sağlayacak bir programlama dili arayışına girdim. Java, Carbide C++, VB AppForge, Phyton gibi diller ile cep telefonlarına uygulama yazabileceğini öğrenip hemen denemelere başladım. İlk olarak Carbide.C++ı ve sonra Javayı denedim. Ama o zamanlar C bilmediğim için hiçbir şey anlayamadan bıraktım. Bana visual basicin mantığına daha yakın bir dil gerekiyordu; VB AppForge'u buldum. Ama üreticisi ona verdiği desteği geri çekince öylece kaldı o da. Sıra geldi Phyton'a. Phyton ile yazılmış programları inceleye inceleye sonunda Symbian 60 serisi üzerinde çalışabilen, deneme sınavı sonuçlarını hesaplamaya yarayan oldukça basit bir uygulama yazdım... Böyle basit bir uygulama için bile bu kadar uğraşmış olmam, mobil uygulama geliştirme hevesimi kaçırmıştı o zamanlar...

   Bu dönem okulda java dilini de görmeye başladık. .Netin kütüphanelerini ve fonksiyonlarını gören biri için java çok yetersiz. Açıkçası hayal kırıklığına uğradım. "Java dedikleri bu muymuş?" dedim kendi kendime...

   Javanın şimdilik gözüme çarpan belirgin iki özelliği var. Birincisi platform bağımsızlığı ki benim için bunun hiçbir değeri yok. İkincisi de nesne yönelimi. Tamamlanmamış sınıflar, implementasyonlar, miras alımları, soyut sınıflar... Dilin bu tarafı oldukça güzel. Nesne yönelimli bir başka dil olan VBasic ile karşılaştıracak olursak, javada nesne yönelimi çok daha belirgin, herşey sınıflardan oluşuyor...

   Javanın yine şimdilik bana cazip görünen tek sürümü Java ME(Micro Edition). Taşınabilir mobil cihazlar için özelleştirilmiş bu sürümü ile Java destekli tüm cep telefonlarına, pdalara uygulama yazılabiliyor. Java ME, sınırlı ağ bağlantısı bulunan ve genelde 512 kbden küçük bir hafızaya sahip cihazlar için CLDC(Connected, Limited Device Configuration), sürekli ağ bağlantıları bulunan ve daha çok belleğe, işlem gücüne sahip cihazlar için de CDC(Connected Device Configuration) olmak üzere iki farklı konfigürasyon tipi belirlemiş. Bu iki tipten en yaygın olanı CLDC, kullandığımız java destekli neredeyse tüm cep telefonları bu konfigürasyonu kullanır.

   Başlangıç olsun diye ders programını cep telefonunda kaydedip görebilmemi sağlayacak minik bir uygulama yazdım. Uygulamanın arayüzünü başta netbeans'in Visual Midlet Editorü ile yapmaya çalıştım. Ama netbeans kendi ürettiği kodara müdahale edilmesine izin vermiyor. "Sen işime ne karışıyorsun" deyip visual midleti sildim ve midleti kendim yazdım. Visual Midlet kullanmamanızı öneririm...

   Böylece Java ME'ye de bir merhaba demiş oldum. İlk fırsatta, Java MEnin form elemanlarını, mobil uygulamaların bir çeşit veritabanı yönetim sistemi olan RMS (Record Management System) mantığını, javanın sınıf, interface, kalıtım ve implementasyon yaklaşımlarını anlatan yazılar yazıp, bu yazıları bu kategori altında toplayacağım...

   Yukarıda ekran görüntüsü bulunan uygulamanın kodu:
package DP;

import java.util.Calendar;
import java.util.Date;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

/**
 * Hüseyin Atasoy
 * 02/04/2010
 */

// Canvas sınıfını miras al
class Tuvalim extends Canvas {
    private String baslik, icerik;
    private Font baslikf = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_BOLD, Font.SIZE_MEDIUM);
    private Font yazif = Font.getFont(Font.FACE_PROPORTIONAL, Font.STYLE_PLAIN, Font.SIZE_SMALL);
    private Midletim isteyen;

    Tuvalim(Midletim _isteyen) {
        isteyen = _isteyen;
    }

    public void paint(Graphics g) {
        g.setColor(255, 255, 255);
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(0, 0, 0);
        g.setFont(baslikf);
        g.setColor(0, 0, 255);
        g.drawString(baslik, 10, 2, Graphics.TOP | Graphics.LEFT);
        g.setColor(200, 0, 0);
        g.drawLine(5, 18, getWidth() - 8, 18);
        g.setFont(yazif);
        g.setColor(0, 0, 0);

        //Canvasta alt satıra geçişi olmadığı için alt satır geçişleri bizim düzenlememiz lazım
        icerik = " " + icerik;
        String satir = "";
        int yukaridan = 23;
        //int i = 1;
        int konum = 0, oncekiKonum;
        while (true) {
            oncekiKonum = konum + 1;
            konum = icerik.indexOf('\n', konum + 1);
            try {
                satir = icerik.substring(oncekiKonum, konum);
            } catch (Exception ex) {
                satir = icerik.substring(oncekiKonum, icerik.length());
                break;
            } finally {
                satir = satir.trim();
                if (satir.length() > 0) {
                    g.drawString(satir, 10, yukaridan, Graphics.TOP | Graphics.LEFT);
                    //Yanlarda 1), 2)... görünmesini istiyorsan alttakini aktifleştir.
                //g.drawString((i++) + ") " + satir, 10, yukaridan, Graphics.TOP | Graphics.LEFT);
                }
                yukaridan = yukaridan + 15;
            }
        }
    }

    void yaz(String _baslik, String _icerik) {
        baslik = _baslik;
        icerik = _icerik;
    }

    protected void keyPressed(int keycode) {

        switch (keycode) {
            case Canvas.KEY_NUM0:
                isteyen.goster(isteyen.gunIsmi);
                break;
            case Canvas.KEY_NUM1:
                isteyen.goster("Pazartesi");
                break;
            case Canvas.KEY_NUM2:
                isteyen.goster("Salı");
                break;
            case Canvas.KEY_NUM3:
                isteyen.goster("Çarşamba");
                break;
            case Canvas.KEY_NUM4:
                isteyen.goster("Perşembe");
                break;
            case Canvas.KEY_NUM5:
                isteyen.goster("Cuma");
                break;
            case Canvas.KEY_NUM6:
                isteyen.goster("Cumartesi");
                break;
            case Canvas.KEY_STAR:
                isteyen.duzenle();
                break;
            case Canvas.KEY_POUND:
                isteyen.hakkinda();
                break;
        }
    }
}

//MIDlet sınıfını miras al ve CommandListener interface'ini tamamla...
public class Midletim extends MIDlet implements CommandListener {
    private int gun = 0;
    public String gunIsmi = "";
    private String simdiki = "";
    kayitci kayitlar;
    private Tuvalim T1;
    private Command bugun = new Command("Bugün", Command.ITEM, 0);
    private Command pazartesi = new Command("Pazartesi", Command.ITEM, 0);
    private Command sali = new Command("Salı", Command.ITEM, 0);
    private Command carsamba = new Command("Çarşamba", Command.ITEM, 0);
    private Command persembe = new Command("Perşembe", Command.ITEM, 0);
    private Command cuma = new Command("Cuma", Command.ITEM, 0);
    private Command cumartesi = new Command("Cumartesi", Command.ITEM, 0);
    private Command duzenle = new Command("Düzenle", Command.ITEM, 0);
    private Command hakkinda = new Command("Hakkında", Command.ITEM, 0);
    private Command cikis = new Command("Çıkış", Command.EXIT, 0);
    private Command iptal = new Command("İptal", "İptal", Command.EXIT, 0);
    private Command kaydet = new Command("Kaydet", "Kaydet", Command.ITEM, 0);
    private TextBox textBox = new TextBox(" ", null, 400, TextField.ANY);

    //MIDlet sınıfına ait startApp() fonksiyonunun implementasyonu
    public void startApp() {        
        gunNum();
        hangiGun();
        try {
            kayitlar = new kayitci("DersProgrami");
        } catch (Exception ex) {
        }
        goster(gunIsmi);
        textBox.addCommand(kaydet);
        textBox.addCommand(iptal);
        textBox.setCommandListener(this);
    }

    //MIDlet sınıfına ait destroyApp() fonksiyonunun implementasyonu
    protected void destroyApp(boolean unconditional) {
        Display.getDisplay(this).setCurrent(null);
        notifyDestroyed();
    }

    //MIDlet sınıfına ait pauseApp() fonksiyonunun implementasyonu
    protected void pauseApp() {
    }

    //CommandListener interface'ine ait commandAction() fonksiyonunun implementasyonu
    public void commandAction(Command command, Displayable displayable) {

        if (displayable == textBox) {
            if (command == iptal) {
                Display.getDisplay(this).setCurrent(Tuval());
            } else if (command == kaydet) {
                kaydet(simdiki, textBox.getString());

                goster(simdiki);
            }
        } else {
            if (command == bugun) {
                goster(gunIsmi);
            } else if (command == pazartesi) {
                goster(pazartesi.getLabel());
            } else if (command == sali) {
                goster(sali.getLabel());
            } else if (command == carsamba) {
                goster(carsamba.getLabel());
            } else if (command == persembe) {
                goster(persembe.getLabel());
            } else if (command == cuma) {
                goster(cuma.getLabel());
            } else if (command == cumartesi) {
                goster(cumartesi.getLabel());
            } else if (command == duzenle) {
                duzenle();
            } else if (command == hakkinda) {
                hakkinda();
            } else if (command == cikis) {
                destroyApp(true);
            }
        }
    }

    public void gunNum() {
        Calendar a = Calendar.getInstance();
        a.setTime(new Date());
        gun = a.get(a.DAY_OF_WEEK);
        Display.getDisplay(this).setCurrent(Tuval());
    }

    public void hakkinda() {
        Alert alert = new Alert("Hakkında");
        alert.setString("Hüseyin Atasoy, 02/04/2010");
        alert.setType(AlertType.INFO);
        alert.setTimeout(Alert.FOREVER);
        Display.getDisplay(this).setCurrent(alert, Tuval());
    }

    public void duzenle() {
        textBox.setTitle(simdiki);
        textBox.setString(kayitlar.kayitOku(simdiki));
        Display.getDisplay(this).setCurrent(textBox);
    }

    public void hangiGun() {
        switch (gun) {
            case 1: //Pazar günü tatil o gün ders mi olur, Pazartesi gününü göster...
                gunIsmi = "Pazartesi"; break;
            case 2:
                gunIsmi = "Pazartesi"; break;
            case 3:
                gunIsmi = "Salı"; break;
            case 4:
                gunIsmi = "Çarşamba"; break;
            case 5:
                gunIsmi = "Perşembe"; break;
            case 6:
                gunIsmi = "Cuma"; break;
            case 7:
                gunIsmi = "Cumartesi"; break;
        }
    }

    public Tuvalim Tuval() {
        if (T1 == null) {
            T1 = new Tuvalim(this);
            T1.addCommand(bugun);
            T1.addCommand(pazartesi);
            T1.addCommand(sali);
            T1.addCommand(carsamba);
            T1.addCommand(persembe);
            T1.addCommand(cuma);
            T1.addCommand(cumartesi);
            T1.addCommand(duzenle);
            T1.addCommand(hakkinda);
            T1.addCommand(cikis);
            T1.setCommandListener(this);

        }
        return T1;
    }

    public void goster(String hangiGunu) {
        simdiki = hangiGunu;
        String kayit = "";

        kayit = kayitlar.kayitOku(simdiki);
        if (kayit == null) {
            kayit = "  -- Ayarlanmamış --";
        }

        try {
            Tuval().yaz(hangiGunu, kayit);
            Tuval().repaint();
        } catch (Exception ex) {
            Alert alert = new Alert("Kayıt Yok");
            alert.setString("Bu güne ait bir kayıt bulunmuyor!");
            alert.setType(AlertType.WARNING);
            alert.setTimeout(Alert.FOREVER);
            Display.getDisplay(this).setCurrent(alert, textBox);
        }
        Display.getDisplay(this).setCurrent(Tuval());
    }

    public void kaydet(String hangiGun, String dProg) {
        try {
            kayitlar.ekle(hangiGun, dProg);
            kayitlar.kaydet();
        } catch (Exception ex) {
        }
    }
}

   RMS veritabanını okumak ve yazmak için pratik bir sınıf oluşturdum. Hashtablosu sayesinde normalde integer değer ile erişilen kayıtlara string tipindeki anahtarlar ile erişmek mümkün oldu. Bunu phpde string indis alabilen dizilere benzetebiliriz. Ayrıca başta bayağı takıldığım Tükçe karakter problemini de readUTF() ve writeUTF() fonksiyonları sayesinde gidermiş oluyoruz...
package DP;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.*;
import javax.microedition.rms.*;

/**
 * RecordStore Okuma Yazma Sınıfı
 * Hüseyin Atasoy
 * 02/04/2010
 */

public class kayitci {

    private String vtIsmi;
    private Hashtable hashTablom;

    public kayitci(String _vtIsmi) throws RecordStoreException, IOException {
        vtIsmi = _vtIsmi;
        hashTablom = new Hashtable();
        yukle();
    }

    public String kayitOku(String anahtar) {
        return (String) hashTablom.get(anahtar);
    }

    public void ekle(String anahtar, String deger) {
        if (deger == null) {
            deger = "";
        }
        hashTablom.put(anahtar, deger);
    }

    private void yukle() throws RecordStoreException, IOException {
        RecordStore rs = null;
        RecordEnumeration re = null;

        try {
            rs = RecordStore.openRecordStore(vtIsmi, true);
            re = rs.enumerateRecords(null, null, false);
            while (re.hasNextElement()) {
                byte[] baytDizi = re.nextRecord();

                ByteArrayInputStream bin = new ByteArrayInputStream(baytDizi);
                DataInputStream din = new DataInputStream(bin);
                String kayit = new String(din.readUTF());

                //ismi ayıkla
                int index = kayit.indexOf('|');
                String isim = kayit.substring(0, index);
                String deger = kayit.substring(index + 1);
                ekle(isim, deger);
            }
        } finally {
            if (re != null) {
                re.destroy();
            }
            if (rs != null) {
                rs.closeRecordStore();
            }
        }
    }

    public void kaydet() throws RecordStoreException, IOException {
        RecordStore rs = null;
        RecordEnumeration re = null;
        try {
            rs = RecordStore.openRecordStore(vtIsmi, true);
            re = rs.enumerateRecords(null, null, false);

            // Tüm kayıtları sil
            while (re.hasNextElement()) {
                int id = re.nextRecordId();
                rs.deleteRecord(id);
            }

            // Sonra da kayıtları yerleştir
            Enumeration anahtarlar = hashTablom.keys();
            while (anahtarlar.hasMoreElements()) {
                String anahtar = (String) anahtarlar.nextElement();
                String deger = kayitOku(anahtar);
                String kayit = anahtar + "|" + deger;

                //maksat utf kodlamasıyla yazılsın, yoksa Türkçe karakterler görünmüyor
                ByteArrayOutputStream bout = new ByteArrayOutputStream();
                DataOutputStream dout = new DataOutputStream(bout);
                dout.writeUTF(kayit);

                byte[] baytDizi = bout.toByteArray();
                rs.addRecord(baytDizi, 0, baytDizi.length);
            }
        } finally {
            if (re != null) {
                re.destroy();
            }
            if (rs != null) {
                rs.closeRecordStore();
            }
        }
    }
}

 
Okunma Sayısı: 369
Yayınlanma Tarihi: 04 Nisan 2010 Pazar - 22:06
Anahtar Kelimeler: java me, micro edition, java, cep telefonları, uygulama geliştirmek, yazmak, nokia, symbian, series60
Yorumlar ( 2 )
mehmet
#1

20/08/2010, 17:45

javanın en kötü yanı. küçük bir harf hatasını bile kabul etmemesi. program yazarken sıkıntı oluşturuyor.. Özellikle büyük küçük harf olayında...
Hüseyin Atasoy
#2

20/08/2010, 17:53

Evet katılıyorum. Ctrl+Space sağolsun :)
Yorum/Görüş Bildir
Yorumları html kodu veya özel karakter kullanmadan, yazım kurallarına
dikkat ederek ve düzgün bir Türkçe kullanarak yazalım...
 
      Atasoy Blog v3.0 © 2009-2010 Hüseyin Atasoy | Tema Tasarımı: Hüseyin Atasoy
AtasoyWeb Firefox'u Önerir :) | Yukarı Çık