HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Asin AKDENİZ
asinakdeniz@yahoo.com asinakdeniz@gmail.com

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

2006–2007, ANKARA

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

GSM .................................................................................................................................... 3 SIM(Subscriber Identity Module) Kartları ......................................................................... 3 Metin İletileri(Text Messaging) .......................................................................................... 3 GSM Ağının Genel Yapısı .................................................................................................. 4 J2ME Geliştirme Ortamları................................................................................................. 5 Netbeans nasıl kurulur ve çalıştırılır? ................................................................................. 6 Java2 Micro Edition nedir? ............................................................................................... 11 J2ME Yapılandırıcıları (J2ME Configurations) ............................................................... 11 J2ME Profilleri.................................................................................................................. 11 J2ME Belirtimleri (J2ME Specifications) ........................................................................ 13 K Sanal Makinesi (K Virtual Machine) ............................................................................ 14 C Sanal Makinesi (C Virtual Machine CVM) .................................................................. 15 CLDC ................................................................................................................................ 15 CDC .................................................................................................................................. 17 Mobile Information Device Profile (MIDP) ..................................................................... 18 Display ve Displayable Sınıfları ....................................................................................... 18 CANVAS .......................................................................................................................... 19 SCREEN ........................................................................................................................... 20 ALERT Sınıfı .................................................................................................................... 20 FORM Sınıfı ..................................................................................................................... 21 ITEM Sınıfı ....................................................................................................................... 22 ChoiceGroup Sınıfı ........................................................................................................... 22 DateField Sınıfı ................................................................................................................. 26 Gauge Sınıfı ...................................................................................................................... 26 StringItem Sınıfı................................................................................................................ 26 TextField Sınıfı ................................................................................................................. 27 ImageItem Sınıfı ............................................................................................................... 27 List Sınıfı .......................................................................................................................... 34 Kayıt Depolama (Record Storage) .................................................................................... 37 Kayıt Depolama (The Record Storage)............................................................................. 37 Kayıt Alanına Yazmak ve Kayıt Alanından Okumak (Writing and Reading Records) ... 38 Kayıt Listeleme (Record Enumeration) ............................................................................ 38 Kayıt Listesini Sıralama .................................................................................................... 39 Sonuç................................................................................................................................. 45 Terimler Sözlüğü .............................................................................................................. 46 Kaynaklar .......................................................................................................................... 47

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o

m

İçindekiler

1

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
2

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Hızlı gelişen iletişim teknolojisiyle, 2000’li yılların başlarında 250 milyondan fazla GSM kullanıcısı vardı.2004’ün ortalarında bir milyarıncı GSM müşteriside bağlandı.

SIM(Subscriber Identity Module) Kartları

GSM telefonları, kullanıcı hesap bilgilerini içeren bir abone tanım modülü (SIM ) kartı kullanırlar. SIM kartı taktıktan sonra, her GSM telefonu doğrudan programlanmış olur; bu da GSM telefonlarının kolayca kiralanmasına ve ödünç verilmesine olanak sağlar.

Metin İletileri(Text Messaging)

GSM, metin iletilerinin 160 karakter büyüklüğünde gönderilmelerine ve bir GSM telefonundan alınmasına imkân veren bir kısa ileti servisine (SMS) olanak sağlar. Ayrıca GSM 9.6 Kbps paket ağına ,ISDN ve POTS kullanıcılarına veri aktarımını da destekler.

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o

(Global System for Mobile Communications) TDMA (Time Division Multiple Access- Zaman bölümlü çoklama erişimi) esaslı sayısal (digital) hücreli bir telefon teknolojisi olan GSM Avrupa’da hakim olan bir sistemdir ama tüm dünyada da etkin bir biçimde kullanılır.1980’lerde gelişen GSM , ilk kez 1992 yılında yedi Avrupa ülkesine yayıldı.GSM Avrupa’da 900 Mhz ve 1.8 Ghz frekans bandında ,Amerika’da ise 1.96 Hz PCS bandında çalışır.Her 200 kHz kanalı sekiz 25 kHz zaman deliklerine bölen çevrim anhtarlamalı bir sisteme bağlı olan GSM ,sadece TDMM hava arayüzünü tanımlamakla kalmaz ,tüm hücreli sistemi de tanır.

m

GSM

3

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja
GSM Ağının Genel Yapısı

Bir GSM ağı bir takım işlevsel mevcudiyetlerden ibarettir. Aşağıdaki şekil genel GSM ağının düzenini göstermektedir. GSM ağı 3 geniş parçaya bölünebilir. Mobil istasyonu abone tarafından taşınır. Taban İstasyon Alt Sistemi mobil istasyonla beraber radyo bağlantısını kontrol eder. Mobil Servis Anahtarlama Merkezi(MSC)’nin ana parçası olan Ağ alt sistemi, mobil kullanıcılar ve mobil ve sabit ağ kullanıcıları arasında anahtarlama aramalarını gerçekleştirir. MSC ayrıca mobil idare operasyonlarını da halleder. Uygun operasyon ve ağ kurulumunu yöneten Operasyonlar ve Bakım merkezi gösterilmemiştir. Mobil İstasyonu ve Taban İstasyon Alt Sistemi, hava ortak yüzeyi yada radyo halkaları olarak da bilinen Um ortak yüzeyi içinden iletişim kurarlar. Taban İstasyon Alt Sistemi, Mobil Servis Anahtarlama Merkeziyle beraber A ortak yüzeyi içinden iletişim kurar.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
4

dil
SIM kartları

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja
J2ME Geliştirme Ortamları

