J2ME – List UI Bileşeni

Kullanıcı girişlerinde sadece karakter girişleri yeterli olmayabilir. Bazı durumlarda kullanıcıya belirli değerleri seçtirmek isteyebiliriz işte böyle durumlarda List sınıfını kullanıyoruz. List bir dizi değer içerisinden bir ve bir kaçını seçmemize yarayan UI (User Interface) bileşenidir.
List yapısı aşağıdaki gibidir.

List (String title, int listType);


List sınıfının iki adet kurucu metodu vardır. Bunlar title ve listType tır.

title - List üzerinde görünecek başlık
listType - List in biçimi

Örnek bir list tanımlayacak olursak

    List liste= new List("Ürünler",1);

Yukarıdaki örnekte liste adında ve List sınıfı tipinde bir nesne yarattık bu nesneye iki adet kurucu metod parametresi gönderdik “Ürünler” ve 1 bu parametrelere göre liste nesnemizin başlığı Ürünler tipide 1 olacaktır.
List içerisine veri eklemek için List.append() metodu kullanılır. Kullanım şekli aşağıdaki gibidir.

List.append(String stringPart, Image imagePart);

append() metodu sırasıyla iki adet parametre alır. Bunlar yazı (String) içeriği ve resim (Image) içeriği. Image yaratmak zorunlu değildir eğer elimizde bir resim yok ise Image nesnesi olarak null atayabiliriz. Bu durumda ekranda herhangi bir resim görünmeyecektir.
Kodumuzu örneklendirecek olursak.

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet {
        public void startApp() {
     
            List liste= new List("Ürünler",List.EXCLUSIVE);
            liste.append("Bilgisayar", null);
            liste.append("Telefon", null);
            liste.append("DVD", null);
           
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
    }

Bu MIDlet in ekran görüntüsü aşağıdaki gibidir.
list-1

Göründüğü gibi üç adet ürün listelenmiş ve bunlardan birini seçme hakkı sağlanmıştır. Üst bölümde ise Ürünler başlığı bulunmaktadır. Image olarak null verdiğimiz için listemizde herhangi bir resim görünmüyor. Bunu resimli olarak göstermek istersek kodumuz aşağıdaki gibi olmalıdır.

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet {
        public void startApp() {
           
            Image resim= null;
            try{
                resim=Image.createImage("/resim.jpg");
            }
            catch(Exception e){
                System.out.println("Resim oluşturulamadı");
            }
            List liste= new List("Ürünler",List.EXCLUSIVE);
            liste.append("Bilgisayar", resim);
            liste.append("Telefon", resim);
            liste.append("DVD", resim);
           
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
    }

Resim yaratırken createImage() metodumuzu try-catch blokları arasına almamız gerekiyor aksi derleme anında uygulama derlense bile potansiyel hata durumunda olduğumuzu söyleyip derleme işlemini yapmayacaktır. Az öncekinden farklı olarak kodumuzda liste.append() derken imagePart alanına Image sınıfı tipindeki resim nesnesini gönderiyoruz.
Bu durumda uygulamanın ekran görüntüsü aşağıdaki gibi olur.

list-2

Göründüğü gibi listemizin yanında birer adet resim görünüyor. Bu resimler her satır için farklı birer Image olabilir ancak bu uygulamamızın bellek boyutunu artırabilir.

TextBox’ ta olduğu gibi List sınıfında da bazı tip kolaylıkları sağlanmıştır. List sınıfının ikinci parametresi olan listType ile değişik tiplerde listeler yaratabiliriz.

IMPLICIT - Liste üzerinde gezinme
EXCLUSIVE - Tek seçim
MULTIPLE - Çoklu seçim

Bu değerler List sınıfının static değişkenleridir dolayısıyla değiştirilemez ve nesnelerini yaratmaya gerek yoktur. Herhangi bir yerde çağırmak için List.EXCLUSIVE şeklinde kullanırız.
Bu üç tipi tek tek deneyecek olursak

IMPLICIT
Bazen sadece liste şeklinde bir ekran ve sadece bir nesnenin seçilmesi ile işlemimizi gerçekleştirmek isteyebiliriz. Buna örnek telefon defterimiz olabilir. Daha detaylı örnek verecek olursak Nokia marka telefonlarda telefon defteri IMPLICIT tipinde bir List sınıfı nesnesidir tabi burada J2ME kullanılmamış olsa bile Java’ nında bu kütüphaneleri kullandığını varsayarsak (Yüksek seviye bileşen olmasından dolayı) aslında aynı tip bileşenlerdir. Bu durumda bizde bu tarz bir telefon defteri için IMPLICIT tipinde List kullanırız.

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet {
        public void startApp() {
     
            List liste= new List("Ürünler",List. IMPLICIT);
            liste.append("Bilgisayar", null);
            liste.append("Telefon", null);
            liste.append("DVD", null);
           
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
    }

Yukarıdaki MIDlet içerisinde IMPLICIT tipinde bir List vardır. Bu MIDlet in ekran görüntüsü aşağıdaki gibi olur.

list-3

Görüldüğü gibi List sadece düz bir listeden oluşmakta ve seçtiğimiz anda işlem yapma olanağı sağlamaktadır. Bazı durumlarda form oluşturup adımlar ile ilermek veya birden fazla seçeneği işaretlemek isteyebiliriz böyle durumlarda bu tipi kullanamayız.

EXCLUSIVE
Adımlardan oluşan form doldurma gibi işlemlerde tek bir seçim yapmak istiyorsak EXCLUSIVE tipindeki List nesnelerini kullanırız. Bu nesneler web yada diğer uygulama ortamlarından tanıdığımız radiobutton tiplerine benzerler.

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet {
        public void startApp() {
     
            List liste= new List("Ürünler",List.MULTIPLE);
            liste.append("Bilgisayar", null);
            liste.append("Telefon", null);
            liste.append("DVD", null);
           
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
     
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
    }

Yukarıdaki MIDlet kodumuzu derleyip çalıştırırsak ekran görüntümüz aşağıdaki gibi olur.

list-4

Görüldüğü gibi sadece tek bir seçenek imkanı olan bir liste var. Bu liste ile bir adım seçilip sonraki adıma geçilebilir. IMPLICIT e göre farkı önce seçilmesi sonra işlemin yapılmasıdır.

MULTIPLE
Çoklu seçimler için MULTIPLE tipindeki List sınıflarını kullanırız. Bu bize adından da anlaşılacağı gibi birden çok seçim yapma imkanı sağlar. MULTIPLE nesnesi sıralı checkbox lar şeklindedir. Kullanım şekli diğer nesnelerle aynı olup sadece List tipini değiştirmek yeterlidir.

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet{
        List liste=null;
        public void startApp() {
     
            liste= new List("Ürünler",List.EXCLUSIVE);
            liste.append("Bilgisayar", null);
            liste.append("Telefon", null);
            liste.append("DVD", null);
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
            System.out.println(liste.getSelectedIndex());
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
        public void commandAction (Command c, Displayable s){
        }
    }

Yukarıdaki kodumuzun ekran çıktısı aşağıdaki gibidir.

list-5

Buradaki fark gördüğümüz gibi iki veya daha çok alanı işaretleyebilmemizdir. Aynı şekilde bu tip List nesnelerinde de resim kullanabiliriz.

Satır Yakalama
Seçilen satırların bulunması yada yakalanması işlemleri daha çok Command lar içerisinde kullanılır (Command ları ileriki adımlarda göreceğiz). Tek seçim ve çoklu seçimlerde farklı yakalama türleri vardır. Bunlar için List sınıfının bazı metodları kullanılır.

getSelectedIndex()
List içerisine eklediğimiz seçeneklerin hangilerinin işaretlendiği yada yakalandığını bulmak için List sınıfının getSelectedIndex() metodunu kullanırız. Bu metod hangi satırdaki elemanın seçildiğini döndürür. Satırlar 0 dan başlar ve satır sayısı boyunca devam eder. Ancak çoklu seçim imkanı sağlayan MULTIPLE tip liste sınıflarında sonuç her koşulda -1 yani herhangi bir seçim yapılmamıştır döndürebileceği değer tek bir satır olduğundan hangi satırı döndüreceğini bilemez. IMPLICIT ve EXCLUSIVE tiplerde böyle bir şey geçerli değildir.

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet{
        List liste=null;
        public void startApp() {
     
            liste= new List("Ürünler",List.EXCLUSIVE);
            liste.append("Bilgisayar", null);
            liste.append("Telefon", null);
            liste.append("DVD", null);
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
            System.out.println(liste.getString(2));
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
        public void commandAction (Command c, Displayable s){
        }
    }

Yukarıdaki kod bloğu bize List tipindeki liste nesnesinin hangi satırının seçili olduğunu gösterir. Ancak bu durumda 0 dönecektir çünkü standart olarak ilk eleman seçili gelir. Biz bu adımda herhangi bir seçim sonrası hareket (action) yapmadığımız için seçimimizde daha sonrada değişiklik yapsak dahi bu seçim yakalanamayacaktır. Bu konuyu Command’ lar bölümünde işleyeceğiz.

getString( int elementNum )
Seçili satırların yakalanması sonrası içeriği alınmak istenebilir genel olarakta istenen budur. getString() metodu gönderdiğimiz satır numarasına (index) göre o satırın text içeriğini döndürür.

    System.out.println(liste.getString(2));

Yukarıda liste.getString(2) ile 2 numaralı yani 3. sıradaki seçeneğin text değerini alıp konsola yazdırıyor.
Aslında seçim bu şekilde kod içine gömülerek değil seçili satır belirtilerek yapılır. Bu durumda

    System.out.println(liste.getString(liste.getSelectedIndex()));

yerine

    import javax.microedition.midlet.*;
    import javax.microedition.lcdui.*;
     
    public class OrnekMIDlet extends MIDlet{
        List liste=null;
        public void startApp() {
     
            liste= new List("Ürünler",List.EXCLUSIVE);
            liste.append("Bilgisayar", null);
            liste.append("Telefon", null);
            liste.append("DVD", null);
            Display ekran=Display.getDisplay(this);
            ekran.setCurrent(liste);
            Image resim= liste.getImage(0);
        }
       
        public void pauseApp() {
        }
       
        public void destroyApp(boolean unconditional) {
        }
        public void commandAction (Command c, Displayable s){
        }
    }

yazmamız gerekiyor.

İstenilen satırdaki resmi almak için getImage metodu kullanılır. Bu metod Image tipinde bir nesne döndürür ve bu seçili satırdaki imagePart’ ın referansını gösterir.

     

Image resim= liste.getImage(0) satırında ilk satırdaki resmi almış olduk. Aynı şekilde burada da liste.getImage(liste.getSelectedIndex()) diyerek seçili satırı alabiliriz.

Dec 23rd, 2008
Tags: , ,
  1. Mehmet
    Mar 16th, 2010 at 23:43 | #1

    Bildiğim kadarıyla listi form içerisinde kullanamıyoruz. Bunu kullanabiliecğimiz bir örnek yazarmısınız?
    Mesela bir textbox’tan girilen metne göre filtreleme uygulaması…

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>