J2ME’de yazılım geliştirmek için kullanılan en popular kod geliştirme ortamlarının (IDE) başında Netbeans ve Eclipse geliyor. Daha önce JAVA proğramlama dilinde yazılım geliştiştirenlerin bu iki IDE hakkında bilgileri vardır. Eclipse IBM tarafından geliştirilen bir IDE, Netbeans ise SUN tarafından gelişirililmiştir. Bahsedilen geliştirme ortamlarından hangisini kullanacağınız o kadar da önemli olmamakla beraber, giriş düzeyinde J2ME kodlayacaksanız Netbeans tercih nedeniniz olmalıdır. Niye böyle bir tercih yaptığımızı nedenleri ile açıklayalım. NetBeans IDE’sinin kurulumu ve J2ME için gerekli plugin’leri yüklemek daha rahat ve kurulum kısmında anlatılmaktadır. Diğer ve en önemli nedenlerin başında bu IDE’yi destekleyen firmalar gelmektedir. Nokia, SonyEricson gibi teknolojiye yön veren şirketleri, bu firmalar arasında sayabiliriz. NetBeans IDE’sinin bu firmalar tarafından desteklemesi bizim için yeterli neden oluşturmaktadır. Konu bütünündeki kodlar NetBeans IDE’si kullanılarak geliştirilmiştir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
5

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Netbeans kurulumunu yaptıktan sonra; (http://www.netbeans.org/ Netbeans IDE 5,5 ve mobility pack’i indirdikten sonra önce IDE’yi daha sonra ise mobility package yükleyin. Netbeans IDE kullanımıza hazır hale gelecektir.) File menüsü altında New Project alt menüsüne tıklayınız. Aşağıdaki ekran belirecektir.

ww w. ja

Categories alt ekranında Mobile paketine tıklandıktan sonra, Projects alt ekranında Mobile Application’ı tıklayınız. Aşağıdaki ekran belirecektir, daha sonra next butonuna tıklayınız.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
6

dil

i.c o

m

Netbeans nasıl kurulur ve çalıştırılır?

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Project Name: projenize vereceğiniz adı yazınız. Project Location: Oluşacak projenizin hangi dizin altında oluşmasını istiyorsanız, dizin adresini yazınız.

ww w. ja

Aşağıdaki ekran belirecektir, daha sonra next butonuna tıklayınız.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil
7

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Giriş düzeyi için next butonuna tıklamanız yeterli olacaktır.

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
8

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

Aşağıdaki ekran belirlendikten sonra, Source butonuna tıklamanız yeterli olacaktır. Burada sizin için yaratılmış olan bir sınıf ve üç tane içleri boş olan metodlar bulunacaktır.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
9

dil

i.c o

m

J2ME’de yazdığınız kodu derleyip çalıştırdıktan sonra karşınıza çıkan cep telefonu simulasyonunun fiziksel görünümü hakkında tercihler sunmaktadır. Giriş düzeyi için next butonuna tıklamanız yeterli olacaktır.

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
10

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Yapılandırıcılar (configuration) üzerinde özellikli cihaz kategorisinde işlevselliği tanımlayan görüntüleyiciler/profiller(profile) bulunmaktadır. Mobil bilgi cihaz görüntüsü (MIDP Mobile Information Device Profile) cep telefonları gibi iletişim kapasitesine sahip CLDC temelli taşınabilir aletler için hazırlanan bir görüntüleyicidir (profile). Bu yapılandırıcılar ve görüntüleyiciler (profiller) ilerleyen bölümlerde ayrıntılı olarak ele alınacaktır.

J2ME için iki tane yapılandırıcı tanımlanmıştır. Bunlar • •

CDC (Connected Device Configuration) CLDC(Connected Limited Device Configuration)

ww w. ja
J2ME Profilleri

CLDC’ler 16-bit veya 32-bit küçük ve sınırlı belleklere sahip cihazlar için tasarlanmıştır. CLD’ler 160KB ve 512KB dâhili bellekler icin tasarlanmıştır. CLDC cihazlar KJava Sanal Makinesi (KJava Virtual Machine KVM) kullanır bu da Java Sanal Makinesinin (Java Virtual Machine JVM) bir alt sürümüdür. CDC cihazlar 32-bit mimariye gereksinim duyarlar ve en az iki megabyte(MB) bellek isterler. Ayrıca CDC cihazlar Java Sanal Makinesi (JVM) nin bütün altyapı fonksiyonlarını kullanabilirler.

J2ME’de 7 tane profil tanımlanmıştır. Bunlar aşağıda açıklanmıştır. 1. Foundation Profile, CDC yapılandırıcılarında kullanılır. 2. Game Profile, CDC yapılandırıcılarında kullanılır. Küçük cihazlarda oyun geliştirmek için geliştirilmiştir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

J2ME Yapılandırıcıları (J2ME Configurations)

dil

J2ME küçük elektronik cihazlar piyasasının değişik parçaları için tasarlanan teknoloji ve spesifikasyonların bir toplamıdır. J2ME platformunun temel kısmı 2 değişik yapılandırmadan oluşur: bağlantılı cihaz yapılandırıcısı (CDC Connected Device Configuration) ve bağlantılı sınırlı cihaz yapılandırıcısı (CLDC Connected Limited Device Configuration).Bir yapılandırıcı (configuration) merkezi Java™ teknolojileri kitaplığını ve sanal makine yeteneklerini tanımlar. CDC yüksek teknolojili taşınabilir aletler içindir ve CLDC ise genel cep telefonları gibi düşük maliyetli taşınabilir cihazlar içindir.

i.c o

J2ME’den söz edilirken genellikle cep telefonu teknolojileri akla gelmektedir. Böyle bir kısıtlama getirmek bu dile büyük bir haksızlık olur. Çünkü bu teknoloji sadece cep telefonu cihazlarına kod geliştirmek için değil, taşınabilir tüm cihazlara için kullanılmaktadır. Biraz daha detaylandırmak gerekirse, J2-M-E’de bulunan M harfi MOBILE olarak bilinmektedir, fakat M harfi MICRO kelimesinin kısaltılmışıdır. Bu konu hassas olduğu için J2ME’nin taşınabilir (mobile) cihazlar dışındaki cihazlar içinde kullanıldığını yani kullanım alanının ne kadar geniş olduğunu belirtmek gerekir.

m

Java2 Micro Edition nedir?

11

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

4. Personal Digital Assistant Profile, CLDC yapılandırıcısı için geliştirilmiştir. Bu görüntü MIDP görüntüsüne gore bize daha iyi a. Geniş Yerel bellek b. Daha iyi Kullanıcı Arayüzü sunmaktadır. 5. Personal Profile, CDC yapılandırıcısı için geliştirilmiştir. a. Kompleks Kullanıcı Arayüzü b. Aynı anda çoklu ekran sunmaktadır.

6. Personal Basis Profile, CDC yapılandırıcısı için geliştirilmiştir. a. Basit Kullanıcı Arayüzü b. Tek ekran sunmaktadır.

7. RMI görüntüsü, CDC yapılandırıcısı ve Foundation görüntüsü ile kullanılır.

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

Anlatılan yapılandırıcıları(configuration) ve görüntüleri(profile) daha iyi anlamak için aşağıdaki şekil incelenebilir.

dil

i.c o

m

3. Mobile Information Device Profile, CLDC yapılandırıcısı için geliştirilmiştir. Bu görüntü bize a. Yerel bellek b. Kullanıcı Arayüzü c. Network uygulamaları sunmaktadır.

12

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

J2ME Belirtimleri (J2ME Specifications)
Bütün J2ME yapılandırıcıları ve görüntüleri(profile) Java Community Process bünyesi altında geliştirilmiştir. JCP konu ile ilgili büyük endüstrü kuruluşları kendi üretimlerinde kullanacakları ortak bir spesifikasyon oluşturdular. Bütün yapılandırıcılar ve görüntüler(profile) Java Specification Request (JSR) altında geliştirilmiştir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
13

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

K Sanal Makinesi (K Virtual Machine)

Daha önce Java programlama dili tecrübeniz varsa bile muhtemelen KVM’yi yeni duyuyor olabilirsiniz. KVM, Java Sanal Makinesinin (Java Virtual Machine) kısıtlı kaynak aletleri için optimize edilmiş şeklidir. Kapladığı bellek alanı bakımından oldukça küçüktür.(yaklaşık 40-80K). KVM 16-bit/32-bit işlemcisi olan 160-512K belleklerde çalışır. KVM long ve float türü veri tiplerini desteklemez bunun sebebi işlem yükünün integer tipine kıyasla fazla olmasıdır.( CLDC1.0 double türünü desteklemezken, CLDC1.1 double türünü desteklemektedir.) K Sanal Makinesi teorik olarak birçok görüntü (profile) ile çalıştırılır, fakat bütün görüntüler (profile) için iyi performans vereceginden söz etmek yanlış olur, örneğin CDC’yi çalıştırmak için kullanılamazlar. Temel olarak CLDC yapılandırıcısını ve sadece MIDP görüntüsünü(profile) çalıştırır. Son K Sanal Makinesi sürümlerinin yetenekleri daha da iyileştirildi, örneğin garbage collector, debug desteği gibi. K Sanal makinesi ve Java Sanal Makinesinin birbirleri ile olan ilişkilerini anlaşılır kılmak için aşağıdaki şekil incelenmelidir.

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o
14

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

C Sanal Makinesi (C Virtual Machine CVM)

ww w. ja
CLDC

CVM’e bize KVM’nin desteklemediği, daha fazla işlevsellik sunar. KVM’ye yakın sığa sunar. Haklı olarak neden CVM’ye gereksinim duyulduğu sorulabilir. Bunun gerekçeleri aşağıda açıklanmıştır. • CVM gerçek zamanlı işletim sistemi ile kullanılır. • Belleği kullanma kapasitesi daha etkindir. Garbage collection duraklama zamanını azaltıyor. • CVM, Java thread’lerini yerel threadlerle doğrudan eşleştirebilir ve ROM’dan java sınıflarını çalıştırabilir. • Belirli sayıda makina komutlarını, eş zamanlı çalıştırabilme yeteneğine sahiptir.

Connected Limited Device Configuration(CLDC) kısıtlı kaynaklı cihazlar için tasarlanmıştır( cep telefonları, PDA vb.). Bundan dolayı herşey optimize edilmiştir, örneğin Sanal Makine (Virtual Machine) küçültülmüştür (KVM ayrıntılı olarak değinildi), Java diline ait bazı özellikler desteklenmemiştir. Diyebiliriz ki, kütüphane olarak çok küçüktür.Fakat,küçük olması işlevsel olmaması anlamına gelmez, bilakis mevcut kütüphanesi oldukça işlevseldir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o
15

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

CLDC’nin temel özellikleri: • Long ve float veri tipleri desteklenmemektedir. J2SE nin kütüphaneleri içinde bu veri tiplerini destekleyen sınıflar CLDC’den çıkarılmıştır.(CLDC1.1 bu veri tiplerini desteklemektedir.) • Çalıştırma zamanı hataları (runtime exception) mevcut fakat sayıca azaltılmıştır. Bunlar o Java.lang.Error o Java.lang.OutOfMemoryError o Java.lang.VirtualMachineError • Garbage Collection basitleştirilmiştir, java.lang.Object sınıfının içinde finalize metodu yoktur. • Java Native Interface (JNI) desteklenmemektedir. • Grup threadler haricindekit hreadler kullanılabilinir. • Farklı güvenlik modeli CLDC’lerde uygulanmaktadır. Standart Edition’daki güvenlik modelinin uygulanmamasındaki en önemli sebep küçük kapasiteli cihazlar için ağır olmasıdır. CLDC’de dört (4) paket (package) mevcuttur. Bunlar 1. java.io: 2. java.lang: 3. java.util: 4. javax.microedition.io:

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o
16

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

CDC

Connected Device Configuration(CDC) ikinci cihazlar için tasarlanmıştır. Bu cihazlarla kastedilen, CLDC’nin hedef cihazları kadar kısıtlı olmayan cihazlardır. CDC hedef cihazlar 32-bit işlemci ve en az 2MB belleklere sahiptirler. Java Standart Edition’nın CLDC’ye gore daha fazla özelliğini sunmaktadır. CLDC’ye gore CDC daha fazla API’ye sahiptir. Eğer CDC kullanıyorsanız bu da uygulamanızın daha fazla işlevsel olduğu anlamına gelir.

ww w. ja

CDC, size ağ(network) uygulamaları için daha fazla destek sunmaktadır ve güvenlik mekanizması daha esnektir. CDC, Foundation Profil ile birlikte kullanılmaktadır (Foundation Profil J2ME profilleri başlığı altında kısaca değinilmiştir.) CDC konfigirasyonu aşağıdaki paketleri içermektedir. • java.io • java.lang • java.lang.ref • java.lang.reflect • java.match • java.net • java.security • java.text • java.text.resources • java.util • java.util.jar • java.util.zip • javax.microedition.io

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil
17

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Display ve Displayable Sınıfları

Display sınıfı, yerel(local) cihaz ekranlarının MIDlet kullanıcı arayüzünü oluşturmasını sağlayan yardımcı sınıftır. Her MIDlet referansı Display sınıfının getDisplay() metoduna parameter olarak yollanır.

ww w. ja

public static Display getDisplay(MIDlet midlet);

MIDlet genellikle getDisplay() metodunu startApp() metodu ilk çağrıldığı zaman uyandırır. Dönen Display nesne referansı Kullanıcı Arayüzü ilk ekranı olarak görüntülenir. Bu metod startApp() metodundan başlayarak destroyApp() ya da notifyDestroyed() metodları arasındaki yaşam döngüsü içinde herhangi bir zaman aralığında çağrılabilinir.

Displayable, MIDlet kullanıcı arayüzünün temel sınıflarından biridir. Direk olarak bu sınıfı kullanmak bize fonksiyonel bir yapı sunmaz ama bu yapıyı direk kullanmak yerine bu sınıftan türetilmiş sınıflar daha kullanışlı bir yapı sunar. Sınıf hiyerarşisi aşağıda belirtilmiştir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

CLDC’ye ek olarak aşağıda anlatılan sınıfları içermektedir. • javax.microedition.midlet: MIDP’de kullanılan uygulama modelini tanımlamaktadır. Sadece MIDlet adında bir sınıfa sahiptir. Bu sınıf otomatikmen create, pause, destroy adındaki metodları aktifleştirmektedir. • javax.microedition.lcdui: Bu paket kullanıcı arayüzünü sunmaktan sorumludur. Bazı Kullanıcı Arayüzü Sınıfları; buttons, text fields, choice groups, gauges, images vb. ve bunların dinleyicileri (listeners). Kısaca denilebilirki oyun programlama için gerekli bir paketdir. • javax.microedition.rms: Bu paket verileri saklama imkanı sunmaktadır. En önemli ve ana sınıfı RecordStore sınıfıdır ve buna ilaveten kıyaslama, listeleme gibi sınıflarda bu paket içinde mevcuttur.

i.c o

CLDC yapılandırıcısı (configuration), küçük kapasitedeki cihazlara uygulama yazmak için kullanılmaktadır, fakat bu yapılandırıcı bize sınırlı işlevsellik sunmaktadır. Örneğin,Kullanıcı Grafik Arayüz (Graphical User Interface) desteği sunmamaktadır. Bu ve diğer nedenlarden dolayı, etkili uygulama geliştirmek için bir tür profile ihtiyaç duyulmaktaır. Tek ve şu ana kadar küçük kapasiteli cihazlar için mevcut profil Mobile Information Device Profile’tır. (MIDP). MIDP görüntüleri(profile) programcıya orta derecede Kullanıcı Grafik Arayüz sunmaktadır. Yeni bir uygulama modeli sunmaktadır. Bu uygulama modelinin ismi de MIDlet’tir. Java’da kod geliştirenler APPlet, SERVlet gibi yapıları bilirler. MIDlet’te bu yapılara benzemektedir. (☺ APPlet/SERVlet/MIDlet ☺ )

m

Mobile Information Device Profile (MIDP)

18

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Belirtildiği gibi Displayable sınıfından türetilmiş iki soyut(abstract) alt sınıf belirtilmiştir. Bu iki alt sınıf javax.microedition.lcdui paketindeki sınıflar için bir başlangıç oluşturmaktadır. İki soyut(abstract) alt sınıfı inceleyelim.

Canvas sınıfı, düşük seviye Kullanıcı Grafik Arayüzünün (GUI) temel taşından biridir. Paint() metodu implement edilerek ekrana çizim yapılabilir. Yine bu sınıf API’leri grafik oyunları için iyi tasarlanmıştır. Kullanıcı veri girişleri bu sınıf yardımı ile yönetilebilinir, örnegin kullanıcı 6 tuşuna bastığını ya da basılı tuttuğunu denetlemek gibi. Bu sınıf çok geniş bir bilgi yumağıdır ama giriş düzeyinde bu kadar bilginin yeterli olacağı düşünülmüştür.

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

CANVAS

dil

i.c o
19

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja
ALERT Sınıfı

public class Display public abstract class Displayable public abstract class Screen extends Displayable public class Alert extends Screen public class Form extends Screen public class List extends Screen implements Choice public abstract class Item public class ChoiceGroup extends Item implements Choice public class DateField extends Item public class TextField extends Item public class Gauge extends Item public class ImageItem extends Item public class StringItem extends Item public class TextBox extends Screen public class Command public class Ticker public class Graphics public interface Choice public abstract class Canvas extends Displayable public class Graphics

Alert sınıfı, kullanıcıya genellikle potensiyel bir hata durumunda ikaz olarak görüntülenir. Uyarı mesajının yanısıra görüntülenmek istenen hertürlü mesajı ekranda gösterir.Alert sınıfının kullanım formatı aşağıda parametreleri ile birlikte verilmiştir.

try{ ………………………………………………………….. } catch(Exception error){ alert = new Alert("Uyari",”Lütfen Bekleyiniz”, image, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert); }
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o

Screen sınıfı, yüksek seviye ekran görünümü için tasarlanmış temel bir sınıftır. Bu sınıfında Canvas gibi soyut(abstract) sınıf olmasının yanında kendisinden türeyen altsınıfları vardır. Screen sınıfının en çok kullanılan/kullanışlı altsınıfı Form sınıfıdır. Bu sınıf kullanıcı arayüzünü tasarlamak için tercih sebebidir çünkü bazı yapıları bu sınıfa ekleyebilirsiniz. Bunun yanı sıra, List, TextBox ve Alert, Screen sınıfından türetilmiş alt sınıflardır. Bu sınıf Canvas sınıfında olduğu gibi bize ekrana çizim yapma ya da tuşları control etme gibi alt seviye işleri yapma imkânı vermemektedir. Bu sınıf, aynı ekranda hem alt seviye hem de üst seviye (low level / high level) API lerini kullanma izinini vermemektedir. Sınıf hiyerarşisini anlamak için aşağıda yazılan mantıksal kodu incelemek gerekir.

m

SCREEN

20

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
Dört parametre almaktadır. Alınan parametreler sırası ile 1. İletişim kutusunun (Dialog Box) başlığı. 2. Görüntülenecek mesajın metni. 3. Metinle birlikte görüntülenmek istenen resim. 4. Uyarının türü. 5 tane farklı tür örneği: a. WARNING b. ALARM c. CONFIRMATION d. ERROR e. INFO

setTimeout() metodu iletişim kutusunun ekranda görüntülenme süresini vermektedir. 1. Alert.FOREVER (Kullanıcı müdahale edene kadar ekranda görüntülenir.) 2. Integer veri tipinde milisaniye türünden sayısal değer. setCurrent() metodu yardımı ile ekranda görüntülenir.

ww w. ja
FORM Sınıfı

Form sınıfı eşzamanlı olarak ekranda çıkan görüntü öğeleri için bir kozadır (Container). Item sınıfından türetilmiş sınıflar burda yer almaktadır. Item sınıfından türetilmiş olan StringItem sınıfı burda görüntülenmek için kullanılan sınıflardan biridir. Bilindiği üzere küçük cihazların ekranlarının küçük olması, Form sınıfına sığdırılmak istenen Item’den türetilmiş birçok sınıfın beraber kullanılmasına engel teşkil etmektedir. Kaydırma çubuğu
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
21

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

public void append(Item item); public void append(Image image); public void append(String string);

ITEM Sınıfı

public class ChoiceGroup extends Item implements Choice public class DateField extends Item public class TextField extends Item public class Gauge extends Item public class ImageItem extends Item public class StringItem extends Item

ww w. ja
ChoiceGroup Sınıfı
EXCLUSİVE MULTIPLE IMPLICIT

Item sınıfı ile Command sınıfı, bazı yönleri ile benzemektedir. İki sınıfta once yaratılır sonra Form sınıfına eklenir. Kullanıcı sizin geliştirdiğiniz uygulamayı kullanırken Item sınıfından türetilmiş iki sınıf hariç, StringItem ve ImageItem, diğer sınıfların statülerini değiştirebilir. Belirtilen iki sınıf static ve kullanıcı tarafından değiştirilemez. ImageItem ekranda bir resmi görüntülemek için kullanılır, StringItem ise yazınsal (text) türünden belirtimleri görüntülemek için kullanılır. Bu sınıfları kısaca anlatalım.

Muhtemelen, grafik arayüzlerinde kullanılan checkboxes ve radio buttons’lara yani çoktan seçmeli tercihlere aşinasınızdır. Checkbox ve radiobutton’lar arasında en bariz fark görünümleri olacaktır. Örneğin cinsiyet ayrımı yaparken redio button’ı kullanabileceginiz gibi birden çok seçmeli olan gösterimde olan sinema filmlerini de checkbox ta görüntülemek mantıklı olacaktır. J2ME; checkbox ve radiobuttonları, ChoiceGroup sınıfı altında tanımlamıştır. ChoiceGroup sınıfı exclusive ve multiple adı altında iki tür tanımlamıştır. exclusive radio buttonlarda, multiple ise checkbox için tanımlanmıştır.

Eş zamanlı tek tercih yapılabilir. (radio button) Hiç ya da birden çok tercih yapılabilir. (check box) Sadece tek tercih yapılabir. (menu list)

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

Item sınıfı, Form sınıfında kullanılan bir çok sınıfın türetildiği ana sınıftır. Item sınıfından türeyen sınıfların listesi aşağıda verilmiştir.

i.c o

m

ile bu durumda aşılmıştır. Form sınıfın iki tane metodu var, bunlar sırası ile insert() ve append() dir. append() metodu parametre olarak aşağıdaki 3 yapıyı kabul eder.

22

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * * @author asin * @version */ public class ChoiceGroupExample ItemStateListener{ private Display display; private Form form; private ChoiceGroup bolum; private int bolum_index; private Command process; private Command exit; private Alert alert; public void startApp() { initialize(); getDisplay().setCurrent(getForm()); } public void pauseApp() { }

extends

ww w. ja
getForm().append(getBolum()); getForm().addCommand(getProcess()); getForm().addCommand(getExit()); getForm().setCommandListener(this); getForm().setItemStateListener(this); } public Display getDisplay() { if(display == null){ display = Display.getDisplay(this); } return display; } public Form getForm() {

public void destroyApp(boolean unconditional) { }

private void initialize(){ append_String("Bilgisayar Muhendisligi", null); append_String("Ele. Muhendisligi", null); append_String("Dis Hekimligi", null);

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
23

dil

i.c o
MIDlet implements

m

Kullanıcı tercihini yaptıktan sonra, itemStateChanged() metodu çağrılır. ItemStateChanded() metodu hangi öğenin seçildiğini tanımlar, getSelectedIndex() ise hangi öge seçilmişşse onun index numarasını dönderir.

CommandListener,

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

} private void append_String(String str, Image img){ getBolum().append(str,img); }

public ChoiceGroup getBolum() { if(bolum == null){ bolum = new ChoiceGroup("Bolumunu Sec", Choice.EXCLUSIVE); } return bolum; } public Command getProcess() { if(process == null){ process = new Command("Process", Command.OK, 4); } return process; } public Command getExit() { if(exit == null){ exit = new Command("Exit", Command.EXIT, 2); } return exit; }

ww w. ja
public void itemStateChanged(Item item) { } }

public void commandAction(Command command, Displayable displayable) { if(command == process){ alert = new Alert("Bolum",getBolum().getString(getBolum().getSelectedIndex()),null, AlertType.INFO); getDisplay().setCurrent(alert); } else if(command == exit){ destroyApp(true); } }

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil
24

i.c o

m

if(form == null){ form = new Form("Bolum"); } return form;

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Bölüm Tercihi yapıldıktan sonra görüntü ekranı

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
25

dil

i.c o

m

CheckBox ile

RadioButton ile

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

DateField sınıfı, ekranda sistem zamanını ve tarihini görüntülemek için kullanılır. Bunu üç modda gösterebiliriz.

Bu sınıfın yapılandırıcısı iki ya da üç tane parametre alabilir. Bunlar aşağıda belirtilmiştir. • • DateField datefield = new DateField("Bugun", DateField.DATE_TIME); DateField datefield = new DateField("Saat", DateField.TIME, timeZone);

DateField sınıfı ile ilgili kod kısmı Item sınıfından türemiş diğer sınıfları anlattıktan sonra bir bütün olarak verilecektir.

Gauge Sınıfı

public Gauge(String etiket, boolean etkileşim, maksimum değer, başlangıç değeri) Etkileşimli olup olmamasını öğrenmek için ise aşağıdaki fonksiyonu çağırırız. public boolean isInteractive()

ww w. ja
public int getMaxValue() public int getValue()

Sonradan ise aşağıda belirtilmiş olan iki metod ile değiştirilebilinir. setMaxValue(int maxValue) setValue(int value)

Progress bar’ın değerleri kullanı tarafından değiştirilemez. Progress bar ın maksimim ve başlangıç değerlerine ulaşmak için ise aşağıdaki iki fonksiyon çağrılır.

StringItem Sınıfı

StringItem sınıfı, daha önceki bölümlerde de değinildiği gibi ekranda mesaj görüntülemeye yarayan bir sınıftır. Bu sınıfı diğer Item sınıfından türemiş sınıflardan farkı ise event sınıfını
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

Gauge sınıfı, Item sınıfından türemiş olan sınıflardan biridir. Bu sınıf “progress bar veya a slider” dediğimiz kavramları oluşturmaya yarar. Bu sınıfın yapılandırıcına dört parametre değeri aktarılır. Progress bar’ın maksimum uzunluğu ve başlangıç değeri parametre olarak verilir. Bunun yanısıra etiketi ve etkileşimli(interactive) olup olmaması değer parametre ifadeleridir.

dil

i.c o

DATE TIME DATE_TIME

Sadece tarihi görüntülemek ve değiştirmek için Sadece zamanı görüntülemek ve değiştirmek için Hem zamanı hem de tarihi görüntülemek ve değiştirmek için

m

DateField Sınıfı

26

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Program geliştiren ise bu sınıf tarafından tanımlanmış iki tane metodu kullanabilir. Bunlar aşağıda belirtilmiştir.

Programlamaya aşina biri için anlaşılması gayet kolay olan bu metodları bu kaynağı programlamaya yeni başlamış arkadaşlar için anlatmakta yarar var. setText() metodu formda belirtilmiş alana text yazmak için kullanılır. getText() metodu ise, setText() metodunun tam tersi bir şekilde, belirlenmiş alandaki metni elde etmek için kullanılır.

TextField Sınıfı

TextField textfield = new TextField("Label", "", MAX_SIZE, TextField.ANY);

ImageItem Sınıfı

ww w. ja
import java.io.IOException; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * * @author asin * @version

İki tür resim ekranda görüntülenebilir. Bunlardan biri değişmez yani statik resim diğer tür ise değişebilir yani dinamik resim türüdür. Biraz daha detaylandırmak gerekirse değişmez resim(immutable image) dediğimiz proğram çalışırtılırken dosyadan yüklenir daha sonra kullanıcı tarafından değiştirilmesine izin verilmeyen resim türüdür. Diğer resim türü ise kullancı tarafından oluşturulan resim türüdür(mutable image). Canvas sınıfından türemiş olan Graphics sınıfının metodları tarafından çizilen resim türüdür. Bu kısımda bu çizim türüne değinilmeyecektir. İleri düzey tekniklerin bilinmesi gerekir. Şimdilik immutable image nasıl yaratılır hangi metod kullanılır ve parametrelerine değinelim. Image resim = Image.createImage(“benimresmim.png/jpeg/..”); Değinildiği gibi sadece tek parametre alır. Resmin bulunduğu dizin yapısının adresi, parametre değeridir.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

• • • •

1. parametre metin alanına verilecek etiketin adıdır. 2. parametre kullanıcı tarafından girilmesi gereken alan. 3. parametre girilmesi gereken metin alanının maksimum boyutu. 4. parametre ise girilecek metnin karakter tipi için sınırlama

dil

TextField sınıfı, kullanıcı tarafından bir ya daha çok satır girşi yapılması düşünülen alanları tanımlamak için kullanılır. Burdaki satır sayısı TextField yaratılırken atanan maksimum değere bağlıdır. TextField sınıfının kullanımı aşağıda belirtilmiştir. Bu sunıf dört tane parametre almaktadır.

i.c o

setText(); getText();

m

desteklemiyor olmasındandır yani başka bir deyişle kullanıcı tarafından değiştirilmiyor olmasıdır. Ekrana basılan text statik bir yapıdadır, kullanıcıdan bağımsızdır.

27

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

public void pauseApp() { }

public void destroyApp(boolean unconditional) { }

private void initialize(){ getItemGroup().append("TextField", null); getItemGroup().append("DateField", null); getItemGroup().append("ImageItem", null); getItemGroup().append("Gauge", null); getForm().append(getItemGroup()); getForm().addCommand(getProcess()); getForm().addCommand(getExit());

ww w. ja
getTempForm().addCommand(getBack()); getForm().setCommandListener(this); getTempForm().setCommandListener(this); getForm().setItemStateListener(this);

} public Display getDisplay() { if(display == null){ display = Display.getDisplay(this); } return display; } public ChoiceGroup getItemGroup() { if(itemGroup == null){ itemGroup = new ChoiceGroup("Seciniz", Choice.EXCLUSIVE); }
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
28

dil

private Display display; private Form form; private Form tempForm; private Command process; private Command exit; private Command back; private DateField date; private TextField textfield; private int MAX_SIZE = 50; private Image image; private ImageItem imageItem; private Gauge gauge; private ChoiceGroup itemGroup; public void startApp() { initialize(); getDisplay().setCurrent(getForm()); }

i.c o

m

*/ public class ItemMidlet extends MIDlet implements CommandListener ,ItemStateListener{

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
return itemGroup; } private Gauge getGauge(){ if(gauge == null){ gauge = new Gauge("Progress Bar", false, 100, 50); } return gauge; } private Form getForm() { if(form == null){ form = new Form("Item sinifi"); } return form; }

ww w. ja

private Form getTempForm() { if(tempForm == null){ tempForm = new Form("Template"); } return tempForm; } private ImageItem getImageItem(){ if(imageItem == null){ try { image = Image.createImage("/images/leaf.png"); imageItem = new ImageItem("benim resmim", ImageItem.LAYOUT_NEWLINE_AFTER,"my image"); } catch (IOException ex) { ex.printStackTrace(); } } return imageItem; } private TextField getTextfield(){ if(textfield == null){ textfield = new TextField("Adiniz", "", MAX_SIZE, TextField.ANY); } return textfield; } private DateField getDate(){ if(date == null){ date = new DateField("Today", DateField.DATE_TIME); } return date; } public Command getProcess() { if(process == null){ process = new Command("Process", Command.OK, 4); } return process; } public Command getBack() { if(back == null){ back = new Command("back", Command.OK, 1); }

dil

i.c o
image,

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

m
29

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
} public Command getExit() { if(exit == null){ exit = new Command("Exit", Command.EXIT, 2); } return exit; }

ww w. ja
} } public void itemStateChanged(Item item) { } }

public void commandAction(Command command, Displayable displayable) { if(command == getProcess()){ getTempForm().deleteAll(); if(getItemGroup().getSelectedIndex() == 0){ getTempForm().append(getTextfield()); getDisplay().setCurrent(getTempForm()); } else if(getItemGroup().getSelectedIndex() == 1){ getTempForm().append(getDate()); getDisplay().setCurrent(getTempForm()); } else if(getItemGroup().getSelectedIndex() == 2){ getTempForm().append(getImageItem()); getDisplay().setCurrent(getTempForm()); } else if(getItemGroup().getSelectedIndex() == 3){ getTempForm().append(getGauge()); getDisplay().setCurrent(getTempForm()); } } else if(command == getBack()){ getDisplay().setCurrent(getForm()); } else if(command == getExit()){

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o
30

m

return back;

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
31

dil

i.c o

m

TextField uygulaması

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
DataField uygulaması

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
32

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ImageItem uygulaması

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
33

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

List Sınıfı

ww w. ja
EXCLUSİVE MULTIPLE IMPLICIT

List sınıfı, bir ya da birden çok öğenin ekranda gösterilmesi için kullanılır. Kullanıcı bu öğelerden bir ya da bir kaçını seçme şansına sahiptir. Checkbox, radio buttonları ve implicit list dediğimiz ne radio butonu ne de check box türünün ikisinide kullanmayan listelemeleri içerir. ChoiceGroup ile List sınıfı aynı fonksiyonel özelliklere sahip olması dikkatlerden kaçmamaktadır. Bunu iki sınıfında Choice interface’ni implement etmesiyle açıklayabiliriz. Akıllara ilk gelen soru şu olacaktır. List sınıfına niye gereksinim duyulmuştur ya da ChoiceGroup sınıfı ile farklılıkları nelerdir? Hatırlanacağı gibi ChoiceGroup sınıfı ait olan eventleri dinleyen itemStateChanged() metodu vardı. List sınıfında yapılan listelemeleri algılayacak commandAction() metodu var. Eventlerin farklı olması tatminkâr bir cevap olmadığının farkındayım. Diğer farklılıklar nelerdir bunları inceleyelim. • List sınıfı Screen sınıfından türemiştir herhangi bir kozaya (Container) ihtiyaç duymamaktadır, bunun aksine ChoiceGroup sınıfı Item sınıfından türemiştir ve Form sınıfına ihtiyaç duymaktadır. • List sınıfını, list item olmadan yapılandırıcısına iki parametre aktararak yaratabiliriz. Birinci parametre string tipinde listenin başlığı, diğer parametre ise List sınıfının formatıdır. Format aşağıdaki tabloda belirtilmiştir. Eş zamanlı tek tercih yapılabilir. (radio button) Hiç ya da birden çok tercih yapılabilir. (check box) Sadece tek tercih yapılabir. (menu list)

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil
34

i.c o

m

Gauge uygulaması

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

append(String etiket, Image resim); insert(int indeks, String etiket, Image resim);

import javax.microedition.midlet.*; import javax.microedition.lcdui.*;

ww w. ja
public void startApp() { initialize(); getDisplay().setCurrent(getList()); } public void pauseApp() { } private void initialize(){ getList().append("Ali Saatci", null); getList().append("Unal Yarimagan", null); getList().append("Ersin Toreci", null); getList().append("Harun Artuner", null); getList().append("Kayhan Imre", null); getList().addCommand(getExit()); getList().setCommandListener(this);

/** * * @author asin * @version */ public class ListMidlet extends MIDlet implements CommandListener{ private Display display; private Command exit; private List list; private Alert alert;

public void destroyApp(boolean unconditional) { }

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil
35

i.c o

m

Liste öğeliri, Listeye append() ya da insert() metodu ile eklenir. append() metodu iki parametre alır, birinci parameter listelenecek öğenin etiketi String türünden diğer parametre image türünden. insert() metodu ise bir fazla parametre alır, liste öğelerinin indeks numarası.

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
} private Display getDisplay() { if(display == null){ display = Display.getDisplay(this); } return display; }

public Command getExit() { if(exit == null){ exit = new Command("Exit", Command.EXIT, 2); } return exit; } private List getList() { if(list == null){ list = new List("Bolum Hocaları", List.IMPLICIT); } return list; }

ww w. ja
} ListMidlet’e ait kodun çıktısı

public void commandAction(Command command, Displayable displayable) { if(command == List.SELECT_COMMAND){ String secilen = getList().getString(getList().getSelectedIndex()); alert = new Alert("Secilen hoca", secilen, null, AlertType.INFO); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert); } else if(command == exit){ destroyApp(false); notifyDestroyed(); } }

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o
36

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Kayıt Depolama (Record Storage)

ww w. ja

Genel olarak diyebilirizki, J2ME de geliştirilen bütün uygulamalar kalıcılığa ihtiyaç duymaktadır. Kalıcılık ifadesi ile anlatılmak istenen MIDlet çalışmıyorken bile veriyi kaybetmemektir. Verilerin kalıcılığı J2SE, J2EE veya J2ME gibi bütün JAVA uygulamalarında ortaktır. Fakat veriyi ele alış yöntemleri farklıdır, bu farkı yaratan nedenlerin başlıcası ve en önemlisi sınırlı kaynak yani küçük el cihazlarında kullanılıyor olmasıdır. Bazı küçük (işlem kapasitesi küçük olan) cihazlar network veritabanı server ya da disk sürücüleri üzerinde J2SE veya J2EE ile geliştirilmiş JAVA uygulamaları aracılığı ile veri aktarımı yapmaktadırlar. Bu nedenden dolayı J2ME uygulamaları verileri kalıcı bellek alanlarına saklayabilmek için Veri Yönetim Sistemi (Record Management System RMS) kullanmaktadırlar. RMS, J2ME uygulamalarında verileri saklamak veya işlemek için kullanılan bir uygulama arayüzüdür. Bu uygulama arayüzünü nasıl kullanacağımızı öğreneceğiz.

Kayıt Depolama (The Record Storage)
RMS verileri kayıt depoları (record store) diye adlandırılan alanlara saklamaktadır. Kayıt depoları, verilen özel bir isimin referens ettigi verileri içermektedir. Diğer JAVA uygulamalarında veritabanı tablolarına (table) karşılık gelmektedir. Kayıt depoları, bir grup kayıtttan ve her kayıtta bir grup veri alanından oluşmaktadır. Daha anlaşılır kılmak için Veritabanı uygulamaları ile
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
37

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

openRecordStore() metodu yeni bir kayıt alanı yaratmak ya da daha önceden yaratılmış bir kayıt alanını açmak için kullanılır. Bu metod iki parametre almaktadır. İlk parametre string türünden kayıt alanının ismi olacak, diğeri ise boolean türünde. İkinci parametre true ise kayıt alanı bulunamadıysa kayıt alanı yaratır yok kayıt alanı mevcutsa yaratmayıp mevcut kaydı açar. Eğer false ise kayıt alanı mevcut ise açar yoksa yeniden yaratmaz. Kod içindeki mevcut yazım şekli aşağıda verilmiştir. Private RecordStore recordStore = RecordStore.openRecordStore(“BenimKayıtAlanım”, true/false);

closeRecordStore()metodu ise daha önceden açılmış veri alanını kapatmak için kullanılır. Parametre almaz. Kod içindeki mevcut yazım şekli aşağıda verilmiştir. recordStore.closeRecordStore ();

Kayıt Alanına Yazmak ve Kayıt Alanından Okumak (Writing and Reading Records)
RMS’te kayıt alanlarını açmayı ve kapatmayı öğrendikten sonra, şimdi de açılan kayıt alanlarına veriler nasıl yazılır ve yazılan veriler ya da mevcut verilerin nasıl okunacağını göreceğiz. Burada iki teknikten bahsedeceğiz, birincisi bir sütunluk string türünden veri yazıp, okuma. Diğer bir teknik ise birden çok sütüna, birden çok veri türünden veri yazmak ya da okumak. Kayıt alanına veri yazmak için addRecord() metodu kullanılır. Bu metod üç parametre almaktadır. Birincisi byte dizisi, kayıt alanına yazılacak string in byte türünden ifadesidir. İkinci parameter ise kayıt alanına yazılacak byte dizisinin ilk byte’ın index değeri. Üçüncü parameter ise kayıt alanına yazılacak toplam byte değeridir. Genellemek istersek ikinci parametre 0 değerini, üçüncü parametre ise byte dizisinin boyudur. Kod içindeki mevcut yazım şekli aşağıda verilmiştir.

ww w. ja
recordStore.getRecord(2, benimByteDizim, 0);

Kayıt alanından veri okumak için getRecord() metodu kullanılır. Bu metod byte dizisi dönderir. Üç parametreye gereksinim duyar. Birinci parametre kayıt numarası, ikinci parametre byte dizisi, üçüncü parametre ise tamsayı türünden, kayıt alanındaki byte dizsinin hangi byte tan itibaren copyalanacağı bilgisini içerir. Kod içindeki mevcut yazım şekli aşağıda verilmiştir.

Kayıt Listeleme (Record Enumeration)
Kayıt alanı, veri tabanı yonetim sistemiden çok kütük sistemini andırıyor. Örneğin, SQL sorgusunu kayıt alanına yollayamazsınız ya da arama anahtarına gore sorgulama yapamazsınız.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o

Kayıt Alanı Açmak ve Kapatmak (Opening and Closing Record Store)

m

kıyaslamak mümkün. Kayıtları row diye, kayıttaki veri alanları ise column ile eşleştirmek anlamamıza yardımcı olacaktır. RMS, yaratılan her kayıt için biricik tamsayı değeri aktarmaktadır ve bunu kayıt tanımlayıcısı (record ID) olarak tanımlamaktadır. Record ID bizim kaydımızın primary anahtarı olarak tanımlanabilinir.

38

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

enumerateRecords() metodu RecordEnumeration türünde bir veri yapısı dönderir. Kod içindeki mevcut yazım şekli aşağıda verilmiştir. Parametre alanları kayıt filtreleme (record filter), kayıt karşılaştırma (record comparator) alanlarına NULL atanmış ve günleme (update) alanına ise false atanmış. RecordEnumeration recordEnumeration = recordStore.enumerateRecords(null, false); null,

hasNextElement() metodu değerlendirmek için kullanılır.

RecordEnumeration

dil
listesinde

nextRecord() metodu RecordEnumeration listesindeki gelecek olan kaydın kopyasını dönderen kod segmentidir. Dönderilen kayıt String sınıfının yapılandırıcısına parametre olarak aktarılır.

ww w. ja
Kayıt Listesinden birden çok sütün okumak readUTF() readBoolean() readInt() ………..

String string = new String( recordEnumeration. nextRecord() );

Genel olarak diyebilirizki, birden çok sütün okumanın daha önce anlatılan bir sütün okumak arasında cok fazla farkı olmadığını göreceğiz. getRecord() metodu farklı olarak bir parametre alacaktır. Kaydın tanımlayıcı değeri (record ID). Kayıt ID si belirtilen kayıt RecordEnumeration a kopyalanır. Kayıt ID değeri nextRecordId() metodu tarafında döndürülür. //String dönderir //Boolean dönderir //Tamsayı dönderir //…. dönderir

Kayıt Listesini Sıralama

RecordEnumeration listesindeki kayıtlar RecordComparator interface’ni implement eden sınıf tarafında listelenir. Karşılaştırıcı (comparator) sınıfı içinde tanımlanmış bir metod elindeki
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

while( recordEnumeration.hasNextElement() ){ // gerekli işlemler // gerekli işlemler }

i.c o
kayıt olup

enumerateRecords() metodunu inceleyelim. Kayıt listesini elde edebilmek için kullanılır. Üç tane parametre alır. Birinci parametre kayıt alanından dönen kayıdı filtrelemek için kullanılır.(record filter) İkinci parametre kayıt alanından dönen kayıdı karşılaştırmak için kullanılır. Üçüncü parametre kayıt alanından dönen kayıdın üzerinde değişiklik yapılabilmesine izin vermek için kullanılır.

m

Bunların hepsi herhangi bir veri tabanı yönetim sisteminde yapalabilen işlemlerdir. Kaydı aramak ya da listelemek için bir uygulama arayüzüne ihtiyacınız var. Bunu J2ME’de RecordEnumeration adı ile adlandırılan arayüz(interface) yapmaktadır.

olmadığını

39

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Karşılaştırılan iki byte dizisi aynı ise RecordComparator.EQUIVALENT Karşılaştırılan birinci byte dizi ikincisiyi takip ediyorsa RecordComparator.FOLLOW

Karşılaştırılan birinci byte dizi ikinciden once geliyorsa RecordComparator.PRECEDES Kayıt depolama ile ilgili • Kayıt alanı açmak ve kapatmak • Kayıt alanı okumak ve yazmak • Kayıt alanı listeleme Anlatılan işlemlerin tümü bir arada kodlanmıştır. /* * RecordStore.java * * Created on January 9, 2007, 5:56 PM */

ww w. ja
public void pauseApp() { } private void initialize(){ getForm().addCommand(getProcess());

import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.rms.*; import java.io.*; /** * * @author asin * @version */ public class RecordStore extends MIDlet implements CommandListener{ private Display display; private Command exit; private Command process; private Alert alert; private Form form; private javax.microedition.rms.RecordStore recordStore = null; public void startApp() { initialize(); getDisplay().setCurrent(getForm()); }

public void destroyApp(boolean unconditional) { }

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil
40

i.c o

m

(current) kayıt ile bir sonraki kaydı karşılaştırıp mantıksal bir sonuç dönderir. Karşılaştırma yapan metodun adı compare(), iki parametre alır, iki tane byte dizisi, biri şu an elde olan (current), digeri bir sonraki kayıt (next) tir. Döndürülen mantıksal değerler

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

} private Display getDisplay() { if(display == null){ display = Display.getDisplay(this); } return display; }

public Command getExit() { if(exit == null){ exit = new Command("Exit", Command.EXIT, 2); } return exit; } public Form getForm() { if(form == null){ form = new Form("Kayit Alani"); } return form; }

ww w. ja
createRecordStore(); writeRecordStore(); readRecordStore(); closingRecordStore(); deleteRecord(); } else if(command == getExit()){ destroyApp(false); notifyDestroyed(); } }

public void commandAction(Command command, Displayable displayable) { if(command == getProcess()){

private void createRecordStore(){ //Kayit Alan? yarat?r ya da var olan kay?t alan?n? açar. //Hata olu?ursa ekranda hata mesaj? olu?turur try{ recordStore = javax.microedition.rms.RecordStore.openRecordStore("myRecordStore", true); }catch(Exception e){
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

public Command getProcess() { if(process == null){ process = new Command("Process", Command.OK, 4); } return process; }

dil
41

i.c o

m

getForm().addCommand(getExit()); getForm().setCommandListener(this);

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

} } private void writeRecordStore(){ try{ byte[] byteArray; String name = "Asin AKDENIZ"; int number = 20221427; boolean outputBoolean = true;

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); DataOutputStream outputDataStream = new DataOutputStream(outputStream);

}catch(Exception e){ alert = new Alert("Kayit Yazarken Hata Olustu", e.toString(), null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert); }

ww w. ja
private void readRecordStore(){ try{ String name = null; int number = 0; boolean inputBoolean = false; byte[] byteInputData = new byte[200];

}

ByteArrayInputStream inputStream = new ByteArrayInputStream(byteInputData); DataInputStream inputDataStream = new DataInputStream(inputStream); for (int x = 1; x <= recordStore.getNumRecords(); x++) { recordStore.getRecord(x, byteInputData, 0); name = inputDataStream.readUTF(); number = inputDataStream.readInt(); inputBoolean = inputDataStream.readBoolean(); inputStream.reset(); }
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

byteArray = outputStream.toByteArray(); recordStore.addRecord(byteArray, 0, byteArray.length); outputStream.reset(); outputStream.close(); outputDataStream.close();

dil
42

outputDataStream.writeUTF(name); outputDataStream.writeInt(number); outputDataStream.writeBoolean(outputBoolean); outputDataStream.flush();

i.c o

m

alert = new Alert("Kayit Yaratilirken Hata Olustu", e.toString(), null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert);

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

}catch(Exception e){ alert = new Alert("Kayit Okurken Hata Olustu", e.toString(), null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert); } } private void closingRecordStore(){ try{ recordStore.closeRecordStore(); }catch (Exception error){ alert = new Alert("Kayit Alani Kapatilirken Hata Olustu", error.toString(), null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert); } } private void deleteRecord(){

ww w. ja
} }

if ( javax.microedition.rms.RecordStore.listRecordStores() != null){ try{ javax.microedition.rms.RecordStore.deleteRecordStore("myRecordStore"); }catch (Exception error){ alert = new Alert("Kayit Alanini Silerken Hata Olustu", error.toString(), null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert); } }

Geliştirlen kodun çıktısını aşağıdaki simulasyon üzerinde görebiliriz.

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va

dil

i.c o

alert = new Alert("Reading", "Adi:"+name + "\nNumarasi" +number + "\n" + inputBoolean, null, AlertType.WARNING); alert.setTimeout(Alert.FOREVER); getDisplay().setCurrent(alert);

m
43

inputStream.close(); inputDataStream.close();

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
44

dil

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Eğer belgeyi baştan sona dikkatlice, örnekleri çalıştırarak ve hatta üzerinde oynamalar yaparak okuduysanız artık J2ME çatısının temel kavram ve işlevleri hakkında önemli derecede fikir sahibi olduğunuzu söyleyebiliriz. . Başlangıç düzeyinde hazırlananlar bu belgede J2ME ile sorunsuz bir şekilde tanışılması hedefiyle, önemli kavramlara ve öğrenme döneminde sorun çıkartabileceği düşünülen noktalara öncelik tanıyarak yer verilmeye çalışıldı. Belgenin içerisinde de sık sık belirtildiği gibi burada birçok konuda J2ME'nin sağladığı tüm seçeneklere yer vermek yerine en sık kullanılanara değinilmeye ve örneklerde bunların kullanımına özen gösterildi. Böyle bir tercih yapılmasının sebebi öğrenme döneminde kafa karışıklığının ortaya çıkmasından sakınmaktı. Ancak şu andan itibaren sağlanılan tanışıklılık sayesinde başvuru belgesi (reference manual), javadoc belgeleri vb. geniş kapsamlı kaynaklardan yararlanmakta zorluk çekilmeyeceği ön görülebilir.

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
45

dil

i.c o

Sonuç

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Terimler Sözlüğü
Konfiguration Profile Java Virtual Machine K Virtual Machine CDC Yapılandırıcı Görüntü, profil

Java Sanal Makinesi K Sanal Makinesi Bağlantılı Cihaz Yapılandırıcısı

CLDC

Bağlantılı Sınırlı Cihaz Yapılandırıcısı Taşınabilir Bilgi Cihaz Görüntüleyicisi Koza

Container Constructor File

ww w. ja
Kütük Interface Arayüz Paket Kayıt Package Record Specification Application Belirtim Uygulama

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
Yapılandırıcı

MIDP

dil
46

i.c o

m

HACETTEPE ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ

Kitabın Adı
J2ME: The Complete Reference J2ME in a Nutshell Wireless Programming with J2ME Java in Small Things

Yazarı
James KEOGH Kim TOPLEY

Dreamtech Software Team

James WHITE, David HEMPHILL

ww w. ja

Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. fatihg@cs.hacettepe.edu.tr

va
47

dil

i.c o

m

Kaynaklar

Sign up to vote on this title
UsefulNot useful