SlideShare a Scribd company logo
JAVA 2 MICRO EDITION
Andino Maseleno


Diterbitkan pertama kali tahun 2003
Bab 1 – Pemrograman Java




Bab 1

Pemrograman Java

        Bahasa Java awalnya bernama Oak, yakni bagian dari projek Green yang dikembangkan
oleh Sun Microsystem untuk memprogram perangkat-perangkat elektronik rumah tangga semacam
televisi. Namun pada perkembangannya, bahasa Oak ini menjadi bahasa yang bisa digunakan untuk
pemrograman secara umum dan dikenal menjadi bahasa Java saat ini.
        Java sebagai bahasa pemrograman dikenal sebagai bahasa pemrograman tingkat tinggi
dengan kriteria sebagai berikut:
1. Sederhana(Simple)
   Java dirancang untuk mudah dipelajari, terutama bagi programmer-programmer yang telah
   mengenal C/C++ akan mudah sekali untuk berpindah ke Java.
2. Berorientasi Objek(Object Oriented)
   Rancangan berorientasi objek merupakan suatu teknik yang memusatkan rancangan pada
   data(objek) dan interface. Java merupakan bahasa pemrograman berorientasi objek.
3. Terdistribusi(Distributed)
   Java memiliki library rutin yang luas untuk dirangkai pada protokol TCP/IP dengan mudah.
4. Kuat(Robust)
   Java dirancang sebagai bahasa pemrograman yang handal. Java dimaksudkan untuk membuat
   suatu program yang benar-benar dapat dipercaya dalam berbagi hal. Java banyak menekankan
   pada pengecekan awal untuk kemungkinan terjadinya masalah, pengecekan pada saat run time
   dan mengurangi kemungkinan timbulnya kesalahan(error).
5. Aman(Secure)
   Java dirancang sebagai bahasa pemrograman yang aman. Java membuat suatu sistem yang
   mekanisme keamanannya benar-benar sulit dikecoh.
6. Netral Arsitektur(Arsitecture Neutral)
   Java Compiler yang digunakan untuk mengkompilasi kode program Java dirancang untuk
   menghasilkan kode yang netral terhadap semua arsitektur perangkat keras.
7. Portable
   Dengan semboyan write once run everywhere, Java dirancang untuk dapat dijalankan di semua
   platform.



                                                                                              1
Andino Maseleno
Bab 1 – Pemrograman Java




8. Interpreter
   Interpreter Java dapat mengeksekusi kode byte Java secara langsung pada komputer-komputer
   yang memiliki interpreter.
9. Kinerja Tinggi(High Performance)
   Java dirancang untuk menghasilkan aplikasi dengan performansi yang terbaik.
10. Multithreaded
   Multithreading adalah kemampuan sebuah program untuk melakukan lebih dari satu pekerjaan
   sekaligus.
11. Dinamis
   Java adalah bahasa pemrograman yang dinamis. Java dirancang untuk beradaptasi dengan
   lingkungan yang terus berkembang.


Alasan Java digunakan untuk aplikasi wireless
       Ada beberapa alasan mengapa harus Java dipilih untuk aplikasi komunikasi bergerak:
1. Java merupakan bahasa pemrograman yang aman. Hal ini disebabkan karena kode Java harus
   selalu dieksekusi dengan Java Virtual Machine(JVM), yang menyediakan lingkungan yang
   aman untuk eksekusi kode yang telah di-download. Sebuah aplikasi biner dapat mengacaukan
   sebuah peralatan(misalnya tampilan bue screen pada handphone) namun aplikasi Java, dalam
   hal yang paling buruk, hanya dapat mengacaukan Virtual Machine-nya saja.
2. Bahasa pemrograman Java adalah bahasa yang kokoh. Penggunaan Garbage Collector akan
   mengurangi waktu yang diperlukan oleh programer untuk menemukan kebocoran dalam
   penggunaan memori. Demikian pula penggunaan mekanisme exception pada Java mampu
   meningkatkan kemampuan programmer dalam membuat aplikasi yang kokoh.
3. Portabilitas Java sangat berguna dalam aplikasi-aplikasi wireless. Pertama, dengan menulis
   sebuah program saja, aplikasi tersebut dapat dijalankan di berbagai peralatan. Alasan kedua
   karena aplikasi-aplikasi tersebut dapat dikirimkan kesebuah peralatan melalui jaringan
   wireless(proses ini sering dinamakan Over-the-air, atau OTA provisioning).


Java Virtual Machine (JVM)
       Kode program Java dapat ditulis menggunakan editor teks seperti Notepad, Textpad
maupun JCreator dan lain sebagainya. Java compiler yang digunakan untuk mengkompilasi kode


                                                                                             2
Andino Maseleno
Bab 1 – Pemrograman Java




program Java dirancang untuk menghasilkan kode yang netral terhadap semua arsitektur perangkat
keras(hardware) yang disebut sebagai Java bytecode(*.class).
        Java Virtual Machine (JVM) menjadi bagian dari teknologi Java yang menyediakan media
untuk menjalankan aplikasi Java(Java bytecode). Java bytecode dapat dianggap sebagai kode-kode
mesin dari JVM. Selanjutnya JVM akan menginterpretasikan kode-kode tersebut menjadi kode
native atau kode mesin dari arsitektur yang bersangkutan. Java dirancang untuk dapat dijalankan di
semua platform baik itu Linux, Windows, Netware maupun Macintosh serta dapat dijalankan pada
arsitektur perangkat keras yang berbeda, seperti Intel, AMD, Sun Sparc, PowerPC dan lain
sebagainya. Jadi, aplikasi Java tidak perlu dikompilasi ulang jika telah dikompilasi di suatu
platform dan akan dijalankan di platform yang berbeda dengan platform saat dikompilasi, karena
aplikasi Java dijalankan di atas JVM.

                                        *.java

                                                     Java
                                                    Compiler



                                                            *.class




                                                 Java Interpreter




                                           Native Code
                                            Executed

                                                                      Computer

                                 Gambar 1.1 Proses Kompilasi Kode Java


Java Application Programming Interface (Java API)
Ada berbagai fitur yang ditawarkan oleh Java API untuk mengembangkan aplikasi Java, antara lain
sebagai berikut :
1. Applet
    Java Applet merupakan program Java yang berjalan di atas browser. Penggunaan applet ini
    akan membuat halaman HTML lebih dinamis dan menarik.
2. Java Networking


                                                                                                 3
Andino Maseleno
Bab 1 – Pemrograman Java




    Java Networking merupakan sekumpulan API yang menyediakan fungsi-fungsi untuk aplikasi
    jaringan. Java Networking menyediakan akses untuk TCP, UDP, IP Address dan URL. Java
    Networking tidak menyediakan akses untuk ICMP, karena alasan sekuritas dan pada kondisi
    umum hanya administrator yang dapat memanfaatkan protokol ICMP.
3. Java Database Connectivity(JDBC)
    JDBC menyediakan sekumpulan API untuk mengatur keamanan mengakses database seperti
    Oracle, MySQL, PostgreSQL, Microsoft SQL Server.
4. Java Server Pages(JSP)
    JSP adalah suatu teknologi web berbasis bahasa pemrograman Java dan berjalan pada platform
    Java. JSP merupakan pengembangan dari Servlet serta merupakan bagian dari teknologi Java 2
    Platform, Enterprise Edition(J2EE).
5. Java Card
    Java Card digunakan untuk aplikasi-aplikasi pada smart card, sebagai contoh yaitu SIM Card
    pada handphone.


Teknologi Java
1. Java 2 Platform, Standard Edition (J2SETM)
         Platform digunakan untuk menjalankan dan mengembangkan aplikasi Java pada level
Personal Computer (PC). Platform ini berisi class-class inti pada Java dan Graphical User Interface
(GUI).
2. Java 2 Platform, Micro Edition (J2METM)
         Platform ini digunakan untuk menjalankan dan mengembangkan aplikasi-aplikasi Java
pada handheld devices atau perangkat-perangkat semacam handphone, Personal Digital
Assistance(PDA) dan PocketPC.
3. Java 2 Platform, Enterprise Edition (J2EETM)
         Platform ini berupa paket yang berisi class-class dan interface-interface yang digunakan
untuk menjalankan dan mengembangkan aplikasi Java berbasis web, seperti class-class Servlet,
Java Server Pages(JSP) dan Enterprise Java Beans(EJB) serta Java CORBA.




                                                                                                4
Andino Maseleno
Bab 1 – Pemrograman Java




        Lingkungan kerja teknologi Java dapat digambarkan seperti gambar 1.2 dibawah ini:




                                        Gambar 1.2 Platform Java 2



Variabel pada Java
Variabel merupakan container yang digunakan untuk menyimpan suatu nilai pada sebuah program
dengan tipe tertentu. Pada dasarnya ada dua macam tipe variabel data dalam bahasa Java, yakni tipe
primitif dan tipe reference. Tabel di bawah ini menunjukkan tipe primitif pada Java.

         Tabel 2.1 Tipe primitif pada Java
            Keyword                 Description                      Size/Format

                                              (integers)

            byte        Byte-length integer                  8-bit two's complement

            short       Short integer                        16-bit two's complement

            int         Integer                              32-bit two's complement

            long        Long integer                         64-bit two's complement

                                          (real numbers)

            float       Single-precision floating point      32-bit IEEE 754

            double      Double-precision floating point      64-bit IEEE 754

                                             (other types)


                                                                                               5
Andino Maseleno
Bab 1 – Pemrograman Java




            char           A single character                   16-bit Unicode character

            boolean A boolean value (true or false) true or false

Contoh program

 //MaxVariablesDemo.java
 public class MaxVariablesDemo {
     public static void main(String args[]) {

           // integer
           byte largestByte =      Byte.MAX_VALUE;
           short largestShort      = Short.MAX_VALUE;
           int largestInteger      = Integer.MAX_VALUE;
           long largestLong =      Long.MAX_VALUE;

           // real
           float largestFloat = Float.MAX_VALUE;
           double largestDouble = Double.MAX_VALUE;

           char aChar = 'S';
           boolean aBoolean = true;

           System.out.println("Nilai        terbesar   byte :" + largestByte);
           System.out.println("Nilai        terbesar   short :“ + largestShort);
           System.out.println("Nilai        terbesar   integer : " + largestInteger);
           System.out.println("Nilai        terbesar   long : " + largestLong);

           System.out.println("Nilai terbesar float : " + largestFloat);
           System.out.println("Nilai terbesar double : " + largestDouble);

           if (Character.isUpperCase(aChar)) {
               System.out.println("The character " + aChar + " is upper case.");
           } else {
               System.out.println("The character " + aChar + " is lower case.");
           }
           System.out.println("Nilai boolean : " + aBoolean);
      }
 }



Sedangkan tipe data variabel berupa reference terdiri atas tipe variabel data:

    tipe class
    tipe array
    tipe interface


Operator pada Java
Operator pada Java dibedakan menjadi beberapa jenis, yaitu:
   Operator Aritmetika



                                                                                                  6
Andino Maseleno
Bab 1 – Pemrograman Java




   Operator Relasional

   Operator Kondisional

   Operator Shift dan Lojik

   Operator Assignment

   Operator lainnya

Operator Aritmetika

    Tabel 2.2 Operator aritmatika
        Operator          Penggunaan                       Deskripsi
    +                     op1 + op2 Menambahkan op1 dengan op2

    -                     op1 - op2 Megurangkan op1 dengan op2

    *                     op1 * op2 Mengalikan op1 dengan op2

    /                     op1 / op2 Membagi op1 dengan op2

    %                     op1 % op2 Menghasilkan sisa hasil bagi antara op1 dengan op2


Contoh program




                                                                                            7
Andino Maseleno
Bab 1 – Pemrograman Java




//ArithmeticDemo.java
public class ArithmeticDemo {
    public static void main(String[] args) {

         int i = 37;
         int j = 42;
         double x = 27.475;
         double y = 7.22;
         System.out.println("Nilai   variabel...");
         System.out.println("    i   = " + i);
         System.out.println("    j   = " + j);
         System.out.println("    x   = " + x);
         System.out.println("    y   = " + y);

         System.out.println("Penambahan...");
         System.out.println("    i + j = " + (i + j));
         System.out.println("    x + y = " + (x + y));

         System.out.println("Pengurangan...");
         System.out.println("    i - j = " + (i - j));
         System.out.println("    x - y = " + (x - y));

         System.out.println("Perkalian...");
         System.out.println("    i * j = " + (i * j));
         System.out.println("    x * y = " + (x * y));

         System.out.println("Pembagian...");
         System.out.println("    i / j = " + (i / j));
         System.out.println("    x / y = " + (x / y));

         System.out.println("Sisa hasil bagi...");
         System.out.println("    i % j = " + (i % j));
         System.out.println("    x % y = " + (x % y));

         //mixing types
         System.out.println("Mixing types...");
         System.out.println("    j + y = " + (j + y));
         System.out.println("    i * x = " + (i * x));
    }
}




                                                                              8
Andino Maseleno
Bab 1 – Pemrograman Java




 //SortDemo.java
 public class SortDemo {
     public static void main(String[] args) {
         int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076,
                               2000, 8, 622, 127 };

          for (int i = arrayOfInts.length; --i >= 0; ) {
              for (int j = 0; j < i; j++) {
                  if (arrayOfInts[j] > arrayOfInts[j+1]) {
                      int temp = arrayOfInts[j];
                      arrayOfInts[j] = arrayOfInts[j+1];
                      arrayOfInts[j+1] = temp;
                   }
               }
           }

            for (int i = 0; i < arrayOfInts.length; i++) {
                System.out.print(arrayOfInts[i] + " ");
            }
            System.out.println();
      }
 }




Operator Increment/Decrement

Tabel 2.3 Operator increment/decrement
 Operator Penggunaam                                    Deskripsi
 ++           op++          op dinaikkan nilainya 1 setelah dilakukan operasi pada op

 ++           ++op          op dinaikkan nilainya 1 sebelum dilakukan operasi pada op

 --           op--          op diturunkan nilainya 1 sebelum dilakukan operasi pada op
 --           --op          op diturunkan nilainya 1 setelah dilakukan operasi pada op




Operator Relasional

Operator relasional pada Java dapat digunakan untuk membandingkan antara dua variabel data,
lebih lengkapnya dapat dilihat dalam tabel berikut ini:

Tabel 2.4 Operator relasional
 Operator Penggunaan                                   Deskripsi

                   op1 >   Menghasilkan true jika op1 lebih besar dari
      >
                    op2    op2


                                                                                            9
Andino Maseleno
Bab 1 – Pemrograman Java




             op1 >=      Menghasilkan true jika op1 lebih besar atau
    >=
              op2        sama dengan dari op2

                 op1 <   Menghasilkan true jika op1 lebih kecil dari
     <
                  op2    op2

             op1 <=      Menghasilkan true jika op1 lebih kecil atau
    <=
              op2        sama dengan dari op2

             op1 ==
    ==                   Menghasilkan true jika op1 sama dengan op2
              op2

             op1 !=      Menghasilkan true jika op1 tidak sama dengan
    !=
              op2        op2

Contoh program




                                                                          10
Andino Maseleno
Bab 1 – Pemrograman Java




 /RelationalDemo.java
 public class RelationalDemo {
     public static void main(String[] args) {

          int i = 37;
          int j = 42;
          int k = 42;
          System.out.println("Nilai    variabel...");
          System.out.println("    i    = " + i);
          System.out.println("    j    = " + j);
          System.out.println("    k    = " + k);

          System.out.println("Lebih besar dari...");
          System.out.println("    i > j = " + (i > j));
           System.out.println("    j > i = " + (j > i));
           System.out.println("    k > j = " + (k > j));

          System.out.println("Lebih    besar atau   sama dengan...");
          System.out.println("    i    >= j = " +   (i >= j));   //false
          System.out.println("    j    >= i = " +   (j >= i));   //true
          System.out.println("    k    >= j = " +   (k >= j));   //true

          System.out.println("Kurang dari...");
          System.out.println("    i < j = " + (i < j));           //true
          System.out.println("    j < i = " + (j < i));           //false
          System.out.println("    k < j = " + (k < j));           //false

          System.out.println("Kurang dari atau      sama dengan...");
          System.out.println("    i <= j = " +      (i <= j));   //true
          System.out.println("    j <= i = " +      (j <= i));   //false
          System.out.println("    k <= j = " +      (k <= j));   //true

          System.out.println("Sama dengan...");
          System.out.println("    i == j = " + (i == j));         //false
          System.out.println("    k == j = " + (k == j));         //true

          System.out.println("Tidak sama dengan...");
          System.out.println("    i != j = " + (i != j));         //true
          System.out.println("    k != j = " + (k != j));         //false

      }
 }




Operator Kondisional

Operator kondisional dalam Java ada enam macam sebagaimana digambarkan pada tabel di bawah:

Tabel 2.5 Operator kondisional
 Operator Penggunaan                                  Deskripsi
             op1 &&        Menghasilkan true jika op1 dan op2, keduanya
 &&
             op2           bernilai boolean true


                                                                                       11
Andino Maseleno
Bab 1 – Pemrograman Java




            op1 ||           Menghasilkan true jika op1 atau op2, salah satunya bernilai boolean
 ||
            op2              true
                             Menghasilkan true jika op bernilai boolean
 !          ! op
                             false

            op1 &            Bitwise AND, menghasilkan true jika op1 dan
 &
            op2              op2 bernilai true

            op1 |            Bitwise OR, menghasilkan true jika op1 atau op2 salah satunya
 |
            op2              bernilai true

            op1 ^            Menghasilkan true jika salah satu diantara op1 atau op2 bernilai
 ^
            op2              true, namun tidak keduanya




Operator Shift dan Lojik

           Tabel 2.6 Operator shift dan lojik
              Operator       Penggunaan                       Deskripsi
              >>          op1 >> op2            Menggeser bit op1 ke kanan sejauh op2

              <<          op1 << op2            Menggeser bit op1 ke kiri sejauh op2

              >>>         op1 >>> op2 Menggeser bit op1 ke kiri sejauh op2
Operator Bitwise

Operator bitwise dalam Java juga digunakan untuk memanipulasi bit.

                     Tabel 2.7 Operator Bitwise
                         Operator     Penggunaan            Deskripsi

                         &            op1 & op2 Bitwise AND

                         |            op1 | op2 Bitwise OR

                         ^            op1 ^ op2 Bitwise xor

                         ~            ~op2             Bitwise complement




                                                                                                12
Andino Maseleno
Bab 1 – Pemrograman Java




Bitwise AND

Bitwise AND akan menghasilkan bit “1” jika kedua operator bernilai bit “1”.

Tabel 2.8 Bitwise AND
 op1 op2 op1 & op2

 0      0     0

 0      1     0

 1      0     0

 1      1     1


Bitwise OR

Bitwise OR akan menghasilkan bit “1” jika salah satu operator bernilai bit “1”.



Tabel 2.9 Bitwise OR
 op1 op2 op1 | op2

 0      0     0

 0      1     1

 1      0     1

 1      1     1
Bitwise XOR

Bitwise XOR akan menghasilkan bit “1” jika kedua operator memiliki nilai bit yang berbeda

Tabel 2.10 Bitwise XOR
 op1 op2 op1^op2

 0      0     0

 0      1     1

 1      0     1

 1      1     0

Contoh program

                                                                                              13
Andino Maseleno
Bab 1 – Pemrograman Java




 //BitwiseDemo.java
 public class BitwiseDemo {
     static final int VISIBLE = 1;
     static final int DRAGGABLE = 2;
     static final int SELECTABLE = 4;
     static final int EDITABLE = 8;

     public static void main(String[] args)
     {
         int flags = 0;

           flags = flags | VISIBLE;
           flags = flags | DRAGGABLE;

           if ((flags & VISIBLE) == VISIBLE) {
               if ((flags & DRAGGABLE) == DRAGGABLE) {
                    System.out.println("Flags are Visible and Draggable.");
               }
           }

           flags = flags | EDITABLE;

           if ((flags & EDITABLE) == EDITABLE) {
               System.out.println("Flags are now also Editable.");
           }
     } }

Operator Assignment

Operator assignment pada Java digunakan untuk memberikan sebuah nilai ke sebuah variabel.
Operator assignment hanya berupa „=‟,

                      Tabel 2.11 Operator Assignment
                      Operator    Penggunaan           Ekivalen dengan
                      +=         op1 += op2       op1 = op1 + op2

                      -=         op1 -= op2       op1 = op1 - op2

                      *=         op1 *= op2       op1 = op1 * op2

                      /=         op1 /= op2       op1 = op1 / op2

                      %=         op1 %= op2       op1 = op1 % op2

                      &=         op1 &= op2       op1 = op1 & op2

                      |=         op1 |= op2       op1 = op1 | op2

                      ^=         op1 ^= op2       op1 = op1 ^ op2

                      <<=        op1 <<= op2      op1 = op1 << op2



                                                                                        14
Andino Maseleno
Bab 1 – Pemrograman Java




                        >>=        op1 >>= op2          op1 = op1 >> op2

                        >>>=       op1 >>>= op2 op1 = op1 >>> op2



Operator Lainnya

    Tabel 2.12 Operator lainnya
          Operator                                      Deskripsi
     ?:                 Shortcut if-else statement
     []                 Used to declare arrays, create arrays, and access array elements
     .                  Used to form qualified names
     ( params )         Delimits a comma-separated list of parameters
     ( type )           Casts (converts) a value to the specified type
     new                Creates a new object or a new array
     instanceof Determines whether its first operand is an instance of its second operand


Contoh program

 //ConditionalOp.java
 public class ConditionalOp
 {
    public static void main(String args[])
    {
       int nBuku = 1;     // jumlah buku
       System.out.println("Saya mempunyai " + nBuku + " buku" + (nBuku == 1 ?
 "." : "s."));

       nBuku++;           // Increment jumlah buku
       System.out.println("Saya mempunyai " + nBuku + " buku" + (nBuku == 1 ?
 "." : "s."));
    }
 }




Controlflow pada Java
Operasi Kondisional
If-Else
        Statement if-else digunakan untuk mengeksekusi sebuah blok jika memenuhi sebuah
kondisi tertentu. Sintaks penggunaannya adalah :

                                                                                                15
Andino Maseleno
Bab 1 – Pemrograman Java




                                            if (kondisi){
                                                  statement
                                            }

Contoh program

 //IfDemo1.java
 class ifDemo1{
     public static void main(String args[]){
        int idx = 2;
              if(idx>9){
           System.out.println(“Idx lebih besar dari 10”);
              }
     }
 }




Ada kalanya kita menginginkan dua pencabangan, yakni jika suatu kondisi terpenuhi, lakukan aksi
A, jika tidak, lakukan aksi B. Dua percabangan ini dimungkinkan dengan menggunakan if-else()
sebagai berikut :

                                         if (kondisi){
                                              statement1
                                         }else{
                                               statement2
                                         }

Pada pernyataan di atas, jika kondisi bernilai true, statement 1 akan dijalankan. Sebaliknya, jika
kondisi bernilai false, statement 2 yang akan dijalankan.

Contoh program

 //IfDemo2.java
 class ifDemo2{
      public static void main(String args[]){
        int idx=0;
               if(idx>9)
             System.out.println(“Idx lebih besar dari 9”);
        }else{
             System.out.println(“Idx tidak lebih besar dari 10”);
        }
       }
 }




                                                                                                     16
Andino Maseleno
Bab 1 – Pemrograman Java




//NumberCheck1.java
public class NumberCheck1
{
  public static void main(String[] args)
  {
    int number = 0;
    number = 1+(int)(100*Math.random());

        if(number%2 == 0)
          System.out.println("Anda memperoleh bilangan genap, " + number);
        else
          System.out.println("Anda memperoleh bilangan ganjil, " + number);
    }
}




//NumberCheck2.java
public class NumberCheck2
{
  public static void main(String[] args)
  {
    int number = 0;
    number = 1+(int)(100*Math.random());

        if(number%2 == 0)
        {
          if(number < 50)
            System.out.println("Anda memperoleh bilangan genap < 50, " + number);
        }
        else
          System.out.println("Anda memperleh bilangan ganjil, " + number); // It is
odd
  }
}




                                                                                   17
Andino Maseleno
Bab 1 – Pemrograman Java




//LetterCheck1.java
public class LetterCheck1
{
   public static void main(String args[])
   {
      char symbol = 'A';
      symbol = (char)(128.0*Math.random());

        if(symbol >= 'A')
        {
            if(symbol <= 'Z')
               System.out.println("Anda memiliki huruf besar " + symbol);
            else
               if(symbol >= 'a')
                  if(symbol <= 'z')
                     System.out.println("Anda memiliki huruf kecil " + symbol);
                  else
                     System.out.println(
                               "Kode lebih besar dari a, tetapi ini bukan huruf");
               else
                  System.out.println(
                               "Kode lebih kecil dari a dan bukan huruf");
          }
          else
             System.out.println("Kode lebih kecil dari A dan bukan huruf!!");
    }
}




//LetterCheck2.java
public class LetterCheck2
{
   public static void main(String args[])
   {
      char symbol = 'A';
      symbol = (char)(128.0*Math.random());

        if(symbol >= 'A' && symbol <= 'Z')
          System.out.println("Anda memiliki huruf besar " + symbol);
        else
          if(symbol >= 'a' && symbol <= 'z')
            System.out.println("Anda memiliki huruf kecil " + symbol);
          else
        System.out.println("Kode ini bukan huruf!!");
    }
}




                                                                                 18
Andino Maseleno
Bab 1 – Pemrograman Java




 //LetterCheck3.java
 public class LetterCheck3
 {
    public static void main(String args[])
    {
       char symbol = 'A';
       symbol = (char)(128.0*Math.random());

          if(Character.isUpperCase(symbol))
            System.out.println("Anda memiliki huruf besar " + symbol);
          else
            if(Character.isLowerCase(symbol))
              System.out.println("Anda memiliki huruf kecil " + symbol);
            else
              System.out.println("Kode ini bukan huruf!!");
     }
 }




Switch-Case

Statement switch-case digunakan untuk mengeksekusi sebuah blok jiak memenuhi sebuah kondisi
tertentu.

Contoh program

 //SwitchDemo.java
 public class SwitchDemo {
     public static void main(String[] args) {

            int month = 8;
            switch (month) {
                case 1: System.out.println("Januari"); break;
                case 2: System.out.println("Februari"); break;
                case 3: System.out.println("Maret"); break;
                case 4: System.out.println("April"); break;
                case 5: System.out.println("Mei"); break;
                case 6: System.out.println("Juni"); break;
                case 7: System.out.println("Juli"); break;
                case 8: System.out.println("Agustus"); break;
                case 9: System.out.println("September"); break;
                case 10: System.out.println("Oktober"); break;
                case 11: System.out.println("November"); break;
                case 12: System.out.println("Desember"); break;
            }
      }
 }




                                                                                         19
Andino Maseleno
Bab 1 – Pemrograman Java




 //SwitchDemo2.java
 public class SwitchDemo2 {
     public static void main(String[] args) {

          int month = 2;
          int year = 2000;
          int numDays = 0;

          switch (month) {
              case 1:
              case 3:
              case 5:
              case 7:
              case 8:
              case 10:
              case 12:
                  numDays = 31;
                  break;
              case 4:
              case 6:
              case 9:
              case 11:
                  numDays = 30;
                  break;
              case 2:
                  if ( ((year % 4 == 0) && !(year % 100 == 0))
                        || (year % 400 == 0) )
                       numDays = 29;
                  else
                       numDays = 28;
                  break;
          }
          System.out.println("Jumlah hari = " + numDays);
     }
 }




Operasi Pengulangan
While

Statement while digunakan untuk mengeksekusi sebuah blok secara berulang selama memenuhi
kondisi tertentu. Sintaks penggunaannya adalah sebagai berikut:

                                 while (ekspresi) {
                                        statement
                                 }

Pada pernyataan di atas, selama ekspresi menghasilkan nilai true, statement yang ada akan
dieksekusi secara terus menerus.




                                                                                     20
Andino Maseleno
Bab 1 – Pemrograman Java




Contoh program

 //WhileDemo.java
 class WhileDemo{
      public static void main(String args[]){
        String str1 = “Welcome”;
        int idx = 0;
        while(idx<str1.length()){
        System.out.println(“Karakter ke : “ +idx+”=”+str1.charAt(idx));
        idx++;
               }
        }
 }




 //WhileLoop.java
 public class WhileLoop
 {
   public static void main(String[] args)
   {
     int limit = 20;
     int sum = 0;
     int i = 1;
     while(i <= limit)
       sum += i++;
     System.out.println("sum = " + sum);
   }
 }




Do-While

Sama halnya dengan while, statement do-while digunakan untuk mengeksekusi sebuah blok secara
berulang sampai tidak memenuhi kondisi tertentu. Pada penggunaan while, ekspresi diperiksa pada
saat awal, jadi ada kemungkinan blok statement dalam while tidak pernah dieksekusi. Pada
penggunaan do-whilw, ekspresi tidak diperiksa pada saat awal eksekusi, jadi minimal blok
statement do-while akan dieksekusi sekali. Sintaks penggunaannya sebagai berikut:

                                     do{
                                      statement
                                     }while (ekspresi) {


Contoh program




                                                                                          21
Andino Maseleno
Bab 1 – Pemrograman Java




 //DoWhileLoop.java
 public class DoWhileLoop
 {
   public static void main(String[] args)
   {
     int limit = 20;
     int sum = 0;
     int i = 1;
     do
     {
        sum += i;
        i++;
     }
     while(i <= limit);

         System.out.println("sum = " + sum);
     }
 }



For
        Statement for digunakan untuk mengeksekusi sebuah blok secara berulang dalam sebuah
range tertentu. Sintaks penggunaannya adalah sebagai berikut:

                       for (inisialisasi;terminasi;increment) {
                                statement
                       }

Increment dalam for merupakan ekspresi yang dieksekusi pada awal eksekusi for. Terminasi
digunakan untuk menentukan kapan pengulangan akan dihentikan. Increment merupakan ekspresi
yang akan dieksekusi setiap selesai melakukan satu looping (pengulangan). Perlu diperhatikan
bahwa ketiga bagian di dalam for() bersifat opsional, jadi boleh tidak ada. Namun, jika ketiga
bagian di atas kosong, akan menyebabkan terjadinya pengulangan tanpa henti (loop forever).

Contoh program

 //ForLoop1.java
 class ForLoop1{
      public static void main(String args[]){
        for (int idx=0;idx<10;idx++){
                   System.out.println(idx +” ”);
              }
        System.out.println(“”);
      }
 }




                                                                                         22
Andino Maseleno
Bab 1 – Pemrograman Java




//ForLoop2.java
public class ForLoop2
{
   public static void main(String[] args)
   {
      int limit = 20;
      int sum = 0;
      for(int i = 1; i <= limit; i++)
         sum += i;
      System.out.println("sum = " +sum);
   }
}




//ForLoop3.java
class ForLoop3{
     public static void main(String args[]){
       int idx=0;
       for(;idx<10;){
            System.out.println(idx +” “);
            idx++;
       }
       System.out.println(“”);
     }
}




//ForLoop4.java
public class ForLoop4
{
   public static void main(String[] args)
   {
      int limit = 20;
      int sum = 0;
      for(double radius = 1.0; radius <= 2.0; radius += 0.2)
      {
        System.out.println("radius = " + radius + " area = " +
Math.PI*radius*radius);
      }
   }
}




                                                                               23
Andino Maseleno
Bab 1 – Pemrograman Java




//Factorial1.java
public class Factorial1
{
  public static void main(String[] args)
  {
    long limit = 20;
    long factorial = 1;
    for(int i = 1; i <= limit; i++)
    {
      factorial = 1;
      int j =2;
      while(j <= i)
        factorial *= j++;
      System.out.println(i + "!" + " adalah " + factorial);
    }
  }
}




//Factorial2.java
public class Factorial2
{
  public static void main(String[] args)
  {
    long limit = 20;
    long factorial = 1;
    OuterLoop:
    for(int i = 1; i <= limit; i++)
    {
      factorial = 1;
      for(int j = 2; j <= i; j++)
      {
        if(i > 10 && i % 2 == 1)
          continue OuterLoop;
        factorial *= j;
      }
      System.out.println(i + "!" + " adalah " + factorial);
    }
  }
}




                                                                                 24
Andino Maseleno
Bab 1 – Pemrograman Java




//BilanganPrima.java
public class BilanganPrima
{
   public static void main(String[] args)
   {
      int nValues = 50;
      boolean isPrime = true;
      for(int i = 2; i <= nValues; i++)
      {
         isPrime=true;
         for(int j = 2; j < i; j++)
         {
            if(i % j == 0)
            {
               isPrime = false;
               break;
            }
         }
      if(isPrime)
         System.out.println(i);
      }
   }
}




                                                               25
Andino Maseleno
Bab 2 – Java 2 Micro Edition




Bab 2

Java 2 Micro Edition

        Java 2 Micro Edition (J2ME) merupakan bagian dari teknologi Java 2, seperti yang terlihat
pada Gambar 2.1, yang digunakan untuk menjalankan dan mengembangkan aplikasi-aplikasi Java
pada handheld devices atau perangkat-perangkat semacam ponsel, Palm, PDA, dan PocketPC.




                                      Gambar 2.1 Java 2 Flatform


        Java 2 micro edition berguna untuk membangun sebuah aplikasi pada peralatan dengan
jumlah memori dan kapasitas penyimpanan yang terbatas, serta kemampuan user interface yang
terbatas seperti perangkat komunikasi bergerak yaitu handphone dan PDA, yang memiliki
karakteristik berbeda dengan sebuah personal komputer.
    Java 2 micro edition terdiri atas komponen-komponen sebagai berikut:
1. Java Virtual Machine (JVM)
   JVM yang ada pada paket J2ME dirancang agar bisa dijalankan pada berbagai perangkat
   handheld yang kompatibel dengan java dan komponen ini untuk menjalankan program-program
   java pada emulator.
2. Java API (Application Programming Interface)
   Komponen ini kumpulan dari librari untuk menjalankan dan mengembangkan program java
   pada handheld devices, misalnya kelas-kelas java untuk manipulasi layer ponsel, mendeteksi


                                                                                              26
Andino Maseleno
Bab 2 – Java 2 Micro Edition




    masukan tombol ponsel dan menyimpan file
3. Tools lain untuk pengembangan aplikasi java, semacam emulator Motorolla.
    Java 2 micro edition memiliki dua jenis aplikasi yaitu:
1. Walled garden application, yaitu aplikasi yang berdiri sendiri atau stand-alone pada handphone
    tanpa perlu mengakses sumber data eksternal melalui jaringan pembawa atau carrier network.
    contoh aplikasi ini adalah kalkulator, organizer.
2. Network aware application. Aplikasi ini memiliki kemampuan untuk mengakses sumber data
    eksternal. contoh aplikasi e-mail yang berada didalam handphone.
        Java 2 Micro Edition dibagi menjadi dua buah bagian yang dikenal dengan istilah
configuration dan profiles, seperti yang terlihat pada Gambar 2.2. Configuration adalah spesifikasi
yang menjelaskan tentang sebuah virtual machine dan Application Programming Interface dasar
yang dapat digunakan dalam class-class tertentu. Profile menyediakan implementasi-implementasi
tambahan yang spesifik dari sebuah handheld devices. Sebuah profile dibangun dalam sebuah
configuration, namun menambahkan beberapa Application Programming Interface khusus agar
dihasilkan sebuah lingkungan yang lengkap untuk membangun aplikasi.




                      Gambar 2.2 Configuration dan Profile pada J2ME Application


Java 2 Micro Edition Configuration
    Java 2 micro edition configuration mendefinisikan lingkungan kerja J2ME runtime. karena
setiap handheld devices memiliki fitur berbeda, J2ME configuration dirancang untuk menyediakan
librari standar yang mengimplementasikan fitur standar dari sebuah handheld devices. lingkungan



                                                                                                27
Andino Maseleno
Bab 2 – Java 2 Micro Edition




kerja J2ME configuration yang dimaksud meliputi java virtual machine (JVM) digunakan untuk
menjalankan program java, dan java virtual machine pada J2ME yang berbeda dengan J2ME pada
java development kit (JDK) karena hanya fitur-fitur penting berkaitan dengan perangkat wireless
yang diimplementasikan.
    Ada dua kategori J2ME configuration saat ini yaitu:
1. CLDC (Connected Limited Device Configuration).
   Kategori ini umumnya digunakan untuk aplikasi java pada handphone seperti Nokia, Samsung,
   Motorola, dan PDA (Personal Digital Assistants) Umumnya peralatan wireless untuk perangkat
   tersebut memiliki kapasitas memori yang kecil berukuran 160-512 KiloBytes dan dengan
   koneksi jaringan yang tidak tetap
2. CDC (Connected Device Configuration)
   Kategori ini umumnya digunakan untuk aplikasi java pada perangkat-perangkat          handheld
   devices dengan kapasitas memori yang lebih besar berukuran minimal 2 Mbytes dan dengan
   koneksi jaringan yang lebih kokoh contohnya internet television, nokia communicator, TV pada
   mobil dan lain-lain.
    Perbedaan antara CLDC dan CDC dapat dilihat pada tabel 2.1


Tabel 2.1 Perbedaan CLDC dan CDC
                    CLDC                                           CDC
 Mengimplementasikan subset dari J2SE           Mengimplementasikan seluruh fitur pada J2SE
                                                Processor 32 Bit
 Processor 16 Bit                               JVM yang digunakan dikenal dengan nama
 JVM yang digunakan dikenal dengan nama         connected virtual machine (CVM)
 Kilobyte virtual machine (KVM)


Java 2 Micro Edition Profile
    J2ME profile menyediakan implementasi-implementasi tambahan yang sangat spesifik dari
sebuah handheld devices. contohnya sebuah ponsel memiliki kemampuan standar dari sebuah
ponsel yaitu untuk berkomunikasi, namun setiap ponsel memiliki fitur-fitur tersendiri misalnya
Siemens bisa menyimpan mp3 dan nokia memiliki game dan lain sebagainya, kemampuan standar
itulah yang diimplementasikan oleh J2ME configuration sedangkan kemampuan atau fitur lainnya
diimplementasikan oleh J2ME profile. Jadi sebuah profile dibangun dalam sebuah configuration


                                                                                             28
Andino Maseleno
Bab 2 – Java 2 Micro Edition




namun menambahkan beberapa Application Programming Interface (API) khusus agar dihasilkan
sebuah lingkungan yang lengkap untuk membangun aplikasi.
    Ada lima kategori J2ME profile saat ini yaitu Mobile Information Device Profile (MIDP),
Foundation Profile (FP), Personal Profile, RMI Profile, Personal Digital Assistance Profile.


Connected Limited Device Configuration (CLDC)
    CLDC digunakan untuk implementasikan program java pada perangkat-perangkat keras dengan
ukuran memori yang sangat terbatas, akibatnya fitur-fitur yang kurang penting untuk
diimplementasikan dalam handheld devices yang bersangkutan dari java 2 harus dibuang. Fitur-fitur
yang dibuang tersebut antara lain:
1. Tidak ada dukungan untuk floating point
    Kelas-kelas untuk perhitungan floating point, yakni java.lang.Float dan java.lang.Double
    dibuang dari CLDC.
2. Tidak ada dukungan untuk finalisasi objek
    Garbage collector digunakan untuk “bersih-bersih memori” membuang fungsi finalize pada
    kelas java.lang.Object, sekalipun fungsi ini penting pada Java 2.
3. Tidak ada dukungan untuk JNI (Java Native Interface)
    Kelas JNI yang memungkinkan Java mengakses library yang dibuat dengan bahasa selain Java
    seperti C, C++, dan Basic , tidak didukung oleh CLDC.
4. Penanganan kesalahan/exception yang terbatas
    CLDC hanya mendefisinikan tiga kelas untuk penanganan kesalahan / exception yaitu kelas
    java.lang.Error, Kelas java.lang.OutOfMemory, Kelas java.lang.virtual Machine Error.
    Kelas-kelas standar bawaan java 2 standard edition (J2SE) yang didukung oleh CLDC adalah
sebagai berikut:




                                                                                                29
Andino Maseleno
Bab 2 – Java 2 Micro Edition




Tabel 2.2 Kelas-kelas pada J2SE yang ada pada CLDC.
      Nama Paket (Java Package)                       Nama Kelas (Java Class)
 Java.io                                DataInput
                                        DataOutput
                                        DataInputStream
                                        InputStream
                                        DataOutputStream
                                        OutputStream
                                        InputStreamReader
                                        OutputStreamWriter
                                        Reader
                                        Writer
                                        EOFException
                                        IOException
                                        PrintStream
                                        InterruptedException
                                        UnsupportedEncodingException
                                        UTFDataFormatException
                                        ByteArrayInputStream
                                        ByteArrayOutputStream




                                                                                           30
Andino Maseleno
Bab 2 – Java 2 Micro Edition




Java.lang         ArithmeticException
                  StringBuffer
                  SecurityException
                  Exception
                  InterruptedException
                  Runnable
                  RuntimeException
                  Runtime
                  NullpointerException
                  Character
                  InstantiationException
                  Boolean
                  ClassCastException
                  Integer
                  ClassNotFoundException
                  System
                  IllegalAccessException
                  Object
                  IllegalArgumentException
                  Byte
                  NumberFormatException
                  Thread
                  ArrayStoreException
                  String
                  OutOfMemoryError
                  Throwable
                  VirtualMachineError
                  Error
                  IllegalThreadStateException
                  Long
                  IndexOutOfBoundException
                  Math
                  IllegalMonitorStateException
                  Class                                                 31
Andino Maseleno   NegativeArraySizeException
Bab 2 – Java 2 Micro Edition




 Java.util                                    Calendar
                                              Date
                                              Enumeration
                                              Hastable
                                              Random
                                              Stack
                                              Time
                                              Vector
                                              EmptyStackException
                                              NoSuchElementException


    Kelas-kelas tambahan yang tidak ada dalam java 2 standard edition (J2SE) adalah
javax.microedition, yang menyediakan API (Application Programming Interface) untuk
implementasi program pada handheld devices.


KToolbar
         KToolbar merupakan lingkungan pengembangan yang disediakan oleh J2ME Wireless
Toolkit untuk pengembangan MIDlet. Aplikasi yang kita buat terdiri atas direktori-direktori berikut:
1. src
   Berisi file-file kode Java.
2. bin
   Berisi file-file JAD, JAR, dan manifest.
3. lib
   Berisi file-file yang diperlukan dalam format JAR atau ZIP.
4. res
   Berisi file-file resource.
Berikut adalah gambar Ktoolbar dari J2ME Wireless Toolkit:




                                                                                                 32
Andino Maseleno
Bab 2 – Java 2 Micro Edition




             Gambar 2.3 Ktoolbar, lingkungan pengembangan Java MIDP(MIDlet)
Emulator
       Dalam membuat aplikasi MIDlet kita tidak perlu mencobanya langsung ke perangkat
handheld device. Kita bisa mencobanya terlebih dahulu dengan menggunakan sebuah emulator.
Disini kita menggunakan 2 jenis emulator, yaitu emulator DefaultGrayPhone dan emulator
DefaultColorPhone. Perbedaan dari keduanya adalah terletak pada layarnya. Pada emulator
DefaultGrayPhone hanya memiliki warna hitam dan putih layaknya handphone biasa yang tidak
berwarna. Beda dengan emulator DefaultColorPhone yang memiliki layar berwarna.
Gambar berikut menunjukkan emulator DefaultGrayPhone:




                                                                                           33
Andino Maseleno
Bab 2 – Java 2 Micro Edition




                           Gambar 2.4 Emulator DefaultGrayPhone


Emulator DefaultColorPhone tampak seperti gambar 2.5 dibawah ini:




                                                                                           34
Andino Maseleno
Bab 2 – Java 2 Micro Edition




                            Gambar 2.5 Emulator DefaultColorPhone


MIDLET
    Midlet merupakan aplikasi yang dibuat menggunakan java 2 micro edition dengan profile
Mobile Information Device Profile (MIDP). Midlet berjalan dalam sebuah perangkat handheld
tetapi midlet tidak berinteraksi langsung dengan hardware dari ponsel atau perangkat handheld yang
lainnya melainkan berinteraksi melalui application management software (AMS).
    Terdapat 3 buah tool untuk membuat sebuah aplikasi MIDlet maupun J2ME lainnya. Tool-tool
tersebut yaitu Java Development kit (JDK) versi 1.3 atau yang lebih tinggi, J2ME Wireless Toolkit
atau J2MEWTK yang merupakan paket-paket tool yang mudah digunakan dalam membuat maupun
menguji sebuah aplikasi Midlet, dan sebuah Text editor seperti Notepad, Ultraedit, JEdit dan
sebagainya. Secara umum terdapat beberapa hal penting dalam membuat sebuah aplikasi MIDlet,


                                                                                               35
Andino Maseleno
Bab 2 – Java 2 Micro Edition




yaitu menyangkut lifecycle, Graphical user interface (GUI), dan Application Descriptor .


LifeCycle Midlet
    Lifecycle dari sebuah midlet ditangani oleh Application Management Software (AMS). AMS ini
adalah sebuah lingkungan tempat siklus dari sebuah midlet mampu diciptakan, dijalankan,
dihentikan, maupun dihilangkan. AMS juga merupakan program bawaan yang ada dalam perangkat
handheld tersebut yang berguna untuk mengatur manajemen aplikasi midlet yang ada.
    Ada tiga status dalam Lifecycle sebuah midlet, yang terdapat pada tabel berikut ini:


Tabel 2.3 Status Lifecycle sebuah Midlet
  Nama Status                                           Keterangan
 Pause             Status ini terjadi ketika midlet selesai diinisialisasi dan tidak melakukan aksi
                   apapun. Secara garis besar, status midlet adalah pause pada saat :
                          1. Setelah midlet dibuat dengan konstruktor new( ) .
                          2. Dari    status   Active,    kemudian    berhasil    memanggil     fungsi
                              MIDdlet.pauseApp( ).
                          3. Dari    status   Active,    kemudian    berhasil    memanggil     fungsi
                              MIDlet.notifyPaused( ).
                          4. Dari status Active, namun ketika akan start( ) terjadi kesalahan berupa
                              exception : MIDletStateChangeException
 Active            Status ini terjadi ketika midlet sedang aktif / berjalan dengan normal, yakni
                   setelah memanggil fungsi MIDlet.startApp( )
 Destroyed         Status ini terjadi ketika midlet berhenti berjalan atau exit, sehingga seluruh
                   sumber daya yang digunakan akan dibebaskan. Status ini terjadi ketika berhasil
                   dilakukan        pemanggilan         fungsi   MIDlet.destroyApp(        )     atau
                   MIDlet.notifyDetroyed( ).


    Jika digambarkan, perubahan status dalam daur hidup (lifecycle) dalam sebuah midlet dapat
dilihat pada gambar 2.6




                                                                                                   36
Andino Maseleno
Bab 2 – Java 2 Micro Edition




        new( )




      Paused
                                       destroyApp( )




     pauseApp( )
                                                         Destroyed


                       startApp( )




      Active                           destroyApp( )




                   Gambar 2.6 LifeCycle dan perubahan status sebuah Midlet


Eksekusi MIDlet
   Umumnya urutan eksekusi sebuah MIDlet adalah sebagai berikut:
1. AMS (Application Management Software) menginisilisasi sebuah objek MIDlet, sehingga
   midlet berada pada status paused.
2. Ketika AMS memutuskan bahwa midlet sudah waktunya dijalankan, maka AMS memanggil
   fungsi MIDlet.startApp( ) sehingga midlet akan mulai aktif berfungsi.
3. Ketika AMS memutuskan midlet harus dinonaktifkan sementara, maka AMS akan memanggil
   fungsi MIDlet.pauseApp( ) sehingga midlet akan berhenti bekerja.
4. Ketika AMS memutuskan bahwa midlet harus dinonaktifkan selamanya, maka AMS akan
   memanggil fungsi MIDlet.destroyApp( ) sehinggax alokasi memori yang digunakan oleh midlet
   yang bersangkutan akan dibersihkan.




                                                                                                  37
Andino Maseleno
Bab 2 – Java 2 Micro Edition




Graphical User Interface (GUI)
   Perangkat handheld semacam handphone memiliki berbagai keterbatasan, keterbatasan-
keterbatasan ini menyebabkan perlunya ada teknik pemrograman GUI yang berbeda dengan teknik
pemrograman yang umumnya digunakan pada aplikasi-aplikasi yang dijalankan pada sebuah
komputer. Connected Limited Device Connection (CLDC) tidak menyediakan fungsi-fungsi untuk
GUI, namun fungsi-fungsi ini ditangani oleh Mobile Information Device Profile (MIDP).
    Semua fungsi-fungsi untuk antarmuka berbasis window (GUI) ditangani oleh paket
javax.microedition.lcdui. Graphical user interface yang disediakan oleh MIDP terbagi atas dua level
yaitu High Level dan Low Level. Pada level pemrograman yang rendah (low level) fungsionalitasnya
lebih spesifik ke jenis handheld yang digunakan hal ini memungkinkan kurangnya portabilitas
midlet yang dibuat, misalnya midlet pada handheld Motorola, midlet tersebut belum tentu bisa
dijalankan dengan baik pada handheld lain. Mirip dengan game-game pada ponsel Nokia contohnya
snake, yang jika dijalankan pada ponsel siemens tidak akan jalan dikarenakan keperluan game
membutuhkan fungsi-fungsi untuk menggambar dan mengolah sesuatu yang levelnya sudah pixel-
pixel gambar. Kelas-kelas untuk pemrograman GUI pada level yang rendah diimplementasikan oleh
kelas javax.microedition.lcdui.canvas.
    Pada level pemrograman yang tinggi (high level) merupakan level pemrograman yang
dianjurkan karena aplikasi midlet akan lebih portable dengan banyak perangkat handheld yang
berbeda. Misalnya untuk mengembangkan sebuah form-form windows midlet pada handheld
motorola maka jika dijalankan aplikasi midlet pada handheld lain hasilnya akan sama. Kelas-kelas
untuk   manajemen      pemrograman       yang   tinggi   akan   diimplementasikan      oleh    kelas
javax.microedition.lcdui.screen.


Application Descriptor
   Aplikasi wireless dikemas dalam sebuah kemasan yang berekstensi *.JAR. Selain itu dikenal
pula file *.JAD yang disebut sebagai application descriptor yang berguna untuk mendeskripsikan
isi dari file JAR tadi. Kedua file ini haruslah di-upload ke ponsel pengguna agar aplikasi dapat
dijalankan.




                                                                                                38
Andino Maseleno
Bab 3 – Pemrograman GUI




Bab 3

Pemrograman GUI

        Berbeda dengan sebuah komputer desktop,         perangkat handheld semacam handphone,
Palm, dan organizer memiliki berbagai keterbatasan, misalnya ukuran layar yang jauh lebih kecil
dan masukan input yang tidak berupa mouse. Keterbatasan-keterbatasan ini menyebabkan perlunya
ada teknik pemrograman GUI yang berbeda dengan teknik pemrograman yang umumnya digunakan
pada aplikasi-aplikasi yang dijalankan pada sebuah komputer. CLDC (Connected Limited Device
Connection) tidak menyediakan fungsi-fungsi untuk GUI, namun fungsi-fungsi ini akan ditangani
oleh MIDP (Mobile Information Device Profile).


Jenis Fungsi-fungsi API pada MIDP untuk GUI
        Fungsi-fungsi untuk pembuatan antarmuka berbasis Window (GUI) yang disediakan oleh
MIDP terbagi atas dua level, yakni highlevel dan lowlevel. Semua fungsi-fungsi untuk antarmuka
berbasis window ini dilakukan oleh paket javax.microedition.lcdui. Pada level pemrograman yang
lebih tinggi (highlevel) yang merupakan level pemrograman yang dianjurkan, aplikasi MIDlet akan
lebih portabel dengan banyak perangkat handheld yang berbeda. Jadi, misalnya mengembangkan
sebuah form–form window MIDlet pada handheld Siemens SL45i, jika dijalankan aplikasi MIDlet
tersebut pada handheld lain, hasilnya akan sama. Kelas-kelas untuk manajemen pemrograman yang
lebih tinggi akan diturunkan dari javax.microedition.lcdui.Screen.
        Pada level pemrograman yang lebih rendah (lowlevel), akan didapatkan fungsionalitas yang
lebih spesifik ke jenis handheld yang digunakan. Hal ini memungkinkan kurangnya portabilitas
MIDlet yang dibuat, misalnya membuat MIDlet pada handheld Motorola i_85s, MIDlet tersebut
belum tentu bisa dijalankan dengan baik pada handheld lain. Menyerupai dengan game-game pada
handphone Nokia 5110, misalnya Snake, yang jika coba dijalankan pada handphone Ericson T10S
tidak akan jalan. Kelas-kelas untuk pemrograman GUI pada level yang lebih rendah ini
diimplementasikan           oleh         kelas         javax.microedition.lcdui.Canvas       dan
javax.microedition.lcdui.Graphics.


Model Pemrograman GUI pada MIDP
        Untuk menampilkan sesuatu pada layar, misalnya tulisan, form, dan sebagainya harus


                                                                                            39
Andino Maseleno
Bab 3 – Pemrograman GUI




mengakses display dari handheld yang dapat diakses dengan kelas javax.microedition.lcdui.Display.
Objek kedua adalah screen, yang berbeda dengan display. Screen digunakan untuk menangani
komponen-komponen GUI, misalnya window, form, dialogbox, dan menangani masukan dari
pengguna     misalnya     dari   keypad.   Objek   screen   ini   direpresentasikan   dengan   kelas
javax.microedition.lcdui.Screen. Pada setiap waktu hanya satu objek screen yang bisa ditampilkan
oleh objek Display, untuk menampilkan digunakan fungsi setCurrent() pada objek Display.
Ada tiga tipe screen pada MIDlet, yakni:
   Complex Screen Object
Tipe ini mengatur komponen-komponen GUI yang sudah tidak bisa ditambahi oleh komponen
screen yang lain. Misalnya, screen yang berisi objek ListBox untuk meminta masukan user, tidak
akan bisa kemudian diisi dengan objek lain.
   Generic Screen Object
Tipe ini mengatur komponen-komponen GUI Form, yang bisa ditambahi oleh komponen screen
yang lain. Misalnya, screen yang berisi objek Form.
   Low Level Screen Object
Digunakan oleh subkelas javax.microedition.lcdui.Graphics dan javax.microedition.lcdui.Screen


HighLevel API untuk Pembuatan GUI
          Kelas-kelas yang menyediakan fungsionalitas untuk pembuatan GUI pada Java MIDP ada
pada paket javax.microedition.lcdui. pada paket tersebut ada tiga interface dan 21 kelas.


Display
          Kelas Display merupakan kelas yang menyediakan fungsi-fungsi untuk manajemen layar
pada perangkat handheld, menampilkan objek screen, dan meyediakan informasi tentang properti
dari perangkat handheld yang digunakan. Akses ke layar dapat diacu dengan statik getDisplay()
pada kelas Display.
          public static Display getDisplay(MIDlet m)
Penggunaan fungsi ini umumnya dilakukan di dalam fungsi startApp() dimana sebuah MIDlet akan
menjadi aktif, seperti ini:
public class yourMIDletName extends MIDlet{
          Display display = null;
          //Konstruktor
          public yourMIDletName(){


                                                                                               40
Andino Maseleno
Bab 3 – Pemrograman GUI




        }
        public void startApp(){
                display = Display.getDisplay(this);
        }
        public void pauseApp(){}
        public void destroyApp(Boolean unconditional){}
}
        Fungsi-fungsi lain dalam kelas javax.microedition.lcdui.Display adalah sebagai berikut:
   public Displayable getCurrent();
    Menghasilkan objek screen – Displayable yang sedang ditampilkan ke layar.
   public boolean isColor();
    Menghasilkan nilai true jika perangkat handheld yang digunakan mendukung warna atau nilai
    false jika hanya mendukung grayscale.
   public int numColors();
    Menghasilkan jumlah warna yang didukung oleh perangkat handheld yang bersangkutan.
        Berikut contoh programnya:
//Program HelloWorld.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class helloworld extends MIDlet {
    private Display display;
        private Alert alert = new Alert("MyAlert");
    public helloworld() {
        display = Display.getDisplay(this);
    }
    public void startApp() {
        TextBox t = new TextBox("Screen Object", "HelloWorld", 256, 0);
        alert.setType(AlertType.WARNING);
        alert.setString("This is Alert");
        display.setCurrent(alert, t);
    }


    public void pauseApp() {}
    public void destroyApp (boolean unconditional) {}
}




                                                                                              41
Andino Maseleno
Bab 3 – Pemrograman GUI




Screen
         Objek screen menyediakan fungsionalitas untuk interaksi antara pengguna dengan
perangkat handheld. Objek screen ini memiliki empat jenis objek turunan yang umum digunakan,
yakni TextBox, Alert, List, dan Form. Kelas javax.microedition.lcdui.Screen merupakan kelas
abstrak dengan dua karakteristik, yaitu objek screen bisa memiliki title dan ticker. Fungsi-fungsi
dalam objek javax.microedition.lcdui.Screen yang digunakan untuk manajemen properti title dan
ticker adalah:
   public void setTitle(String s);
    Untuk menetapkan properti title dari objek screen
   public String getTitle();
    Menghasilkan string properti title dari objek screen
   public void setTicker(Ticker x);
    Untuk menetapkan properti ticker dari objek screen
   public Ticker getTicker();
    Menghasilkan objek Ticker yang sedang aktif pada objek screen


Ticker
         Ticker merupakan teks yang berjalan pada bagian atas layar aplikasi MIDlet. Sebuah ticker
dapat ditempatkan pada objek-objek turunan kelas Screen yang telah disebutkan, yakni TextBox,
List, Form, Alert. Berikut contoh program kelas javax.microedition.lcdui.Ticker:


//Program tickerDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class tickerDemo extends MIDlet {
    private Display display;
         private Ticker t;
    public tickerDemo(){
    }
    public void startApp() {
         display = Display.getDisplay(this);


                                                                                             42
Andino Maseleno
Bab 3 – Pemrograman GUI




        t = new Ticker("This is Ticker");
        List l = new List("Simple Choice", Choice.EXCLUSIVE);
        l.append("Choice 1",null);
        l.append("Choice 2",null);
        l.setTicker(t);
        display.setCurrent(l);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



TextBox
        Kelas TextBox merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Screen.
TextBox menyediakan media untuk menerima masukan teks dari keypad pengguna handheld. Jadi
jika aplikasi MIDlet Anda membutuhkan masukan dari pengguna, misalnya password, nama, alamat
dan informasi berbasis teks lainnya Anda akan menggunakan objek TextBox ini. Konstruktor dari
kelas TextBox ini adalah:
public TextBox(String title, String text, int maxSize, int constraints)
parameter-parameter:
   String title
    Untuk memberikan title pada Screen
   String text
    Untuk memberikan nilai awal pada TextBox
   int maxSize
    Untuk memberikan batasan maksimal jumlah karakter yang bisa diterima oleh TextBox. Jadi
    Anda tidak akan bisa memasukkan karakter yang jumlahnya melebihi batas maksimal ini.
   int constraint
    Ada beberapa nilai yang bisa digunakan untuk parameter ini, yakni:
1. TextField.ANY
Artinya, bisa memasukkan sembarang karakter teks
2. TextField.EMAILADDR
Artinya,    bisa     memasukkan    teks   yang     merupakan     alamat    email.   Misalnya     :


                                                                                            43
Andino Maseleno
Bab 3 – Pemrograman GUI




andinomaseleno@yahoo.com
3. TextField.NUMERIC
Artinya, hanya bisa memasukkan teks berupa angka saja.
4. TextField.PHONENUMBER
Artinya, hanya bisa memasukkan teks berupa nomor telepon saja, misalnya +628156037413,
08122311345.
5. TextField.URL
Artinya,   bisa    memasukkan        teks   berupa   alamat   web   atau   URL    lain,   misalnya
http://andinomaseleno.net
6. TextField.PASSWORD
Artinya memasukkan password pada saat login ke Windows, masukan akan ditampilkan dengan
karakter tertentu, misalnya ‘*’. Tipe batasan ini bisa digunakan dengan tipe batasan yang lain
dengan menggunakan operator ‘|’ sehingga menambah kemampuan pembatasan yang ada.
Fungsi penting dalam kelas TextBox lainnya adalah :
   public int size()
    Menghasilkan jumlah karakter yang saat ini telah dimasukkan dalam TextBox.
   public void delete(int offset, int length);
    Menghapus karakter dari posisi offset sepanjang jumlah karakter = length.
   public int getCarerPosition();
    Menghasilkan posisi kursor pada TextBox saat ini.
   public String getString();
    Menghasilkan string yang saat ini ada pada TextBox.
   public void setString(String str);
    Menetapkan string pada TextBox menjadi str pada parameter fungsi di atas.
   public void insert(String str, int position);
    Memasukkan string str pada parameter fungsi di atas pada TextBox mulai dari posisi position.
        Berikut contoh programnya:
//Program textBoxDemo.java
import javax.microedition.midlet.*;
import javax.microedition.Textbox.*;


public class textBoxDemo extends MIDlet {
    private Display display;


                                                                                              44
Andino Maseleno
Bab 3 – Pemrograman GUI




    public textBoxDemo(){
    }
    public void startApp(){
        display = Display.getDisplay(this);
        TextBox t = new TextBox("This is TextBox","",256,TextField.ANY);
        Integer maxSize = new Integer(t.getMaxSize());
        String toPrint = "Jumlah maksimal karakter";
        t.setString(toPrint +"="+maxSize.toString());
        display.setCurrent(t);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional){
    }
}



List
         Kelas list (javax.microedition.lcdui.List) merupakan kelas turunan dari kelas abstrak
javax.microedition.lcdui.Screen yang menyediakan masukan pilihan (multiple choice) pada layar.
Konstruktor dari kelas List ini ada dua, yakni:
public List (String title, int listType)
public    List     (String    title,    int    listType,      String[]   listElement,      Image[]
listImages)
Parameter-parameter:
   String title
    Untuk memberikan title pada list
   Int listType
    Tipe list yang diberikan dapat berisi
    1. Choice.EXCLUSIVE
         Berarti setiap saat hanya bisa dipilih 1 buah pilihan]
    2. Choice.IMPLICIT
         Sama halnya dengan Choice.EXCLUSIVE, namun penampilannya berbeda
    3. Choice.MULTIPLE
         Berarti pengguna bisa memilih lebih dari 1 pilihan
   String[] listElement



                                                                                              45
Andino Maseleno
Bab 3 – Pemrograman GUI




    Merupakan array dari elemen list yang akan ditampilkan
   Image[] listImage
    Merupakan array dari gambar (javax.microedition.lcdui.Image) elemen list yang akan
    ditampilkan.
Jika menggunakan konstruktor yang pertama public List(String title, int listType), akan dibuat
sebuah list kosong yang kemudian bisa menambahkan, menyisipkan, atau mengganti pilihan dalam
list. Fungsi-fungsi yang berkaitan dengan hal ini adalah:
   public int append(String element, Image image)
    Menambahkan satu elemen pada daftar pilihan dengan gambar tertentu. Jika tidak akan
    menampilkan gambar, parameter image bisa di set null. Fungsi ini menghasilkan nilai integer
    yang menunjukkan indeks lokasi dimana elemen baru saja ditambahkan.
   public void insert(int index, String element, Image image)
    Menyisipkan satu elemen pada daftar pilihan dengan gambar tertentu pada lokasi yang
    ditentukan oleh nilai parameter index. Jika tidak akan menampilkan gambar, parameter image
    bisa di set null.
   public void set(int index, String element, Image image)
    Menetapkan satu elemen pada daftar pilihan di lokasi yang ditentukan oleh nilai parameter
    index dengan gambar tertentu. Jika tidak akan menampilkan gambar, parameter image bisa di
    set null.
        Contoh penggunaan kelas list sebagai berikut:
//Program listDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class listDemo extends MIDlet{
    private Display display;
    public listDemo(){
    }
    public void startApp() {
        display = Display.getDisplay(this);
        List myList = new List("This is List", Choice.IMPLICIT);
        myList.append("Choice 1",null);
        myList.append("Choice 2",null);
        myList.append("Choice 3",null);
        myList.insert(1,"Inserted Choice",null);


                                                                                          46
Andino Maseleno
Bab 3 – Pemrograman GUI




        display.setCurrent(myList);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



Fungsi penting dalam kelas List lainnya adalah:
   public Image getImage(int index)
    Jika objek List menggunakan gambar, fungsi ini menghasilkan objek Image yang digunakan
    pada lokasi seperti yang disebutkan parameter index.
   public String getString(int index)
    Menghasilkan string teks yang ada pada objek List pada lokasi ke index
   public boolean isSelected(int index)
    Menghasilkan nilai true jika elemen ke-index dipilih oleh pengguna, jika tidak maka akan
    menghasilkan nilai false.
   public void delete(int index)
    Menghapus elemen ke-index pada daftar pilihan yang ada.
   public int getSelectedIndex()
    Menghasilkan nilai indeks lokasi dimana sebuah elemen dipilih.
   public int size()
    Menghasilkan nilai jumlah elemen dalam list


Form
        Bekerja dengan form memungkinkan untuk menampilkan beberapa komponen GUI
semacam daftar pilihan, masukan teks (textbox) dalam stu layar. Form diimplementasikan oleh
kelas javax.microedition.lcdui.Form. Form dapat menampung komponen-komponen yang disebut
item dalam satu layar, yaitu item-item tersebut adalah textfields, gauge, dan choice groups. Item-
item tersebut merupakan implementasi dari kelas turunan Item (javax.microedition.lcdui.Item). Ada
dua konstruktor form yang umum digunakan, yakni:
Public Form(String title)
Public Form(String title, Item[] items)


                                                                                             47
Andino Maseleno
Bab 3 – Pemrograman GUI




Konstruktor pertama secara sederhana menyediakan sebuah form dengan judul form seperti
parameter title yang diberika, sedangkan konstruktor yang kedua juga mendefinisikan item-item apa
saja yang akan ada di form yang akan dibuat. Sebagai gambaran, berikut contoh programnya:
//Program formDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class formDemo extends MIDlet {
    private Display display;
    public formDemo() {
    }
    public void startApp() {
        Display display = Display.getDisplay(this);
        Form f = new Form("Empty Form");
        display.setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



Fungsi-fungsi berikut adalah fungsi-fungsi penting dalam kelas Form:
   public int append(Image img)
    Menambahkan gambar ke form yang dibungkus dalam kelas javax.microedition.lcdui.Image.
   public int append(Item itm)
    Menambahkan         item   ke      form   yang   merupkan      kelas-kelas   turunan    Item
    (javax.microedition.lcdui.Item).
   public int size()
    Menghasilkan nilai integer yang merupakan jumlah item dalam form.
   public void delete(int numItem)
    Menghapus elemen atau item ke-numItem pada form.
   public Item get(int numItem)
    Menghasilkan objek Item pada form yang merupakan item ke numItem.
   public void set(int numItem, Item itm)


                                                                                            48
Andino Maseleno
Bab 3 – Pemrograman GUI




    Menetapkan item ke-numItem menjadi objek Item sesuai parameter itm.
   public void insert(int numItem, Item itm)
    Menyisipkan item pada item ke-numItem dengan objek Item sesuai parameter itm.


Kelas Item (javax.microedition.lcdui
Komponen-komponen yang bisa diletakkan dalam sebuah form merupakan komponen-komponen
yang memiliki kelas yang merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item.
Komponen-komponen tersebut adalah:
   ChoiceGroup
    Kelas ini menyediakan komponen yang mirip dengan list, yakni untuk menyediakan daftar
    pilihan.
   DateField
    Kelas ini menyediakan komponen untuk memasukkan informasi tanggal dan waktu.
   Gauge
    Kelas ini menyediakan komponen grafik horizontal yang biasanya digunakan untuk
    memberikan gambaran berapa persen proses berjalan.
   Image dan ImageItem
    Kelas ini menyediakan komponen grafik untuk manipulasi gambar.
   StringItem
    Kelas ini menyediakan komponen teks string yang tidak bisa diedit oleh pengguna.
   TextField
    Kelas ini menyediakan komponen untuk masukan teks string oleh pengguna.


ChoiceGroup
Kelas ChoiceGroup (javax.microedition.lcdui.ChoiceGroup) merupakan kelas turunan dari kelas
abstrak javax.microedition.lcdui.Item yang menyediakan masukan pilihan (multiple choice) pada
layar. Konstruktor dari kelas ChoiceGroup ini ada dua, yakni:
public ChoiceGroup(String title, int choiceType)
public ChoiceGroup(String title, int choiceType,                String[] choiceElement, Image[]
choiceImages)
Parameter-parameter:
   String title



                                                                                             49
Andino Maseleno
Bab 3 – Pemrograman GUI




    Untuk memberikan title pada daftar pilihan yang ditampilkan.
   int choiceType
    Tipe pilihan ini yang digunakan, dapat berisi:
    1. Choice.EXCLUSIVE
          Berarti setiap saat hanya bisa dipilih 1 buah pilihan saja.
    2. Choice.MULTIPLE
          Berarti pengguna bisa memilih lebih dari 1 pilihan.
   String[] choiceElement
    Merupakan array dari elemen pada daftar pilihan yang akan ditampilkan.
   Image[] choiceImages
    Merupakan array dari elemen gambar (javax.microedition.lcdui.Image) yang akan ditampilkan
    pada daftar pilihan.
          Jika menggunakan konstruktor yang pertama public.ChoiceGroup(String title, int
choiceType), maka akan dibuat sebuah daftar pilihan kosong yang kemudian bisa menambahkan,
menyisipkan, atau mengganti pilihan dalam list. Fungsi-fungsi yang berkaitan dengan hal ini
adalah:
   public int append(String element, Image image)
    Menambahkan satu elemen pada daftar pilihan dengan gambar tertentu. Jika tidak akan
    menampilkan gambar, parameter image bisa di set null. Fungsi inio menghasilkan nilai integer
    yang menunjukkan indeks lokasi dimana elemen baru saja ditambahkan.
   public void insert(int index, String element, Image image)
    Menyisipkan satu elemen pada daftar pilihan dengan gambar tertentu pada lokasi yang
    ditentukan oleh nilai parameter index. Jika tidak akan menampilkan gambar, parameter image
    bisa di set null.
   public void set(int index, String element, Image image)
    Menetapkan satu elemen pada daftar pilihan di lokasi yang ditentukan oleh nilai parameter
    index dengan gambar tertentu. Jika tidak akan menampilkan gambar, parameter image bisa
    ditetapkan null.
          Contoh penggunaan kelas ChoiceGroup (javax.microedition.lcdui.ChoiceGroup) adalah
sebagai berikut:


//Program choiceGroupDemo.java


                                                                                           50
Andino Maseleno
Bab 3 – Pemrograman GUI




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


public class choiceGroupDemo extends MIDlet {
    private Display display;
    public choiceGroupDemo() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        Form f = new Form("Pilih yang Anda inginkan");
        ChoiceGroup cg = new ChoiceGroup("Pilihan Makanan", Choice.EXCLUSIVE);
        cg.append("Ayam",null);
        cg.append("Ikan",null);
        cg.insert(1,"Telur",null);
        f.append(cg);
        display.setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}
Fungsi penting dalam kelas ChoiceGroup lainnya adalah:
   public Image getImage(int index)
    Jika objek ChoiceGroup menggunakan gambar, maka fungsi ini menghasilkan objek Image
    yang digunakan pada lokasi seperti yang disebutkan parameter index.
   public String getString(int index)
    Menghasilkan string teks yang ada pada objek ChoiceGroup pada lokasi ke-index.
   public boolean isSelected(int index)
    Menghasilkan nilai true jika elemen ke-index dipilih oleh pengguna, jika tidak,         akan
    menghasilkan nilai false.
   public void delete(int index)
    Menghapus elemen ke-index pada daftar pilihan yang ada.
   public int getSelectedIndex()
    Menghasilkan nilai indeks lokasi sebuah elemen dipilih
   public int size()


                                                                                            51
Andino Maseleno
Bab 3 – Pemrograman GUI




    Menghasilkan nilai jumlah elemen dalam daftar pilihan.


DateField
        Kelas DateField (javax.microedition.lcdui.DateField) merupakan kelas turunan dari kelas
abstrak javax.microedition.lcdui.Item yang menyediakan masukan berupa waktu atau tanggal untuk
MIDlet. Konstruktor dari kelas DateField ini ada 2 buah yakni:
public DateField(String title, int mode)
public DateField(String title, int mode, TimeZone timezone)
Parameter-parameter:
   String title
    Untuk memberikan title pada masukan tanggal/waktu yang ditampilkan.
   Int Mode
    Tipe masukan yang digunakan, dapat berisi:
    1. DateField.TIME
        Berarti digunakan untuk mengambil masukan waktu.
    2. DateField.DATE
        Berarti digunakan untuk mengambil masukan tanggal.
    3. DateField.DATE_TIME
        Berarti digunakan untuk mengambil masukan waktu/tanggal.
   TimeZone timezone
    Untuk memberikan informasi zona waktu yang akan digunakan. Kelas TimeZone ada dalam
    paket java.util.
        Berikut adalah kode Java untuk menampilkan informasi tanggal pada perangkat handheld:
//Program dateDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class dateDemo extends MIDlet {
    private Display display;
    public dateDemo() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        Form f = new Form("Date Information");



                                                                                          52
Andino Maseleno
Bab 3 – Pemrograman GUI




          DateField d = new DateField("Today's date", DateField.DATE);
          f.append(d);
          display.setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



Gauge
          Objek Gauge merepresentasikan grafik batang yang disusun secara horizontal yang dapat
digunakan dalam form untuk merepresentasikan jalannya sebuah proses dan lain sebagainya. Objek
Gauge diimplementasikan oleh kelas Gauge(javax.microedition.lcdui.Gauge) yang merupakan
kelas turunan dari kelas abstrak javax.microedition.lcdui.Item. Konstruktor dari kelas Gauge ini
adalah:
public Gauge (String title, boolean interactive, int maxValue, int initialValue)
Parameter-parameter:
   String title
    Untuk memberikan title pada Gauge yang ditampilkan.
   boolean interactive
    Apakah akan ditampilkan secara interaktif atau tidak? Jika modenya interaktif, user bisa
    mengubah progress bar yang ada dan jika modenya tidak interaktif, user tidak bisa mengubah
    progress bar yang ada.
   int maxValue
    Nilai maksimum yang diperbolehkan, dimana nilai ini harus > 0.
   int initialValue
    Nilai awal yang digunakan, nilainya antara 0 sampai dengan nilai maksimum yang telah
    didefinisikan.
          Agar lebih jelas perhatikan contoh sederhana berikut ini:
//Program gaugeDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.util.Date;




                                                                                           53
Andino Maseleno
Bab 3 – Pemrograman GUI




public class gaugeDemo extends MIDlet {
    private Display display;
    public gaugeDemo() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        Form f = new Form("What is Gauge ?");
        Gauge g1 = new Gauge("This is a Gauge",false,15,1);
        f.append(g1);
        display.setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}
        Untuk mendapatkan informasi apakah progress bar yang dibuat bersifat interaktif atau tidak
dengan menggunakan fungsi:
   public boolean isInteractive()
    Jika dikembalikan nilai true, progress bar bersifat interactive.
        Dari objek Gauge ini, bisa diperoleh nilai yang sedang ada sekarang, nilai maksimal yang
diperbolehkan dengan fungsi-fungsi berikut:
   public int getValue()
    Menghasilan nilai integer dari progress bar yang ada
   public int getMaxValue()
    Menghasilkan nilai maksimum dari progress bar yang ada
        Selain itu, bisa ditetapkan nilai yang sedang ada sekarang, nilai maksimal yang
diperbolehkan dengan fungsi-fungsi berikut:
   public void setValue(int val)
    Menetapkan nilai integer dari progress bar yang ada.
   public void setMaxValue(int maxval)
    Menetapkan nilai maksimum dari progressbar yang ada.
        Bisa juga diubah label judul dari progress bar yang ada menggunakan fungsi:
   public void setLabel(String str)
    Menetapkan label progress bar yang ada dengan teks string pada parameter.


                                                                                             54
Andino Maseleno
Bab 3 – Pemrograman GUI




StringItem
Objek StringItem digunakan untuk meletakkan objek teks string yang tidak bisa diubah oleh
pengguna secara langsung pada form. Kelas StringItem diimplementasikan oleh kelas StringItem
(javax.microedition.lcdui.StringItem)   yang   merupakan     kelas   turunan   dari   kelas   abstrak
javax.microedition.lcdui.Item. Konstruktor dari kelas StringItem ini adalah:
public Gauge(String label, String content)
Parameter-parameter:
   String title
    Untuk memberikan title pada objek teks string yang ditampilkan.
   String content
    Isi dari teks yang akan ditampilkan pada form.
        Berikut contoh programnya:
//Program stringItemDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class stringItemDemo extends MIDlet {
    private Display display;
    public stringItemDemo() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        Form f = new Form("Greeting");
        StringItem si = new StringItem("I say: "Hi Girls");
        f.append(si);
        display.setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}
Fungsi-fungsi yang ada di dalam kelas ini adalah:
   public void setText(String teks)
    Menetapkan teks sesuai parameter teks yang diberikan pada objek StringItem

                                                                                                55
Andino Maseleno
Bab 3 – Pemrograman GUI




   public void setLabel(String lbl)
    Menetapkan label pada objek StringItem sesuai parameter lbl yang diberikan.
   public String getText()
    Menghasilkan teks string yang ada pada objek
   public String getLabel()
    Menghasilkan label yang ada pada objek StringItem.


TextField
Objek TextField digunakan untuk meletakkan objek teks string yang bisa diubah oleh pengguna
secara langsung pada form. Jadi, objek ini mirip dengan objek TextBox. Objek TextField
diimplementasikan oleh kelas TextField (javax.microedition.lcdui.TextField) yang merupakan kelas
turunan dari kelas abstrak javax.microedition.lcdui.Item. Konstruktor dari kelas TextField ini
adalah:
public TextField(String title, String text, int maxSize, int constraints)
Parameter-parameter:
String title
Untuk memberikan title pada TextField yang aktif.
String text
Untuk memberikan nilai awal pada TextField.
int maxSize
Untuk memberikan batasan maksimal jumlah karakter yang bisa diterima oleh TextField. Jadi tidak
akan bisa memasukkan karakter yang jumlahnya melebihi batas maksimal ini.
int constraint
Ada beberapa nilai yang bisa digunakan untuk parameter ini, yakni:
TextField.ANY
Artinya, bisa memasukkan sembarang karakter teks.
TextField.EMAILADDR
Artinya,       bisa   memasukkan        teks    yang      merupakan         alamat   email,   misalnya
andinomaseleno@yahoo.com
TextField.NUMERIC
Artinya, hanya bisa memasukkan teks berupa angka saja.
TextField.PHONENUMBER


                                                                                                  56
Andino Maseleno
Bab 3 – Pemrograman GUI




Artinya, hanya bisa memasukkan teks yang berupa nomor telepon saja, misalnya +628156864651,
08156864651.
TextField.URL
Artinya,   bisa   memasukkan      teks   berupa    alamat   Web      atau   URL    lain,   misalnya
http://andinomaseleno.net
TextField.PASSWORD
Artinya, seperti memasukkan password pada saat logi ke Windows, masukkan akan ditampilkan
dengan karater tertentu, misalnya ‘*’. Tipe batasan ini bisa digunakan dengan tipe batasan yang lain
dengan menggunakan operator ‘|’ sehingga menambah kemampuan pembatasan yang ada.
        Berikut contoh programnya:
//Program textFieldDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class textFieldDemo extends MIDlet {
    private Display display;
    public textFieldDemo() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        TextField              lname              =            new              TextField("Login
Name","andinomaseleno",25,TextField.ANY);
        TextField                         pval                         =                        new
TextField("Password","secret",45,TextField.ANY|TextField.PASSWORD);
        Form f = new Form("Sign on");
        f.append(lname);
        f.append(pval);
        display.setCurrent(f);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



Fungsi penting dalam kelas TextField lainnya adalah:



                                                                                               57
Andino Maseleno
Bab 3 – Pemrograman GUI




   public int size()
    Menghasilkan jumlah karakter yang saat ini telah dimasukkan dalam TextField
   public void delete(int offset, int length)
    Menghapus karakter dari posisi offset sepanjang jumlah karakter = length.
   public int getCaretPosition()
    Menghasilkan posisi kursor pada TextField saat ini.
   public String getString()
    Menghasilkan string yang saat ini ada pada TextField.
   public void setString(String str)
    Menetapkan string pada TextField menjadi str pada parameter fungsi di atas.
   public void insert(String str, int position)
    Memasukkan string str pada parameter fungsi di atas pada TextField mulai dari posisi position.
Image
        Objek Image digunakan untuk meletakkan objek gambar yang bisa bersifat immutable atau
mutable. Gambar yang bersifat immutable artinya tidak bisa diubah-ubah oleh aplikasi,          dan
umumnya berupa gambar yang diambil dari sebuah file gambar, URL atauu tempat lain. Sebaliknya
gambar yang bersifat mutable bisa diubah-ubah oleh aplikasi. Konstruktor dari kelas Image ini
bersifat statik, sehingga tidak menggunakan operator new untuk membuat sebuah objek Image
melainkan mengacu ke fungsi createImage() pada objek Image ini:
public static void createImage(String name)
public static void createImage(Image img)
public static void createImage(int width, int height)
Konstruktor pertama dan kedua digunakan untuk membuat objek Image yang bersifat immutable.
Perlu diketahui bahwa jenis file gambar yang didukung saat ini hanya file dengan format PNG
(Portable Network Graphics).
        Berikut contoh programnya:
//Program imageDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;


public class imageDemo extends MIDlet {
    private Display display;
    public imageDemo() {


                                                                                              58
Andino Maseleno
Bab 3 – Pemrograman GUI




    }
    public void startApp() {
        display = Display.getDisplay(this);
        try {
            Image myimg = Image.createImage("/Andino.png");
            Form f = new Form("Andino");
            f.append(myimg);
            display.setCurrent(f);
        } catch (IOException e) {
        }
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}


Fungsi-fungsi penting dalam kelas Image ini adalah:
   public Graphics getGraphics()
    Menghasilkan objek Graphics yang bersesuaian dari objek Image yang bersangkutan.
   public int getHeight()
    Menghasilkan tinggi/panjang objek gambar yang ada.
   public int getWidth()
    Menghasilkan lebar objek gambar yang ada.
   public boolean isMutable()
    Menghasilkan nilai true jika objek gambar bersifat mutable.


ImageItem
        Objek ImageItem digunakan untuk mengotrol objek Image yang ada pada form atau alert.
Konstruktor dari kelas ImageItem ini adalah:
public void ImageItem(String label, Image img, int layout,           String altText)
Parameter-parameter:
   String label
    Untuk memberikan judul pada objek ImageItem yang aktif.
   String altText



                                                                                         59
Andino Maseleno
Bab 3 – Pemrograman GUI




    Untuk memberikan alternatif teks string pada gambar.
   Image img
    Objek Image yang akan dikontrol.
   int layout
    Ada beberapa nilai yang bisa digunakan untuk parameter ini, yakni:
    1. ImageItem.LAYOUT_CENTER
        Gambar akan diatur agar pada posisi tengah.
    2. ImageItem.LAYOUT_DEFAULT
        Gambar diatur sesuai posisi standarnya.
    3. ImageItem.LAYOUT_LEFT
        Gambar diatur agar pada posisi kiri.
    4. ImageItem.LAYOUT_RIGHT
        Gambar diatur agar pada posisi kanan.
    5. ImageItem.LAYOUT_NEWLINE_AFTER
        Setelah gambar dibuat akan diberikan sebuah baris baru.
    6. ImageItem.LAYOUT_NEWLINE_BEFORE
        Sebelum gambar dibuat akan diberikan sebuah baris baru.
        Berikut contoh programnya:
//Program imageDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;


public class imageDemo extends MIDlet {
    private Display display;
    public imageDemo() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        try {
           Image myimg = Image.createImage(myimg);
         ImageItem         item        =        new    ImageItem("My         Duke",       img2,
ImageItem.LAYOUT_NEWLINE_BEFORE, "My Duke");
         Form f = new Form ("Duke");
           f.append(myimg);



                                                                                           60
Andino Maseleno
Bab 3 – Pemrograman GUI




            f.append(item);
            display.setCurrent(f);
        } catch (IOException e) {
        }
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



Fungsi-fungsi penting dalam kelas ImageItem ini adalah:
   public String getAltText()
    Menghasilkan teks string yang merupakan teks alternatif dari objek ImageItem.
   public Image getImage()
    Menghasilkan objek Image dari objek ImageItem yang bersangkutan.
   public int getLayout()
    Menghasilkan tipe layout yang digunakan oleh objek ImageItem yang bersangkutan.
   public void setAltText(String altText)
    Menetapkan teks string yang merupakan teks alternatif pada objek ImageItem.
   public void setImage(Image img)
    Menetapkan objek Image dari objek ImageItem yang bersangkutan.
   public void setLayout(int layout)
         Menetapkan tipe layout yang akan digunakan oleh objek ImageItem yang bersangkutan.


LowLevel API untuk Pembuatan GUI
Canvas
Kelas canvas merupakan kelas yang menyediakan fungsi-fungsi untuk manajemen antarmuka pada
level rendah handheld. Kelas ini merupakan kelas abstrak sehingga harus membuat kelas
turunannnya dahulu untuk melakukan manajemen antarmuka pada level rendah. Berikut kode
sumber kelas javax.microedition.lcdui.Canvas:


package javax.microedition.lcdui.*;
public abstrack class Canvas extends Displayable {



                                                                                           61
Andino Maseleno
Bab 3 – Pemrograman GUI




  public static final int UP = 1;
  public static final int DOWN = 6;
  public static final int LEFT = 2;
  public static final int RIGHT = 5;
  public static final int FIRE = 8;
  public static final int GAME_A = 9;
  public static final int GAME_B = 10;
  public static final int GAME_C = 11;
  public static final int GAME_D = 12;
  public static final int KEY_NUM0 = 48;
  public static final int KEY_NUM1 = 49;
  public static final int KEY_NUM2 = 50;
  public static final int KEY_NUM3 = 51;
  public static final int KEY_NUM4 = 52;
  public static final int KEY_NUM5 = 53;
  public static final int KEY_NUM6 = 54;
  public static final int KEY_NUM7 = 55;
  public static final int KEY_NUM8 = 56;
  public static final int KEY_NUM9 = 57;
  public static final int KEY_STAR = 42;
  public static final int KEY_POUND = 35;


  protected Canvas() {
  }
  public int getWidth() {
      return Display.WIDTH;
  }
  public int getHeight() {
      return Display.HEIGHT;
  }
  public boolean isDoubleBuffered() {
      return Display.IS_DOUBLE_BUFFERED;
  }
  public boolean hasPointerEvents() {
      return Display.POINTER_SUPPORTED;
  }
  public boolean hasPointerMotionEvents() {
      return Display.MOTION_SUPPORTED;
  }
  public boolean hasRepeatEvents() {


                                                                62
Andino Maseleno
Bab 3 – Pemrograman GUI




      return Display.REPEAT_SUPPORTED;
  }
  public int getKeyCode(int gameAction) {
      int n = Display.getKeyCode(gameAction);
      if (n == 0)
          throw new illegalArgumentException();
      else
          return s;
  }
  public int getGameAction(int keyCode) {
      int n = Display.getGameAction(keyCode);
      if (n == -1)
          throw new IllegalArgumentException();
      else
          return n;
  }
  protected void keyPressed(int i) {
  }
  protected void keyRepeated(int i) {
  }
  protected void keyReleased(int i) {
  }
  protected void pointerPressed(int i, int j) {
  }
  protected void pointerReleased(int i, int j) {
  }
  protected void pointerDragged(int I, int j) {
  }
  public final void repaint(int x, int y, int width, int haight) {
      synchronized(Display.LCDUILock) {
      super.repaint(x, y, width, height);
      }
  }
  public final void serviceRepaints() {
      Display d = super.currentDisplay;
      if (d != null)
          d.serviceRepaints();
  }
  protected void showNotify() {
  }


                                                                              63
Andino Maseleno
Bab 3 – Pemrograman GUI




     protected void hideNotify() {
     }
     protected abstrack void paint(Graphics        g);
}



Tampak bahwa kelas Canvas merupakan kelas abstrak sekaligus turunan dari kelas Displayable.
Penggunaan kelas Canvas umumnya bersamaan dengan kelas Graphics, karena kelas Graphics lah
yang menyediakan objek-objek grafik dan fungsi-fungsi yang dibutuhkan untuk manipulasi grafik
level rendah. Contoh penggunaan kelas Canvas adalah sebagai berikut:
//Program canvasDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class myCanvas extends Canvas {
     public void paint(Graphics g) {
         g.setColor(255, 0, 0);
         g.fillRect(0, 0, getWidth(), getHeight());
         g.setColor(255, 255, 255);
         g.drawString("Selamat Pagi Dunia", 0, 0, g.TOP | g.LEFT);
     }
};
public class canvasDemo extends MIDlet {
     private Display display;
     public canvasDemo() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new myCanvas();
         display.setCurrent(canvas);
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}



         Fungsi penting yang berkaitan dengan informasi besarnya dimensi x dan y dari layar yang
ada adalah:

                                                                                           64
Andino Maseleno
Bab 3 – Pemrograman GUI




   public int getHeight()
    Menghasilkan tinggi maksimal atau nilai ordinat maksimal dari layar.
   public int getWidth()
    Menghasilkan lebar maksimal atau nilai absis maksimal dari layar.


Font
        Kelas Font (javax.microedition.lcdui.Font) digunakan untuk manipulasi tipe font yang
disediakan oleh perangkat handheld. Font tidak bisa dibuat oleh aplikasi, aplikasi hanya bisa
meminta font yang diinginkan sesuai tipe, ukuran, dan atribut lain dan sistem akan mengembalikan
font yang paling sesuai ke aplikasi. Atribut dari sebuah font adalah ukuran (size), corak (style), dan
tipe font (face) sebagai berikut:
Ukuran
Ada tiga nilai untuk ukuran, yakni:
Font.SIZE_SMALL
Font.SIZE_MEDIUM
Font.SIZE_LARGE
Masing-masing nilai di atas berkaitan dengan ukuran kecil, sedang, dan besar.
Corak
Ada empat nilai untuk corak, yakni:
Font.STYLE_BOLD
Font.STYLE_ITALIC
Font.STYLE_PLAIN
Font.STYLE_UNDERLINED
Tipe
Ada tiga nilai untuk tipe font, yakni:
Font.FACE_MONOSPACE
Font.FACE_PROPORTIONAL
Font.FACE_SYSTEM
        Tidak ada konstruktor untuk kelas ini, umumnya pembuatan objek Font dengan memanggil
fungsi statik getFont() yang disediakan oleh kelas Font semacam ini:
Font f = Font.getFont(FACE_SYSTEM, STYLE_PLAIN, SIZE_SMALL)
Parameter dari fungsi getFont() ada 3, dimana parameter pertama adalah tipe (face), parameter


                                                                                                 65
Andino Maseleno
Bab 3 – Pemrograman GUI




kedua adalah corak (style), dan parameter ketiga adalah ukuran (size).   Berikut          contoh
programnya:
//Program fontDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class fontCanvas extends Canvas {
   public void paint (Graphics g) {
        g.setColor(255,255,255);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(255,0,0);
        g.setFont(Font.getFont(Font.FACE_SYSTEM,                              Font.STYLE_PLAIN,
Font.SIZE_LARGE));
        g.drawString("System Font", 0, 0, g.LEFT | g.TOP);
        g.setFont(Font.getFont(Font.FACE_SYSTEM,                              Font.STYLE_PLAIN,
Font.SIZE_MEDIUM));
        g.drawString("Medium Size", 0, 15, g.LEFT | g.TOP);
        g.setFont(Font.getFont(Font.FACE_SYSTEM,                               Font.STYLE_BOLD,
Font.SIZE_MEDIUM));
        g.drawString("Bold Style", 0, 30,         g.LEFT | g.TOP);
        g.setFont(Font.getFont(Font.FACE_SYSTEM,                             Font.STYLE_ITALIC,
Font.SIZE_MEDIUM));
        g.drawString("Italic Style", 0, 45, g. LEFT | g.TOP);
        g.setFont(Font.getFont(Font.FACE_SYSTEM,                         Font.STYLE_UNDERLINED,
Font.SIZE_MEDIUM));
        g.drawString("Underlined Style", 0, 60, g.LEFT | g.TOP);
        }
   };
public class fontDemo extends MIDlet {
   private Display display;
   public fontDemo() {
   }
   public void startApp() {
        display = Display.getDisplay(this);
         Canvas canvas = new fontCanvas();
         display.setCurrent(canvas);
    }
    public void pauseApp() {
    }


                                                                                            66
Andino Maseleno
Bab 3 – Pemrograman GUI




    public void destroyApp(boolean unconditional) {
    }
}



Fungsi-fungsi penting lainnya dalam kelas Font adalah:
   public boolean isBold()
    Menghasilkan true jika font merupakan huruf tebal.
   public boolean isItalic()
    Menghasilkan true jika font merupakan huruf miring.
   public boolean isPlaint()
    Menghasilkan true jika font merupakan huruf standar.
   public boolean isUnderlined()
    Menghasilkan true jika font merupakan hurut dengan garis bawah.
   public int getStyle()
    Mengembalikan       corak   (style)   dari   font   yang   bersangkutan     dari   layar,   apakah
    Font.STYLE_BOLD,              Font.STYLE_PLAIN,             Font.STYLE_ITALICS,               atau
    Font.STYLE_UNDERLINED.
   public int getFace()
    Mengembalikan tipe font (face) dari font yang bersangkutan dari layar, apakah
    Font.FACE_MONOSPACE, Font.FACE_PROPORTIONAL atau Font.FACE_SYSTEM.
   public int getSize()
    Mengembalikan ukuran font, apakah Font.SIZE_SMALL, Font.SIZE_MEDIUM, atau
    Font.SIZE_LARGE.
   public int getHeight
    Menghasilkan tinggi font yang ada.
   public int string Width(String str)
    Menghasilkan lebar dari string str pada parameter.


Graphics
        Kelas Graphics (javax.microedition.lcdui.Graphics) digunakan untuk membuat objek-objek
dua dimensi. Komponen-komponen grafik primitif yang bisa dimanipulasi adalah teks, garis,
gambar (image), rectangle (untuk objek-objek persegi), dan arcs (untuk lengkungan-lengkungan).



                                                                                                  67
Andino Maseleno
Bab 3 – Pemrograman GUI




Warna yang disediakan adalah 24 bit dengan masing-masing 8 bit untuk warna merah (red), 8 bit
hijau (green), dan 8 bit biru (blue).


Warna
        Jika ingin menggunakan pewarnaan, misalnya untuk menulis teks, menggambar garis atau
lengkungan, dan operasi lain pada objek Graphics, bisa menggunakan fungsi sebagai berikut:
   public void setColor(int red, int green, int blue)
Parameter-parameter red, green, blue masing-masing berkaitan dengan warna dasar, yakni merah,
hijau, dan biru dan nilainya antara 0-255, misalnya setColor(255,255,0).
   public void setColor(int RGB)
    Parameter RGB adalah sepeti 0xRRGGBB, jadi ada bagian RR untuk warna merah (red), GG
    untuk warna hijau (green), dan biru (blue) dan nilainya adalah nilai hexadesimal (00-FF),
    misalnya setColor(0x00FF0000).
Setiap kali menggunakan fungsi setColor(), maka otomatis operasi grafis berikutnya akan
menggunakan pewarnaan sesuai yang diberikan pada setColor(). Selain menggunakan warna RGB,
banyak perangkat handheld yang masih menggunakan warna grayscale, dan karenanya disediakan
pula fungsi:
   public void setGrayScale(int scale)
    Parameter scale adalah tingkat grayscale yang berkisar antara 0-255.
Fungsi lain yang berkaitan dengan masalah warna adalah:
   public int getColor()
    Menghasilkan informasi nilai warna yang saat ini aktif, nilainya berformat 0xRRGGBB,
    misalnya jika warna sekarang merah, akan menghasilkan nilai 0xFF0000, jika hijau, akan
    menghasilkan nilai 0x00FF00 dan seterusnya.
   public int getRecComponent()
    Menghasilkan informasi nilai warna merah yang saat ini aktif, nilainya berkisar antara 0-255.
   public int getGreenComponent()
    Menghasilkan informasi nilai warna hijau yang saat ini aktif, nilainya berkisar antara 0-255.
   public int getBlueComponent()
    Menghasilkan informasi nilai warna biru yang saat ini aktif, nilainya berkisar antara 0-255.
   public int getGrayScale()
    Menghasilkan informasi nilai warna grayscale yang saat ini aktif, nilainya berkisar antara 0-


                                                                                                   68
Andino Maseleno
Bab 3 – Pemrograman GUI




   255.
        Contoh penggunaan warna ini adalah sebagai berikut:
//program colorDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class colorCanvas extends Canvas {
   public void paint (Graphics g) {
        g.setColor(255,0,0);
        g.fillRect(0,0,getWidth(),10);
        g.setColor(0,255,0);
        g.fillRect(0,10,getWidth(),20);
        g.setColor(0,0,255);
        g.fillRect(0,20,getWidth(),30);
        g.setGrayScale(5);
        g.fillRect(0,30,getWidth(),40);
        g.setColor(0xFFFFFF);
        g.fillRect(0,40,getWidth(),getHeight());
        g.setColor(0xff00ff);
        int red = g.getRedComponent();
        int green = g.getGreenComponent();
        int blue = g.getBlueComponent();
        String rS = "Merah: "+(new Integer(red)).toString()+ "n";
        String gS = "Hijau: "+(new Integer(green)).toString()+ "n";
        String bS = "Biru: "+(new Integer(blue)).toString()+ "n";
        g.drawString(rS, 1, 45, g.LEFT | g.TOP);
        g.drawString(gS, 1, 45 + (g.getFont()).getHeight(), g.LEFT | g.TOP);
        g.drawString(bs, 1, 45 + (2 * (g.getFont()).getHeight()), g.LEFT | g.TOP);
        }
   };
public class colorDemo extends MIDlet {
   private Display display;
   public colorDemo() {
   }
   public void startApp() {
        display = Display.getDisplay(this);
        Canvas canvas = new colorCanvas();
        display.setCurrent(canvas);
   }


                                                                                 69
Andino Maseleno
Bab 3 – Pemrograman GUI




    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}



Teks
        Setelah menetapkan warna sesuai yang diinginkan, selanjutnya bisa ditambahkan teks pada
layar dengan menggunakan fungsi drawString() sebagai berikut:
   public void drawString(String str, int x, int y, int anchor)
    Menambahkan sebuah string pada posisi x dan y, dengan aturan posisi sesuai nilai anchor. Nilai
    anchor merupakan gabungan dari konstanta statik pada kelas javax.microedition.lcdui.Graphics.
    1. TOP
        Meletakkan sebuah teks rata atas.
    2. BASELINE
        Meletakkan sebuah teks rata tengah.
    3. BOTTOM
        Meletakkan sebuah teks rata bawah, dengan nilai-nilai berikut:
        a. LEFT
            Berarti meletakkan sebuah teks rata kiri.
        b. HCENTER
            Berarti meletakkan sebuah teks rata tengah secara horizontal.
        c. RIGHT
            Meletakkan sebuah teks rata kanan.
        Fungsi-fungsi lain yang erat kaitannya dengan penulisan teks string adalah fungsi-fungsi
yang berkaitan dengan objek Font, yakni getHeight() dan stringWidth(). Kedua fungsi tersebut
memberikan informasi besarnya tinggi font dan lebar string, yang nantinya akan mempengaruhi
penulisan string berikutnya.
Selain menuliskan teks String, juga bisa dituliskan sebuah karakter dengan menggunakan fungsi
drawChar() sebagai berikut:
   public void drawChar(char c, str, int x, int y, int anchor)
Menambahkan sebuah karakter pada posisi x dan y, dengan aturan posisi sesuai nilai anchor. Nilai
anchor ini sama dengan aturan nilai anchor pada fungsi drawString().


                                                                                              70
Andino Maseleno
Bab 3 – Pemrograman GUI




         Berikut contoh programnya:
//Program teksStringDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class teksCanvas extends Canvas {
    public void paint(Graphics g) {
         String s1 = "Teks 1";
         String s2 = "Teks 2";
         String s3 = "Teks 3";
         char c1 = 'x';
         Font f = g.getFont();
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(0,0,0);
         g.drawString(s1,1,1,g.TOP | g.LEFT);
         g.drawString(s2,1,1+ f.getHeight(), g.TOP | g.LEFT);
         g.drawString(s3,1+f.stringWidth(s1),1, g.TOP | g.LEFT);
         g.drawChar(c1,1+f.stringWidth(s2),1+f.getHeight(), g.TOP | g.LEFT);
         }
    };
public class teksStringDemo extends MIDlet {
    private Display display;
    public teksStringDemo(){
    }
    public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new teksCanvas();
         display.setCurrent(canvas);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}


Garis
         Selain menambahkan teks,     bisa juga menggambar garis dengan menggunakan fungsi



                                                                                       71
Andino Maseleno
Bab 3 – Pemrograman GUI




drawLine() sebagai berikut:
    public void drawLine(int x1, int y1, int x2, int y2)
     Menggambar garis dari koordinat (x1,y1) sampai dengan koordinat (x2,y2).
         Contoh penggambaran garis adalah sebagai berikut:
//Program lineDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class lineCanvas extends Canvas {
     public void paint(Graphics g) {
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(0,0,0);
         g.drawLine(0,0,getWidth(),getHeight());
         g.drawLine(0,0,getWidth()-10,getHeight());
         g.drawLine(0,0,getWidth(),getHeight()-10);
         g.drawLine(0,0,getWidth()-20,getHeight());
         g.drawLine(0,0,getWidth(),getHeight()-20);
         g.drawLine(0,0,getWidth()-30,getHeight());
         g.drawLine(0,0,getWidth(),getHeight()-30);
         g.drawLine(0,0,getWidth()-40,getHeight());
         g.drawLine(0,0,getWidth(),getHeight()-40);
     }
};
public class lineDemo extends MIDlet {
     private Display display;
     public lineDemo() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new lineCanvas();
         display.setCurrent(canvas);
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}



                                                                                          72
Andino Maseleno
Bab 3 – Pemrograman GUI




Persegi (rectangle)
         Untuk membuat sebuah segi empat berupa persegi panjang atau bujursangkar, digunakan
fungsi drawRect() sebagai berikut:
    public void drawRect(int x, int y, int width, int height)
     Menggambar segi empat dengan koordinat pojok kiri atas (x,y) dan lebar = width serta panjang
     = height.
         Contoh penggambaran persegi ini adalah sebagai berikut:
//Program rectDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class rectCanvas extends Canvas {
     public void paint(Graphics g) {
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.drawRect(0,0,10,10);
         g.drawRect(10,10,10,10);
         g.drawRect(20,20,10,10);
         g.drawRect(30,30,10,10);
         g.drawRect(40,40,10,10);
         g.drawRect(50,50,10,10);
         g.drawRect(60,60,10,10);
         g.drawRect(70,70,10,10);
         g.drawRect(10,50,30,10);
         g.drawRect(10,60,30,10);
         g.setColor(10,70,30,10);
     }
};
public class rectDemo extends MIDlet {
     private Display display;
     public rectDemo() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new rectCanvas();
         display.setCurrent(canvas);
     }


                                                                                            73
Andino Maseleno
Bab 3 – Pemrograman GUI




     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}



Lengkungan
         Untuk membuat sebuah lengkungan yang kemudian memungkinkan dalam membuat
sebuah lingkaran, elips atau bidang lengkung lainnya, digunakan fungsi drawArc() sebagai berikut:
    public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
     Menggambar lengkungan dengan koordinat pojok kiri atas adalah (x,y) dengan ukuran lebar =
     width serta panjang = height. Sudut awal adalah startAngle dan arcAngle adalah nilai sudut
     relatif terhadap sudut awal. Sudut 0 derajat dalam hal ini adalah pada posisi jam 3 dan
     penambahan sudut, yakni yang nilainya ditentukan oleh arcAngle adalah berlawanan arah
     dengan jarum jam.
         Contoh penggambaran lengkungan adalah sebagai berikut:
//Program arcDemo.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class arcCanvas extends Canvas {
     public void paint(Graphics g) {
     g.setColor(255,255,255);
     g.fillRect(0,0,getWidth(),getHeight());
     g.setColor(255,0,0);
     int absis = getWidth()/2;
     int ordinat = getHeight()/2;
     g.drawArc(absis,ordinat,40,40,0,360);
     absis = 5;
     ordinat = 5;
     g.drawArc(absis,ordinat,40,40,30,180);
     absis = 50;
     ordinat = 5;
     g.drawArc(absis, ordinat, 40, 40, 0, ,90);
     }
};
public class arcDemo extends MIDlet {


                                                                                                 74
Andino Maseleno
Bab 3 – Pemrograman GUI




     private Display display;
     public arcDemo() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new arcCanvas();
         display.setCurrent(canvas);
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}



Gambar 3 Dimensi
         Dengan menggunakan fungsi-fungsi dasar untuk membuat garis, lengkungan, dan persegi,
berikut akan diberikan beberapa contoh pembuatanobjek 3 dimensi:
//Program Kubus.java
import javax.microedition.midlet.*;
import javax.microediton.lcdui.*;


class kubusCanvas extends Canvas {
     public void paint(Graphics g) {
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(235,0,0);
         int absis = 40;
         int ordinat = 3;
         int i;
         for(i=1; i<20; i++) {
             g.fillRect(absis-i, ordinat+i, 40, 40);
         }
         g.setColor(255,0,0);
             g.fillRect(absis-i, ordinat+i, 40, 40);
     }
};
public class Kubus extends MIDlet {
     private Display display;



                                                                                        75
Andino Maseleno
Bab 3 – Pemrograman GUI




     public kubus() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new kubusCanvas();
         display.setCurrent(canvas);
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}



Piramida
         Berikut contoh program untuk membuat sebuah piramida:
//Program Piramida.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class piramidCanvas extends Canvas {
     public void paint(Graphics g) {
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(235,0,0);
         int absis = 30;
         int ordinat = 3;
         int i;
         for(i=1; i<15; i++) {
         g.drawLine(abis,ordinat,55+i,(getHeight()-10)-i);
         }
         g.setColor(255,0,0);
         for (i = -(55-30); i<=(55-30); i++) {
             g.drawLine(absis,ordinat,30+i,getHeight()-10);
         }
     }
};
public class Piramida extends MIDlet {
     private Display display;
     public Piramida() {


                                                                                   76
Andino Maseleno
Bab 3 – Pemrograman GUI




     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new piramidCanvas();
         display.setCurrent(canvas);
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}



Tabung
         Berikut contoh program untuk membuat sebuah tabung:
//Program Tabung.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class tabungCanvas extends Canvas {
     public void paint(Graphics g) {
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(235,0,0);
         int absis = 20;
         int ordinat = 3;
         for (int i=1; i<50; i++) {
             g.fillArc(absis,ordinat+i,40,25,0,-180);
         }
         g.setColor(255,0,0);
             g.fillArc(absis,ordinat,40,25,0,360);
     }
};
public class Tabung extends MIDlet {
     private Display display;
     public Tabung() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new tabungCanvas();


                                                                                 77
Andino Maseleno
Bab 3 – Pemrograman GUI




        display.setCurrent(canvas);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}




                                                                        78
Andino Maseleno
Bab 4 –Manajemen Event




Bab 4

Manajemen Event

        Ketika terjadi interaksi antara pengguna dengan perangkat handheld semacam handphone,
Palm, dan organizer, maka akan dihasilkan suatu event. Misalnya, jika memilih suatu menu,
memasukkan teks ke dalam objek TextField, maka sistem akan memproduksi sebuah event yang
memberitahu aplikasi bahwa telah terjadi suatu event sebagai wujud interaksi dari pengguna
sehingga aplikasi MIDlet bisa melakukan sesuatu berdasar event tersebut.


Level Tinggi untuk Event
        Untuk bisa menangani event pada level tinggi (high level), cukup mengimplementasikan
interface CommandListener dan atau ItemStateListener yang dideklarasikan pada paket
javax.microedition.lcdui.


Command dan Interface CommandListener
        Kelas    Command      (javax.microedition.lcdui.Command)      merupakan     kelas   yang
mengenkapsulasi informasi sebuah aksi. Dari informasi yang dienkapsulasi oleh kelas ini, maka
aplikasi bisa menentukan aksi apa yang dilakukan, tipenya bagaimana dan lain sebagainya. Pada
bab yang terdahulu telah digunakan beberapa objek GUI seperti textbox, tanggal (DateField), dan
menu pilihan (ChoiceGroup). Semua objek tersebut memiliki tiga fungsi yang berkaitan dengan
manajemen event dengan objek Command ini, yakni:
   public void addCommand(Command cmd)
    Mengasosiasikan objek GUI yang bersangkutan dengan objek Command cmd.
   public void removeCommand(Command cmd)
    Menghapus asosiasi objek GUI yang bersangkutan dengan objek Command cmd yang pernah
    dibuat.
   public void setCommandListener(CommandListener l)
    Mengasosiasikan objek GUI yang bersangkutan dengan interface CommandListener .
Ketiga fungsi tersebut merupakan fungsi yang diturunkan oleh kelas Displayable. Konstruktor kelas
Command adalah:
public Command(String label, int commandType, int prio)



                                                                                            79
Andino Maseleno
Bab 4 –Manajemen Event




parameter-parameter:
   String label
    Memberikan label pada perintah yang ada.
   commandType
    Tipe perintah yang ada, disini ada beberapa nilai yang diperbolehkan, yakni:
    1. Command.BACK
           Digunakan untuk kembali ke layar sebelumnya, seperti halnya fungsi Back pada browser
           Internet.
    2. Command.CANCEL
           Digunakan untuk membatalkan akses ke layar, jadi secara lojik sama halnya dengan
           kembali ke layar sebelumnya.
    3. Command.OK
           Digunakan untuk mengacu ke jawaban positif atas suatu hal, misalnya konfirmasi untuk
           menghapus teks dan sebagainya.
    4. Command.HELP
           Digunakan untuk menampilkan fasilitas help pada layar.
    5. Command.STOP
           Digunakan untuk menghentikan suatu proses yang sedang berjalan.
    6. Command.EXIT
           Digunakan untuk keluar dari suatu aplikasi.
   prio
    Merupakan nilai integer yang menjadi prioritas dari perintah yang ada. Nilai prioritas ini harus
    positif dan dimulai dari angka 1, nilai terendah merupakan nilai prioritas tertinggi. Nilai
    prioritas ini akan mempengaruhi penempatan suatu perintah di layar.
           Berikut contoh programnya:
//Program EventEx1.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class EventEx1 extends MIDlet implements CommandListener {
    Display display = null;
    List menu = null;
    TextBox input = null;



                                                                                               80
Andino Maseleno
Bab 4 –Manajemen Event




  static final Command backCommand = new Command("Back", Command.BACK, 0);
  static final Command mainMenuCommand = new Command("Main", Command.SCREEN, 1);
  static final Command exitCommand = new Command("Exit", Command.STOP, 2);
  String currentMenu = null;
  public EventEx1() {
  }
  public void startApp() throws MIDletStateChangeException {
      display = Display.getDisplay(this);
      menu = new List("Menu Items", Choice.IMPLICIT);
      menu.append("Item1", null);
      menu.append("Item2", null);
      menu.append("Item3", null);
      menu.append("Item4", null);
      menu.addCommand(exitCommand);
      menu.setCommandListener(this);
      mainMenu();
  }
  public void pauseApp() {
      display = null;
      menu = null;
      input = null;
  }
  public void destroyApp(boolean unconditional) {
      notifyDestroyed();
  }
  void mainMenu() {
      display.setCurrent(menu);
      currentMenu = "Main";
  }
  public void prepare() {
      input = new TextBox("Enter some text: ", "", 5, TextField.ANY);
      input.addCommand(backCommand);
      input.setCommandListener(this);
      input.setString("");
      display.setCurrent(input);
  }
  public void testItem1() {
      prepare();
      currentMenu = "item1";
  }


                                                                                81
Andino Maseleno
Bab 4 –Manajemen Event




    public void testItem2() {
         prepare();
         currentMenu = "item2";
    }
    public void testItem3() {
         prepare();
         currentMenu = "item3";
    }
    public void testItem4() {
         prepare();
         currentMenu = "item4";
    }
    public void commandAction(Command c, Displayable d) {
        String label = c.getLabel();
        if (label.equals("Exit")) {
             destroyApp(true);
        } else if (label.equals("Back")) {
             if(currentMenu.equals("Item1")      ||     currentMenu.equals("Item2")         ||
currentMenu.equals("Item3") || currentMenu.equals("Item4"); {
                 mainMenu();
             }
        } else {
             List down = (List)display.getCurrent();
             Switch(down.getSelectedIndex()) {
                 case 0: testItem1();break;
                 case 1: testItem2();break;
                 case 2: testItem3();break;
                 case 3: testItem4();break;
             }
         }
    }
}



Interface ItemStateListener
         Jika objek-objek berkelas Command (javax.microedition.lcdui.Command) dikaitkan dengan
interface CommandListener, ada interface yang lain yang khusus digunakan untuk menangani event
yang terjadi pada objek-objek yang biasa ditempatkan pada sebuah form semacam ChoiceGroup,
DateField, Gauge, dan TextField. Jadi event yang dimaksud di sini adalah ketika terjadi hal-hal


                                                                                          82
Andino Maseleno
Bab 4 –Manajemen Event




berikut:
   Pengguna mengubah pilihan pada ChoiceGroup.
   Pengguna mengubah nilai pada Gauge yang ditetapkan interaktif.
   Pengguna mengubah data pada TextField.
   Pengguna memasukkan atau mengubah informasi tanggal dan atau waktu pada DateField.
           Kelas yang berkaitan dengan interface ini adalah kelas Item (javax.microedition.lcdui.Item)
yang merupakan superkelas dari sebuah objek yang bisa ditempatkan pada sebuah form. Superkelas
Item ini menyediakan fungsi getLabel() yang diturunkan ke semua subkelasnya yakni sebagai
berikut:
   public string getLabel()
    Menghasilkan string label dari objek Item yang bersangkutan.
           Fungsi tersebut penting untuk menentukan jenis aksi yang akan dilakukan oleh aplikasi.
Selayaknya      sebuah    interface, objek yang      mengimplementasikan     suatu interface     harus
mengimplementasikan        fungsi-fungsi   yang    ada   di   dalam   interface   tersebut.   Interface
ItemStateListener hanya menyediakan 1 buah fungsi yang harus diimplementasikan oleh kelas yang
mengimplementasikannya yakni:
   public void itemStateChanged(Item t)
           Selain itu form yang akan mengimplementasikan interface ini harus memanggil fungsi
setItemStateListener(Listener t). Berikut contoh programnya:
//Program itemChange.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class itemChange extends MIDlet implements ItemStateListener                   {
    private Display display;
    private Form f;
    private TextBox t;
    private DateField d;


    public itemChange() {
    }
    public void startApp() {
        f = new Form("Informasi Waktu");
        d = new DateField("Today's date", DateField.DATE);
        f.append(d);


                                                                                                  83
Andino Maseleno
Bab 4 –Manajemen Event




        f.setItemStateListener(this);
        Display.getDisplay(this).setCurrent(f);
    }
    public void pauseApp() {}
    public void destroyApp (boolean unconditional) {}
    public void itemStateChanged(Item t) {
        StringItem s = new StringItem("","Anda telah memasukkan info tanggal");
        f.append(s);
    }
}



Penanganan Level Rendah untuk Event
        Penanganan event pada level tinggi digunakan pada komponen-komponen GUI level tinggi
semacam TextBox, Gauge, dan ChoiceGroup. Penanganan event level rendah digunakan pada
komponen GUI level rendah, yakni dengan kelas Canvas. Berikut contoh programnya:
//Program pindahKotak.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class pindahKotakCanvas extends Canvas {
    private int x = 0;
    private int y = 0;
    private int w = 10;
    private int h = 10;


    public void paint (Graphics g) {
        g.setColor(255,255,255);
        g.fillRect(0,0,getWidth(),getHeight());
        g.setColor(23,0,0);
        g.fillRect(x,y,w,h);
    }
    protected void keyPressed(int Keycode) {
        int action = getGameAction(Keycode);
        if(action == RIGHT) {
           x+=w;
        } else if(action == LEFT) {
           x-=w;
        } else if(action == DOWN) {



                                                                                        84
Andino Maseleno
Bab 4 –Manajemen Event




             y+=h;
         } else if(action == UP) {
             y-=h;
         }
         if(x<0) {
             x=0;
         }
         if(y<0) :
             y=0;
         }
         if((x+w)>=getWidth()) {
             x=getWidth()-w;
         }
         if((y+h)>=getHeight()) {
             y=getHeight()-y;
         }
         repaint();
     }
};
public class pindahKotak extends MIDlet {
     private Display display;
     public pindahKotak() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new pindahKotakCanvas();
         display.setCurrent(canvas);
     }
     public void pauseApp() {
     }
     public void destroyApp(boolean unconditional) {
     }
}
Dalam penanganan event pada level rendah tidak disediakan interface khusus sebagaimana
penanganan event pada level tinggi, namun digunakan fungsi-fungsi yang disediakan oleh kelas
Canvas (javax.microedition.lcdui.Canvas) itu sendiri, yakni:
    protected void keyPressed(int keyCode)
     Fungsi ini digunakan untuk mendeteksi sebuah tombol sedang ditekan.



                                                                                            85
Andino Maseleno
Bab 4 –Manajemen Event




   protected void keyReleased(int keyCode)
    Fungsi ini digunakan untuk mendeteksi sebuah tombol selesai ditekan.
   protected void keyRepeated(int keyCode)
    Fungsi ini digunakan untuk mendeteksi sebuah tombol ditekan secara terus menerus.
   protected void pointerPressed(int x, int y)
   protected void pointerDragged(int x, int y)
   protected void pointerReleased(int x, int y)
         Namun tidak semua fungsi di atas bisa diimplementasikan pada semua emulator dan
perangkat aslinya, misalnya pointerPressed(), pointerDragged(), dan pointerReleased() yang tidak
selalu tersedia pada sebuah perangkat. Demikian pula dengan keyRepeated () yang juga tidak selalu
tersedia pada sebuah perangkat, sehingga perlu melakukan pengecekan terlebih dahulu dengan
fungsi-fungsi berikut:
   public boolean hasPointerEvents()
   public boolean hasPointerMotionsEvents()
   public boolean hasRepeatEvents()
         Fungsi pertama digunakan untuk memeriksa apakah sebuah perangkat mendukung adanya
masukan pointer (sejenis touch screen pada Palm dan PocketPC) atau tidak, dan berkaitan dengan
dimungkinkannya penggunaan fungsi pointerPressed() dan pointerReleased() pada sebuah
perangkat. Fungsi kedua, yakni hasPointerMotionEvents() berkaitan dengan dimungkinkannya atau
tidak dimungkinkannya penggunaan fungsi pointerDragged(). Fungsi ketiga berkaitan dengan
dimungkinkannya atau dimungkinkannya penggunaan fungsi keyRepeated() pada perangkat yang
menjalankan MIDlet.


Definsi Kunci Masukan pada Kelas Canvas
         Pada kelas Canvas telah disediakan konstanta-konstanta yang penting untuk mengenali
jenis masukan yang diberikan oleh pengguna. Konstanta-konstanta ini merupakan nilai integer yang
terdiri atas nilai-nilai berikut:
   KEY_NUM0
    Bernilai integer 48, dan dikaitkan dengan tombol angka 0.
   KEY_NUM1
    Bernilai integer 49, dan dikaitkan dengan tombol angka 1.
   KEY_NUM2


                                                                                            86
Andino Maseleno
Bab 4 –Manajemen Event




    Bernilai integer 50, dan dikaitkan dengan tombol angka 2.
   KEY_NUM3
    Bernilai integer 51, dan dikaitkan dengan tombol angka 3.
   KEY_NUM4
    Bernilai integer 52, dan dikaitkan dengan tombol angka 4.
   KEY_NUM5
    Bernilai integer 53, dan dikaitkan dengan tombol angka 5.
   KEY_NUM6
    Bernilai integer 54, dan dikaitkan dengan tombol angka 6.
   KEY_NUM7
    Bernilai integer 55, dan dikaitkan dengan tombol angka 7.
   KEY_NUM8
    Bernilai integer 56, dan dikaitkan dengan tombol angka 8.
   KEY_NUM9
    Bernilai integer 57, dan dikaitkan dengan tombol angka 9.
   KEY_STAR
    Bernilai integer 42, dan dikaitkan dengan bintang ‘*’.
   KEY_POUND
    Bernilai integer 35, dan dikaitkan dengan tombol angka ‘#’.
   UP
    Bernilai integer 1, dan dikaitkan dengan tombol panah atas.
   DOWN
    Bernilai integer 6, dan dikaitkan dengan tombol panah bawah.
   LEFT
    Bernilai integer 2, dan dikaitkan dengan tombol panah kiri.
   RIGHT
    Bernilai integer 5, dan dikaitkan dengan tombol panah kanan.
         Fungsi-fungsi pada kelas Canvas yang dikaitkan dengan nilai-nilai konstanta lain yang
disediakan adalah:
   public int getGameAction(int keyCode)
    Akan menghasilkan nilai integer yang berkaitan dengan keyCode, yang umumnya diambil dari
    fungsi-fungsi keyPressed(), keyReleased(), dan sejenisnya.


                                                                                         87
Andino Maseleno
Bab 4 –Manajemen Event




    public String getKeyName(int keyCode)
     Akan menghasilkan nama kunci yang berkaitan dengan keyCode yang umumnya diambil dari
     fungsi-fungsi keyPressed(), keyReleased(), dan sejenisnya.
    public int getKeyCode
     Fungsi kebalikan dari getGameAction(), yang menghasilkan nilai integer keyCode yang
     berkaitan dengan nilai gameAction yang dihasilkan oleh fungsi getGameAction.
         Berikut contoh programnya:
//Program deteksiTombol.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


class deteksiTombolCanvas extends Canvas {
     private String namaTombol = null;
     private Font f;


     public void paint(Graphics g) {
         f = g.getFont();
         int tinggiFont = f.getHeight();
         g.setColor(255,255,255);
         g.fillRect(0,0,getWidth(),getHeight());
         g.setColor(0x000000);
         if (namaTombol != null) {
             g.drawString("Anda menekan:",1,1,g.TOP | g.LEFT);
             g.drawString(namaTombol,1,1+tinggiFont,g.TOP | g.LEFT);
         }
     }
     protected void keyPressed(int keyCode) {
         namaTombol = getKeyName(keyCode);
         repaint();
     }
};
public class deteksiTombol extends MIDlet {
     private Display display;
     public deteksiTombol() {
     }
     public void startApp() {
         display = Display.getDisplay(this);
         Canvas canvas = new deteksiTombolCanvas();


                                                                                           88
Andino Maseleno
Bab 4 –Manajemen Event




        display.setCurrent(canvas);
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }
}




                                                                       89
Andino Maseleno
Bab 5 – Pemrograman Database




Bab 5

Pemrograman Database

        Pada sebuah perangkat handphone berbasis Java yang bisa menjalankan MIDlet, disediakan
media untuk penyimpanan yang bersifat non-volatile. Artinya, jika menyimpan pada media yang
non-volatile, semacam disket, harddisk, data tersebut tidak akan hilang jika terjadi kehilangan
energi listrik. Media penyimpanan non-volatile ini dalam MIDlet dikenal dengan nama RMS
(Record Management System).


Record Management System (RMS)
        RMS merupakan implementasi database sederhana untuk digunakan dalam MIDlet Java
yang berorientasi record. Jika aplikasi yang dibuat ingin memanfaatkan fasilitas RMS ini, terlebih
dahulu harus mengimpor paket yang menyediakan fungsi-fungsi untuk manajemen RMS , yakni
javax.microedition.rms.*. Data yang ada di dalam database RMS dikenal dengan istilah
RecordStore. Fungsi-fungsi dalam paket javax.microedition.rms.* akan menyediakan fungsi-fungsi
untuk menghapus, menambah, mengubah data, dan manipulasi lain pada RecordStore. Fungsi-
fungsi dalam javax.microedition.rms.* juga menyediakan mekanisme yang memungkinkan dua atau
lebih MIDlet dalam satu aplikasi untuk berbagi data RecordStore.


Paket javax.microedition.rms
        Paket javax.microedition.rms menyediakan fungsi-fungsi untuk mengimplementasikan
database RMS pada MIDlet. Paket ini terdiri atas:
Interface
   RecordComparator
    Mendefinisikan komparator atau pembanding ketika melakukan komparasi/perbandingan antara
    dua record dalam RMS.
   Record Enumerator
    Merepresentasikan enumator record yang bersifat bidirectional (dua arah).
   RecordFilter
    Mendefinisikan filter yang digunakan untuk menganalisis sebuah record pada RecordStore,
    apakah memenuhi suatu kriteria tertentu sesuai dengan filter yang diberikan atau tidak.


                                                                                              90
Andino Maseleno
Bab 5 – Pemrograman Database




    RecordListener
Mendeteksi record yang ditambahkan, diubah, atau dihapus dalam sebuah RecordStore.
Kelas
   RecordStore
    Merupakan kelas utama yang harus digunakan untuk membuat objek RecordStore
Exception
   InvalidRecordIDException
    Jika ditemukan RecordID yang tidak valid, eksepsi ini akan dilemparkan.
   RecordStoreException
    Eksepsi umum yang digunakan jika terjadi kesalahan pada manajemen objek RecordStore.
   RecordStoreFullException
    Jika tempat penyimpanan RecordStore sudah penuh, eksepsi ini akan dilemparkan ke sistem.
   RecordStoreNotFoundException
    Jika tempat penyimpanan RecordStore tidak ditemukan, eksepsi ini akan dilemparkan ke
    sistem.
   RecordStoreNotOpenException
    Jika tempat penyimpanan RecordStore tidak dibuka (opened), eksepsi ini akan dilemparkan ke
    sistem.


Pemrograman RMS
        Bagian ini akan membahas hal-hal penting yang perlu diketahui untuk dapat memprogram
database pada MIDlet dengan RMS.
Kelas RecordStore
        Database pada MIDlet diimplementasikan dengan RecordStore. Untuk membuat database
RecordStore baru, cukup memanggil fungsi statik openRecordStore() seperti di bawah ini:
RecordStore obj =
RecordStore.openRecordStore(“myDatabase”,          true)
        Parameter pertama pada fungsi openRecordStore adalah nama database yang akan dibuat,
sedangkan parameter kedua dapat bernilai true/false, jika ditetapkan true. Ketika RecordStore tidak
ditemukan, otomatis akan langsung dibuat. Berikut program untuk membuat database RecordStore:


//Program newDatabaseRMS.java


                                                                                              91
Andino Maseleno
Bab 5 – Pemrograman Database




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


public class newDatabaseRMS extends MIDlet implements CommandListener {
  private Display display;
  private Command createCmd = new Command(“Buat”, Command.OK, 1);
  private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
  private Form f;
  private TextField t;
  private RecordStore myDb;
  private Ticker tck;


  public newDatabaseRMS() {
  }
  public void startApp() {
      display = Display.getDisplay(this);
      f = new Form(“Pemrograman RMS”);
      t = new TextField(“Nama RecordStore”, null, 32, TextField.ANY);
      tck = new Ticker(“”);
      f.append(t);
      f.addCommand(createCmd);
      f.addCommand(exitCmd);
      f.setCommandListener(this);
      f.setTicker(tck);
      display.setCurrent(f);
  }
  public void buatDb() {
      try{
          myDb = RecordStore.openRecordStore(t.getString(), true);
          tck.setString(“Database “ +t.getString() + “berhasil dibuat”);
          display.setCurrent(f);
      } catch (RecordStoreException e) {
          tck.setString(“Ada kesalahan pembuatan database”);
          display.setCurrent(f);
      }
  }
  public void keluar() {
      this.destroyApp(true);
  }


                                                                                 92
Andino Maseleno
Bab 5 – Pemrograman Database




    public void commandAction(Command c, Displayable d) {
         String lbl = c.getLabel();
         if (lbl.equals(“Keluar”)) {
              keluar();
        } else if (lbl.equals(“Buat”)) {
             buatDb();
        }
    }
    public void pauseApp() {
    }
    public void destroyApp (boolean unconditional) {
         notifyDestroyed();
    }
}



Menambah Data pada RecordStore
            Operasi pertama dalam manipulasi database RMS adalah menambah data pada
RecordStore. Satu hal yang perlu diketahui adalah, data yang dioperasikan dalam database RMS
menggunakan array of bytes, sehingga akan digunakan kelas-kelas berikut untuk membungkus data
menjadi array of bytes (larik bit data):
   DataInputStream
   DataOutputStream
   ByteArrayInputStream
   ByteArrayOutputStream
Kelas-kelas di atas disediakan pada paket java.io.
    Fungsi pada kelas RecordStore yang digunakan untuk menambah data adalah sebagai berikut:
   public void addRecord(byte[] data, int offset, int length)
data : larik bit data yang akan ditambahkan ke RecordStore
offset : index awal larik data yang akan ditambahkan
length : panjang bit data yang akan ditambahkan
Jika terjadi kesalahan, ada empat kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:
   RecordStoreNotOpenException
    Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)
   RecordStoreFullException


                                                                                             93
Andino Maseleno
Bab 5 – Pemrograman Database




    Terjadi jika RecordStore sudah tidak bisa ditambah lagi datanya.
   RecordStoreException
    Terjadi kesalahan pada RecordStore di luar dua hal di atas.
   NullPointerException
    Jika bit datanya null, namun length lebih besar daripada nol
Program di bawah ini digunakan untuk menambah data pada RecordStore pada MIDlet


//Program tambahDataRMS.java
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class tambahdataRMS extends MIDlet implements CommandListener {
    private Display display;
    private Command openCmd = new Command(“Buka DB”, Command.OK, 1);
    private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
    private Command addCmd = new Command(“Tambahkan, Command.OK, 1);
    private Form f, f2;
    private TextField t, t2;
    private RecordStore myDb;
    private Ticker tck;
    public tambahDataRMS() {
    }
    public void startApp() {
        display = Display.getDisplay(this);
        f = new Form(“Tambah data RMS”);
        t = new TextField(“Nama RecordStore”, null, 32, TextField.ANY);
        tck = new Ticker(“”);
        f.append(t);
        f.addCommand(openCmd);
        f.addCommand(exitCmd);
        f.setCommandListener(this);
        f.setTicker(tck);
        display.setCurrent(f);
    }
    public void tambahData() {
        f2 = new Form (“Tambah data pada “ +t.getString());


                                                                                              94
Andino Maseleno
Bab 5 – Pemrograman Database




      t2 = new TextField(“Data ?”, null, 256, TextField.ANY);
      f2.append(t2);
      f2.addCommand(addCmd);
      f2.addCommand(exitCmd);
      f2.setCommandListener(this);
      f2.setTicker(tck);
      display.setCurrent(f2);
  }
  public void tambahkan() {
      try {
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          DataOutputStream   dos = new DataOutputStream(baos);
          dos.writeUTF(t2.getString());
          byte[] b = baos.toByteArray();
          myDb.addRecord(b, 0, b.length);
          tck.setString(“Data berhasil ditambahkan”);
          display.setCurrent(f2);
      } catch (IOException e) {
           tck.setString(“Ada kesalahan I/O”);
           display.setCurrent(f2);
      } catch (RecordStoreFullException e) {
           tck.setString(“Record Store sudah penuh);
           display.setCurrent(f2);
      } catch (RecordStoreNotOpenException e) {
      } catch (RecordStoreException e) {
      }
  }
  public void bukaDb() {
      try {
          myDb = RecordStore.OpenRecordStore(t.getString(), false);
          tck.setString(“Database “ +t.getString() +” berhasil dibuka”);
          tambahData();
      } catch (RecordStoreNotFoundException e) {
          tck.setString(“Tidak ditemukan database yang dimaksud”);
           display.setCurrent(f);
      } catch (RecordStoreException e) {
      }
  }
  public void keluar() {
      try {


                                                                                  95
Andino Maseleno
Bab 5 – Pemrograman Database




            myDb.closeRecordStore();
            this.destroyApp(true);
        } catch (RecordStoreNotOpenException e) {
                System.out.println(“Gagal tutup Record Store”);
        } catch (RecordStoreException e) {
        } catch (NullPointException e) {
            this.destroyApp(true);
        }
    }
     public void commandAction(Command c, Displayable d) {
         String lbl = c.getLabel();
            if (lbl.equals(“Keluar”)) {
                keluar();
            } else if (lbl.equals(“Buka DB”)) {
                bukaDb();
            } else if (lbl.equals(“Tambahkan”)) {
            tambahkan();
            }
    }
    public void pauseApp () {
    }
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
}
        Program di atas akan menampilkan masukan informasi database yang telah dibuat dengan
contoh MIDlet pertama pada bab ini, kemudian akan melakukan penambahan data sesuai dengan
yang diinginkan.
        RecordID merupakan primary key atau nomor unik sebagai penanda dari suatu record.
RecordID dalam sebuah RecordStore merupakan sebuah nilai integer diawali dengan nomor satu
dan bersifat autoincrement, yakni record berikutnya akan selalu memiliki nilai RecordID = nilai
RecordAD sebelumnya + 1.


Mengambil Data dari RecordStore
        Operasi kedua dalam manipulasi database RMS adalah mengambil data dari ReordStore.
Seperti yang telah diketahui sebelumnya, data dalam RecordStore disimpan dalam bentuk array of
bytes, sehingga umumnya akan dilakukan hal berikut untuk mengubahnya menjadi objek String


                                                                                          96
Andino Maseleno
Bab 5 – Pemrograman Database




biasa.
         ByteArrayInputStream bais = new ByteArrayInputStream(record);
         DataInputStream dis = new DataInputStream(bais);
         String in = dis.readUTF();
         Record adalah bit yang dibaca dari RecordStore yang bersangkutan. Adapun fungsi-fungsi
yang     digunakan    untuk    membaca      dari   RecordStore    yang   disediakan   oleh      kelas
javax.microedtion.rms.RecordStore adalah:
   public byte[] getRecord(int RecordID)
RecordID: nomor RecordID yang akan diambil darinya.
Jika terjadi kesalahan, ada tiga kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:
        RecordStoreNotOpenException
         Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)
        InvalidRecordIDException
         Terjadi jika RecordID yang diberikan tidak valid
        RecordStoreException
         Terjadi jika kesalahan pemrosesan RecordStore di luar kesalahan di atas.
    Untuk mendapatkan jumlah data dalam RecordStore, dapat digunakan fungsi getNumRecords()
sebagai berikut:
   public int getNumRecords()
    Jika terjadi kesalahan ada satu kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni :
        RecordStoreNotOpenException
         Terjadi jika RecordStore tidak dalam keadaan terbuka (opened). Agar lebih mengerti, coba
         perhatikan contoh program MIDlet berikut ini:


//Program tampilDataRMS.java
import javax.microedition.rms;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class tampilDataRMS extends MIDlet implements CommandListener {
    private Display display;
    private Command openCmd = new Command(“Tampilkan”, Command.OK, 1);
    private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);



                                                                                                97
Andino Maseleno
Bab 5 – Pemrograman Database




  private Command backCmd = new Command(“Kembali”, Command.EXIT, 2);
  private Form f, f2;
  private TextField t, t2;
  private RecordStore myDb;
  private Ticker tck;
  public tampilDataRMS() {
  }
  public void startApp() {
      display = Display.getDisplay(this);
      f = new Form(“ Tampilkan data “);
      t = new TextField(“Nama Record Store”, null, 32, TextField.ANY);
      tck = new Ticker(“”);
      f.append(t);
      f.addCommand(openCmd);
      f.addCommand(exitCmd);
      f.setCommandListener(this);
      f.setTicker(tck);
      display.setCurrent(f);
  }
  public void tampilkan() {
      try {
         f2 = new Form(“Datanya “);
         ChoiceGroup dt = new ChoiceGroup(“”, Choice.EXCLUSIVE);
         f2.addCommand(backCmd);
         f2.setCommandListener(this);
         f2.append(dt);
         ByteArrayInputStream bais;
         DataInputStream dis;
         String in;
          //Baca seluruh data dalam database
         for (int i=1; i<myDb.getNumRecords(); i++) {
              bais = new ByteArrayInputStream(myDb.getRecord(i));
              dis = new DataInputStream(bais);
              in = dis.readUTF();
              dt.append(in, null);
         }
         display.setCurrent(f2);
      } catch (IOException e) {
         tck.setString(“Ada kesalahan I/O”);
         display.setCurrent(f2);


                                                                                  98
Andino Maseleno
Bab 5 – Pemrograman Database




       } catch (RecordStoreNotOpenException e) {
           tck.setString(“Ada kesalahan RecordStore”);
                  display.setCurrent(f2);
           }
  }
  public void kembali() {
       tck.setString(“”);
       display.setCurrent(f);
  }
  public void bukaDb() {
       try {
           myDb = RecordStore.openRecordStore(t.getString(), false);
           tck.setString(“Database “ +t.getString() + “berhasil dibuka”);
           tampilkan();
       } catch (RecordStoreNotFoundException e) {
               tck.setString(“Tidak ditemukan database yang dimaksud”);
               display.setCurrent(f);
       } catch (RecordStoreException e) {
       }
  }
  public void keluar() {
  //tutup database terlebih dahulu
       try {
           myDb.closeRecordStore();
           this.destroyApp(true);
       } catch (RecordStoreNotOpenException e) {
           System.out.println(“Gagal tutup Record Store”);
       } catch (RecordStoreException e) {
       } catch (NullPointerException e) {
           This.destroyApp(true);
       }
  }
  public void commandAction(Command c, Displayable d) {
       String lbl = c.getLabel();
       if (lbl.equals(“Keluar”)) {
           keluar();
      } else if (lbl.equals(“Tampilkan”)) {
           bukaDb();
      } else if (lbl.equals(“Kembali”)) {
           kembali();


                                                                                     99
Andino Maseleno
Bab 5 – Pemrograman Database




        }
    }
    public void pauseApp() {
            //Tidak melakukan apa-apa
    }
    public void destroyApp (boolean unconditional) {
        notifyDestroyed();
    }
}



Menghapus Data dari RecordStore
        Operasi ketiga dalam manipulasi database RMS adalah menghapus data dari RecordStore.
Adapun fungsi-fungsi yang digunakan untuk menghapus data dari RecordStore yang disediakan
oleh kelas javac.microedition.rms.RecordStore adalah:
   public void deleteRecord(int RecordID)
RecordID : nomor RecordID yang akan diambil datanya
Jika terjadi kesalahan, ada tiga kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:
   RecordStoreNotOpenException
    Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)
   InvalidRecordIDException
    Terjadi jika RecordID yang diberikan tidak valid
   RecordStoreException
    Terjadi jika kesalahan pemrosesan RecordStore di luar kesalahan di atas
Untuk mendapatkan informasi RecordId, bisa digunakan prosedur yang sama dengan prosedur yang
digunakan untuk menampilkan data yang telah dijelaskan sebelumnya. Berikut program menghapus
data pada RecordStore pada MIDlet:


//program hapusDataRMS.java
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class hapusDataRMS extends MIDlet implements CommandListener {
    private Display display;


                                                                                                100
Andino Maseleno
Bab 5 – Pemrograman Database




  private Command openCmd = new Command(“Buka”, Command.OK, 1);
  private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
  private Command backCmd = new Command(“Kembali”, Command.EXIT, 1);
  private Command hapusCmd = new Command(“Hapus”, Command.OK, 1);
  private Form f, f2;
  private TextField t, t2;
  private RecordStore myDb;
  private Ticker tck;
  private ChoiceGroup dt;
  public hapusDataRMS() {
  }
  public void startApp() {
      display = Display.getDisplay(this);
      f = new Form(“Hapus data”);
      t = new TextField(“Nama Record Store”, null, 32, TextField.ANY);
      tck = new Ticker(“”);
      f.append(t);
      f.addCommand(openCmd);
      f.addCommand(exitCmd);
      f.setCommandListener(this);
      f.setTicker(tck);
      display.setCurrent(f);
  }
  public void tampilkan() {
      try {
         f2 = new Form(“Datanya”);
         dt = new ChoiceGroup(“”, Choice.EXCLUSIVE);
         f2.addCommand(backCmd);
         f2.addCommand(hapusCmd);
         f2.setCommandListener(this);
         f2.append(dt);
         ByteArrayInputStream bais;
         DataInputStream dis;
         String in;
         RecordEnumeration enum = myDb.enumerateRecords(null, null, false);
         while(enum.hasNextElement()) {
              int recId = enum.nextRecordId();
              bais = new ByteArrayInputStream(myDb.getRecord(recId));
              dis = new DataInputStream(bais);
              in = dis.readUTF();


                                                                                 101
Andino Maseleno
Bab 5 – Pemrograman Database




               in = in + “ ( “ + (new Integer(recId)).toString() + “)”;
               dt.append(in, null);
           }
           display.setCurrent(f2);
      } catch (IOException e) {
            tck.setString(“Ada kesalahan I/O”);
            display.setCurrent(f2);
      } catch (RecordStoreNotOpenException e) {
      } catch (RecordStoreException e) {
           tck.setString(“Ada kesalahan RecordStore”);
           display.setCurrent(f2);
       }
  }
  public void kembali() {
       tck.setString(“”);
       display.setCurrent(f);
  }
  public void hapusData() {
      try {
           String strData = dt.getString(dt.getSelectedIndex());
           ByteArrayInputStream bais;
           DataInputStream dis;
           String in;
           RecordEnumeration enum = myDb.enumerateRecords(null, null, false);
           while (enum.hasNextElement()) {
               int recId = enum.nextRecordId();
               bais = new ByteArrayInputStream(myDb.getRecord(recId));
               dis = new DataInputStream(bais);
               in = dis.readUTF();
               in = in + “(“ + (new Integer(recId)).toString() + “)”;
               if (in.equals(strData)) {
                   myDb.deleteRecord(recId);
                   break;
               }
           }
           tampilkan();
      } catch (IOException e) {
           tck.setString(“Ada kesalahan I/O”);
           display.setCurrent(f2);
      } catch (RecordStoreNotOpenException e) {


                                                                                  102
Andino Maseleno
Bab 5 – Pemrograman Database




      } catch (RecordStoreException e) {
          tck.setString(“Ada kesalahan RecordStore”);
          display.setCurrent(f2);
      }
  }
  public void bukaDb() {
      try {
          myDb = RecordStore.OpenRecordStore(t.getString(), false);
          tck.setString(“Database “ + t.getString() + “berhasil dibuka”);
          tampilkan();
      } catch (RecordStoreNotFoundException e) {
          tck.setString(“Tidak ditemukan database yang dimaksud”);
          display.setCurrent(f);
      } catch (RecordStoreException e) {
      }
  }
  public void keluar() {
      try {
          myDb.closeRecordStore();
          this.destroyApp(true);
      } catch (RecordStoreNotOpenException e) {
          System.out.println(“Gagal tutup Record Store”);
      } catch (RecordStoreException e) {
      } catch (NullPointerException e) {
          this.destroyApp(true);
      }
  }
  public void commandAction (Command c, Displayable d) {
      String lbl = c.getLabel();
          if (lbl.equals(“Keluar”)) {
              keluar();
          } else if (lbl.equals(“Tampilkan”)) {
              bukaDb();
          } else if (lbl.equals(“Kembali”)) {
              kembali();
          }
      }
  public void pauseApp() {
  }
  public void destroyApp (boolean unconditional) {


                                                                                  103
Andino Maseleno
Bab 5 – Pemrograman Database




        notifyDestroyed();
    }
}



Mengganti Data dari RecordStore
        Operasi keempat dalam manipulasi database RMS adalah mengganti data dari RecordStore.
Adapun fungsi-fungsi yang digunakan untuk mengganti data dari RecordStore yang disediakan oleh
kelas javax.microedition.rms.RecordStore adalah:
   public void setRecord(int RecordID, byte[] data, int offset, int length)
data: larik bit data yang akan ditambahkan ke RecordStore
offset: index awal larik data yang akan ditambahkan
length: panjang bit data yang akan ditambahkan
RecordID: nomor record ID yang akan diubah datanya
Jika terjadi kesalahan, ada empat kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:
   RecordStoreNotOpenException
    Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)
   RecordStoreFullException
    Terjadi jika RecordStore sudah tidak bisa ditambah lagi datanya
   RecordStoreException
    Terjadi kesalahan pada RecordStore di luar dua hal di atas
   InvalidRecordIDException
    Jika record ID tidak valid
    Untuk mendapatkan informasi RecordId, bisa digunakan prosedur yang sama dengan prosedur
yang digunakan untuk menampilkan data. Berikut contoh program untuk mengganti data pada
RecordStore pada MIDlet:


//Program gantiDataRMS.java
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class gantiDataRMS extends MIDlet implements CommandListener {
    private Display display;


                                                                                              104
Andino Maseleno
Bab 5 – Pemrograman Database




      private Command openCmd = new Command(“Buka”, Command.OK, 1);
      private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
      private Command backCmd = new Command(“Kembali”, Command.EXIT, 1);
      private Command gantiCmd = new Command(“Ganti”, Command.OK, 1);
      private Command prosesGantiCmd = new Command(“Proses”, Command.OK, 1);
      private Form f, f2, f3;
      private TextField t, t2, t3;
      private RecordStore myDb;
      private Ticker tck;
      private ChoiceGroup dt;


      public gantiDataRMS() {
      }
      public void startApp() {
          display = Display.getDisplay(this);
          f = new Form(“Ganti data”);
          t = new TextField(“Nama Record Store”, null, 32, TextField.ANY);
          tck = new Ticker(“”);
          f.append(t);
          f.addCommand(openCmd);
      f.addCommand(exitCmd);
      f.setCommandListener(this);
      f.setTicker(tck);
      display.setCurrent(f);
  }
  public void tampilkan() {
      try {
          f2 = new Form(“Datanya”);
          dt = new ChoiceGroup(“”, Choice.EXCLUSIVE);
          f2.addCommand(backCmd);
          f2.addCommand(gantiCmd);
          f2.setCommandListener(this);
          f2.append(dt);
          ByteArrayInputStream bais;
          DataInputStream dis;
          String in;


          RecordEnumeration enum = myDb.enumerateRecords(null, null, false);
          while(enum.hasNextElement()) {


                                                                                105
Andino Maseleno
Bab 5 – Pemrograman Database




              int recId = enum.nextRecordId();
              bais = new ByteArrayInputStream(myDb.getRecord(recId));
              dis = new DataInputStream(bais);
              in = dis.readUTF();
              in = in + “(“ + (new Integer(recId)).toString() + “)”;
              dt.append(in, null);
          }
          display.setCurrent(f2);
      } catch (IOException e) {
          tck.setString(“Ada kesalahan I/O”);
          display.setCurrent(f2);
      } catch (RecordStoreNotOpenException e) {
      } catch (RecordStoreException e) {
          tck.setString(“Ada kesalahan RecordStore”);
          display.setCurrent(f2);
      }
  }
  public void kembali() {
      tck.setString(“”);
      display.setCurrent(f);
  }
  public void formGantiData() {
      f3 = new Form(“Data Baru : “);
      t3 = new TextField(null, null, 256, TextField.ANY);
      f3.append(t3);
      f3.addCommand(prosesGantiCmd);
      f3.addCommand(backCmd);
      f3.setCommandListener(this);
      display.setCurrent(f3);
  }
  public void gantiData() {
      try { //Ambil informasi data yang dipilih untuk diganti
          String strData = dt.getString(dt.getSelectedIndex());
          ByteArrayInputStream bais;
          DataInputStream dis;
          String in;
          int recId;
          RecordEnumeration enum = myDb.enumerateRecords(null, null, false);
          while(enum.hasNextElement()) {
              recId = enum.nextRecordId();


                                                                                  106
Andino Maseleno
Bab 5 – Pemrograman Database




                bais = new ByteArrayInputStream(myDb.getRecord(recId));
                dis = new DataInputStream(bais);
            in = dis.readUTF();
            in = in + “(“ + (new Integer(recId)).toString() + “)”;
            if (in.equals(strData)) {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                DataOutputStream dos = new DataOutputStream(baos);
                dos.writeUTF(t3.getString());
                byte[] b = baos.toByteArray();
                myDb.setRecord(recId, b, 0, b.length);
                break;
            }
        }
        tampilkan();
        } catch (IOException e) {
            tck.setString(“Ada kesalahan I/O”);
            display.setCurrent(f2);
        } catch (RecordStoreNotOpenException e) {
        } catch (RecordStoreException e) {
        tck.setString(“Ada kesalahan RecordStore”);
        display.setCurrent(f2);
                   }
    }
    public void bukaDb(){
    try{
        myDb = RecordStore.openRecordStore(t.getString(),false);
        tck.setString(“Database “ +t.getString() + “berhasil dibuka”);
        tampilkan();
    } catch(RecordStoreNotFoundException e) {
        tck.setString(“Tidak ditemukan database yang dimaksud”);
        display.setCurrent(f);
    } catch (RecordStoreException e) {
    }
}


    public void keluar() {
    try{
        myDb.closeRecordStore();
        this.destroyApp(true);
    } catch (RecordStoreNotOpenException e) {


                                                                                   107
Andino Maseleno
Bab 5 – Pemrograman Database




    System.out.println(“Gagal tutup Record Store”);
    } catch(RecordStoreException e) {
    } catch(NullPointerException e) {
           this.destroyApp(true;
    }
    }
    public void CommandAction(Command c, Displayable d) {
        String lbl = c.getLabel();
        if (lbl.equals(“Keluar”)) {
             keluar();
        } else if (lbl.equals(“Buka”)) {
             bukaDb();
        } else if (lbl.equals(“Kembali”)) {
             kembali();
        } else if (lbl.equals(“Ganti”)) {
             formGantiData();
        } else if (lbl.equals(“Proses”)) {
             gantiData();
        }
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
}



    Proses penggantian data ini caranya sama dengan cara yang digunakan untuk menambahkan
data baru pada RecordStore, hanya saja dibutuhkan informasi nomor RecordID yang akan diubah
datanya.


Menampilkan Daftar RecordStore
    Untuk menampilkan informasi RecordStore yang ada dalam sistem , bisa digunakan fungsi
berikut:
   public static String[] listRecordStores()
    Fungsi ini menghasilkan list dari RecordStore yang ada. Jika tidak ada RecordStore maka akan
    dikembalikan nilai null. Contoh penggunaan fungsi listRecordStores() adalah sebagai berikut:


                                                                                          108
Andino Maseleno
Bab 5 – Pemrograman Database




//Program informasiRMS.java
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class informasiRMS extends MIDlet implements CommandListener {
   private Display display;
   private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
   private Form f, f2;
       private TextField t, t2;
       private RecordStore myDb;
       private Ticker tck;
       private ChoiceGroup dt;
   public informasiRMS() {
   }
   public void startApp() {
       display = Display.getDisplay(this);
       f = new Form(null);
       dt = new ChoiceGroup(“Daftar Database”, Choice.EXCLUSIVE);
       tck = new Ticker(“Informasi RMS”);
       f.addCommand(exitCmd);
       f.setCommandListener(this);
       f.setTicker(tck);
       tampilkan();
       display.setCurrent(f);
   }
   public void tampilkan() {
       String allDbs[] = RecordStore.listRecordStores();
       for (int i=0; i<allDbs.length; i++) {
           dt.append(allDbs[i], null);
       }
       f.append(dt);
   }
   public void keluar() {
       this.destroyApp(true);
   }
   public void commandAction(Command c, Displayable d) {



                                                                                 109
Andino Maseleno
Bab 5 – Pemrograman Database




        String lbl = c.getLabel();
            if (lbl.equals(“Keluar”)) {
                keluar();
            }
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
         notifyDestroyed();
    }
}



Menghapus RecordStore
    Untuk menghapus RecordStore yang ada dalam sistem, bisa digunakan fungsi sebagai berikut:
   public void static deleteRecordStore(String name)
    Parameter name merupakan nama RecordStore yang akan dihapus. Jika terjadi kesalahan, ada
    dua kemungkinan eksepsi yang akan dilemparkan, yakni:
   RecordStoreNotFoundException
    Terjadi jika RecordStore tidak ketemu
   RecordStoreException
    Terjadi kesalahan pada RecordStore di luar dua hal di atas
    Berikut contoh program untuk menampilkan daftar database/RecordStore yang ada untuk bisa
dihapus :


//Program hapusDatabaseRMS.java
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;


public class hapusDatabaseRMS extends MIDlet implements CommandListener {
import javax.microedition.rms.*;
import java.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;




                                                                                         110
Andino Maseleno
Bab 5 – Pemrograman Database




public class hapusDatabaseRMS extends MIDlet implements CommandListener {
  private Display display;
  private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
  private Command hapusCmd = new Command(“Hapus”, Command.OK, 1);
  private Form f, f2;
  private TextField t, t2;
  private RecordStore myDb;
  private Ticker tck;
  private ChoiceGroup dt;
  public hapusDatabaseRMS() {
  }
  public void startApp() {
       display = Display.getDisplay(this);
       f = new Form (null);
       tck = new Ticker(“Informasi RMS”);
       f.addCommand(exitCmd);
       f.addCommand(hapusCmd);
       f.setCommandListener(this);
       f.setTicker(tck);
       String allDbs[] = RecordStore.listRecordStores();
       dt = new ChoiceGroup(“Daftar Database”, Choice.EXCLUSIVE);
       for (int i=0; i<allDbs.length; i++) {
           dt.append(allDbs[i], null);
      }
      f.append(dt);
      display.setCurrent(f);
  }
  public void hapusDb() {
       try {
           String dbName = dt.getString(dt.getSelectedIndex());
           dt.delete(dt.getSelectedIndex());
           RecordStore.deleteRecordStore(dbName);
           tck.setString(“Database “ + dbName + “telah dihapus”);
           display.setCurrent(f);
       }
  }
  public void keluar() {
       this.destroyApp(true);
  }
  public void CommandAction (Command c, Displayable d) {


                                                                                 111
Andino Maseleno
Bab 5 – Pemrograman Database




        String lbl = c.getLabel();
        if (lbl.equals(“Keluar”)) {
            keluar();
        } else if (lbl.equals(“Hapus”)) {
            hapusDb();
        }
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
        notifyDestroyed();
    }
}




                                                                            112
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




Bab 6

Aplikasi J2ME dengan PHP

          PHP (Hypertext Preprosessor) adalah bahasa server-side scripting yang menyatu dengan
tag-tag HTML dan dieksekusi di server untuk membuat halaman Web dinamis. Maksud dari server-
side scripting adalah sintaks dan perintah-perintah yang berikan akan sepenuhnya dijalankan di
server tetapi disertakan pada dokumen HTML biasa. Pembuatan Web ini merupakan kombinasi
antara PHP sendiri sebagai bahasa pemrograman dan HTML sebagai pembangun halaman Web.
Ketika pengunjung membuka halaman Web, server akan memproses perintah PHP dan lalu
mengirim hasilnya ke browser pengunjung.
          PHP merupakan software yang Open Source dan mampu lintas platform. PHP mampu
berjalan di Windows NT dan beberapa versi UNIX, dan dapat dibangun sebagai modul pada Web
Server Apache. PHP menawarkan koneksitas yang baik dengan beberapa database antara lain
Oracle, Mysql, dBase, Unix dbm dan tak terkecuali semua database berantarmuka ODBC.
          PHP juga mendukung komunikasi dengan layanan lain melalui protokol HTTP. Apabila
PHP berada dalam halaman Web, maka tidak lagi dibutuhkan pengembangan lingkungan khusus
atau direktori khusus. Hampir seluruh aplikasi berbasis Web dapat dibuat dengan PHP. Namun
kekuatan utama adalah konektivitas database dengan Web. Dengan kemampuan ini akan
mempunyai suatu sistem database yang dapat diakses dari Web. Ada tiga cara penulisan script PHP,
yaitu:
1. <?
          Script PHP
     ?>
2.   <?php
          Script PHP
     ?>
3.   <script language = “php”>
          Script PHP
     </script>



Web Server
          Web server bertugas untuk melayani permintaan browser terhadap halaman web atau
dokumen lainya. Biasanya dijalankan sebagai suatu Daemon atau Service yang siap melayani setiap


                                                                                          113
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




permintaan bila dibutuhkan. Pada umumnya Web server yang ada memiliki dukungan terhadap
PHP, sehingga memungkinkan dihasilkan halaman web yang bersifat dinamis. Beberapa Web
server yang sering digunakan antara lain PWS 4.0+(isapi), PWS 4.0+(cgi), Apache, Xitami, IIS 4.0.


MySQL
        MySQL adalah multi user data base yang menggunakan bahasa Structured Query
Language (SQL). MySQL dalam operasi client-server melibatkan server daemon MySQL disisi
server dan berbagai macam program serta library yang berjalan disisi client. MySQL mampu
menangani data yang cukup besar. Perusahaan pengembang MySQL yaitu TcX, mengaku mampu
menyimpan data lebih dari 40 data base, 10.000 tabel dan sekitar 7 juta baris, totalnya kurang lebih
100 Gigabytes data.
        SQL adalah bahasa standar yang digunakan untuk mengakses server data base. Bahasa ini
pada awalnya dikembangkan IBM, namun telah diadopsi dan digunakan sebagai standar industri.
Dengan menggunakan SQL, proses akses data base menjadi lebih user-friendly dibandingkan
dengan menggunakan dBASE atau Clipper yang masih menggunakan perintah-perintah
pemrograman.
        Dalam konteks bahasa SQL, pada umumnya informasi tersimpan dalam tabel-tabel yang
secara logik merupakan stuktur dua dimensi yang terdiri atas baris-baris data yang berada dalam
satu atau lebih kolom. Baris pada tabel sering disebut sebagai instance dari data, sedangkan kolom
sering disebut sebagai attributes atau field. Keseluruhan tabel itu dihimpun dalam satu kesatuan
yang disebut data base.


        Berikut contoh programnya:
1. Simple HTTP Fetch

J2ME Source Code:
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class SimpleFetch extends MIDlet {
    private Display display;


    String url = "http://127.0.0.1/midlet/helloworld.txt";



                                                                                              114
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




    public SimpleFetch() {
        display = Display.getDisplay(this);
    }


    public void startApp() {
try {
                  getViaStreamConnection(url);
} catch (IOException e) {
                  //Handle Exceptions any other way you like.
                  System.out.println("IOException " + e);
                  e.printStackTrace();
}
    }
    public void pauseApp() {         }
    public void destroyApp(boolean unconditional) {         }
    /**
     * Read URL as Stream
     */
    void getViaStreamConnection(String url) throws IOException {
          StreamConnection streamConnection = null;
          InputStream inputStream = null;
          StringBuffer b = new StringBuffer();
          TextBox textBox = null;
          try {
              streamConnection = (StreamConnection)Connector.open(url);
              inputStream = streamConnection.openInputStream();
              int ch;
              while((ch = inputStream.read()) != -1) {
                   b.append((char) ch);
              }
              textBox = new TextBox("Simple URL Fetch", b.toString(), 1024, 0);
          } finally {
               if(inputStream != null) {
                    inputStream.close();
               }
               if(streamConnection != null) {
                    streamConnection.close();
               }
          }
          display.setCurrent(textBox);


                                                                                          115
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




        }
}


2. Simple HTTP Get

J2ME Source Code:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;
import org.ksoap.*;
import org.ksoap.transport.*;
import org.ksoap.SoapObject;
public class SimpleWebService extends javax.microedition.midlet.MIDlet {
    private Display display;
    private String url = http://127.0.0.1/midlet/webservice/service.php;
    TextBox textbox = null;


    public SimpleWebService() {
        display = Display.getDisplay(this);
    }
    public void startApp() {
        try {
            testWebService();
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
    public void pauseApp() {
    }
    public void destroyApp(boolean unconditional) {
    }


    public void testWebService() throws Exception {
        StringBuffer stringBuffer = new StringBuffer();


        TextBox textBox = null;


        // First WebService - echos name that is passed in, in this case 'Andino'
        SoapObject client = new SoapObject(url,"hello");



                                                                                     116
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




        client.addProperty("name","Andino");
        HttpTransport ht = new HttpTransport(url,"hello");
        stringBuffer.append(ht.call(client));
        // 2nd WebService - Supply 2 numbers and the result is the sum of the
        //                   two numbers
        client = new   SoapObject(url,"add");
        client.addProperty("x","7");
        client.addProperty("y","6");
        ht = new HttpTransport(url,"add");
        stringBuffer.append("nAdd Result: " + ht.call(client));


        // display results in textbox
        textBox = new TextBox("Simple WebService Test", stringBuffer.toString(),
1024, 0);
        display.setCurrent(textBox);
    }
}


PHP Source Code:
<?php
$response = "Hello";
if (isset($_GET)) {
    switch ($_GET["type"]) {
        case 1: $response = "Good Morning"; break;
        case 2: $response = "Good Afternoon"; break;
        case 3: $response = "Good Evening"; break;
        default: $response = "Hello"; break;
    }
}
echo $response;
?>


3. Simple Web Service

J2ME Source Code:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;
import org.ksoap.*;



                                                                                       117
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




import org.ksoap.transport.*;
import org.ksoap.SoapObject;
public class SimpleWebService extends javax.microedition.midlet.MIDlet {
  private Display display;
  private String url = "http://127.0.0.1/midlet/webservice/service.php";
  TextBox textbox = null;


  public SimpleWebService() {
      display = Display.getDisplay(this);
  }
  public void startApp() {
      try {
          testWebService();
      } catch (Exception ex) {
          System.out.println(ex);
      }
  }
  public void pauseApp() {
  }
  public void destroyApp(boolean unconditional) {
  }


  public void testWebService() throws Exception {
      StringBuffer stringBuffer = new StringBuffer();


      TextBox textBox = null;


      // First WebService - echos name that is passed in, in this case 'Andino'
      SoapObject client = new SoapObject(url,"hello");
      client.addProperty("name","Andino");
      HttpTransport ht = new HttpTransport(url,"hello");
      stringBuffer.append(ht.call(client));
      // 2nd WebService - Supply 2 numbers and the result is the sum of the
      //                      two numbers
      client = new   SoapObject(url,"add");
      client.addProperty("x","7");
      client.addProperty("y","6");
      ht = new HttpTransport(url,"add");
      stringBuffer.append("nAdd Result: " + ht.call(client));




                                                                                     118
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




        // display results in textbox
        textBox = new TextBox("Simple WebService Test", stringBuffer.toString(),
1024, 0);
        display.setCurrent(textBox);
    }
}


PHP Source Code:
<?php
// include NuSOAP library
require_once('nusoap.php');
// Create Web Service Server
$server = new soap_server;
// Register Services
$server->register('hello');
$server->register('add');
// Define Services
function hello ($name){
    return "Hello $name";
}
function add ($x,$y){
    return $x + $y;
}
$server->service($HTTP_RAW_POST_DATA);
?>


4. Simple Image Fetch

J2ME Source Code:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class SimpleImageFetch extends MIDlet
{
    private Display display;
    private String URL = "http://127.0.0.1/midlet/image/test.php";
    private Form formImage;
    public SimpleImageFetch()
    {



                                                                                     119
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




        try {
            display = Display.getDisplay(this);
            Image im = getImage(URL);
            formImage = new Form("Simple Image Test");
            formImage.append(im);
            display.setCurrent(formImage);
        } catch (Exception ex) {
            System.out.println(ex);
        }
}
    public void startApp() { }
    public void pauseApp() { }
    public void destroyApp(boolean unconditional) {      }
    private Image getImage(String url) throws IOException
    {
        ContentConnection connection = (ContentConnection) Connector.open(url);
        DataInputStream iStrm = connection.openDataInputStream();
        Image im = null;
        try {
            byte imageData[];
            ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
            int ch;
            while ((ch = iStrm.read()) != -1)
              bStrm.write(ch);
            imageData = bStrm.toByteArray();
            bStrm.close();
            im = Image.createImage(imageData, 0, imageData.length);
        } finally {
            if (iStrm != null)
              iStrm.close();
            if (connection != null)
              connection.close();
        }
        return (im == null ? null : im);
    }
}


PHP Source Code:
<?php
$filename = "./phpjava.png";


                                                                                       120
Andino Maseleno
Bab 6 – Aplikasi J2ME dengan PHP




$handle = fopen ($filename, "rb");
$contents = fread ($handle, filesize ($filename));
fclose ($handle);
header("Content-type: image/gif");
header("Content-length: ".(string)(filesize($filename)));
echo $contents
?>




                                                                                 121
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




Bab 7

Aplikasi XML dengan J2ME

XML
           XML kependekan dari eXtensible Markup Language, dikembangkan mulai tahun 1996 dan
mendapatkan pengakuan dari W3C pada bulan Februari 1998. Teknologi yang digunakan pada
XML sebenarnya bukan teknologi baru, tapi merupakan turunan dari SGML yang telah
dikembangkan pada awal 80-an dan telah banyak digunakan pada dokumentasi teknis proyek-
proyek berskala besar. Ketika HTML dikembangkan pada tahun 1990, para penggagas XML
mengadopsi bagian paling penting pada SGML dan dengan berpedoman pada pengembangan
HTML menghasilkan markup language yang tidak kalah hebatnya dengan SGML.
Seperti halnya HTML, XML juga menggunakan elemen yang ditandai dengan tag pembuka
(diawali dengan „<‟ dan diakhiri dengan „>‟), tag penutup(diawali dengan „</ „diakhiri „>‟) dan
atribut elemen(parameter yang dinyatakan dalam tag pembuka misal <form name=”isidata”>).
Hanya bedanya, HTML medefinisikan dari awal tag dan atribut yang dipakai didalamnya,
sedangkan pada XML kita bisa menggunakan tag dan atribut sesuai kehendak kita.


XSLT
           XSLT adalah kependekan dari eXtensible StyleSheet Language:Transformation, adalah
bagian dari XSL yang dikembangkan sebelumnya. XSL adalah Stylesheet yang khusus
dikembangkan sebagai komplemen XML, untuk merubah informasi pada XML ke dalam bentuk
lain agar bisa ditampilkan di layar, dicetak di kertas atau didengarkan telinga. Pada dasarnya proses
ini dibagi menjadi dua bagian proses yakni pertama Transformasi Struktural yang meliputi
pengumpulan, pengelompokan dan pengurutan data maupun penyusunan ulang, penambahan dan
penghapusan tag dan atribut, dan yang kedua adalah proses merubah format menjadi pixel dilayar,
nohtah tinta di kertas atau nada di speaker. Proses yang pertama itulah yang kemudian disebut
XSLT, sedangkan yang kedua biasa disebut XSLFO (eXtensible Stylesheet Language:Formatting
Object).
           Hasil Keluaran XSLT bisa berupa HTML, Text file atau XML dengan format yang baru.
Sebenarnya untuk menampilkan dokumen XML agar lebih menarik dilihat di browser bisa
dilakukan oleh Cascade StyleSheet. CSS yang sering digunakan untuk memformat HTML bisa juga



                                                                                               122
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




dipakai untuk XML. Akan tetapi CSS tidak mampu melakukan tugas tugas yang rumit seperti
memformat angka desimal, menjumlah, menghitung rata-rata, menampilkan gambar, dan lain-lain.
Dan untuk melakukan tugas-tugas itulah kita memerlukan XSLT
XSLT Processor
XSLT Processor atau yang biasa disebut Parser adalah software bantu yang tugasnya menerapkan
perintah-perintah dalam XSLT pada dokumen sumber XML, dan menghasilkan dokumen keluaran
baik berupa HTML, Text file ataupun XML.


Bagian-Bagian dari Dokumen XML
Sebuah dokumen XML terdiri dari bagian bagian yang disebut dengan node. Node-node itu adalah:
   Root node yaitu node yang melingkupi keseluruhan dokumen. Dalam satu dokumen XML
    hanya ada satu root node. Node-node yang lainnya berada di dalam root node.
   Element node yaitu bagian dari dokumen XML yang ditandai dengan tag pembuka dan tag
    penutup, atau bisa juga sebuah tag tunggal elemen kosong seperti <anggota nama=”budi”/> .
    Root node biasa juga disebut root element
   Attribute note termasuk nama dan nilai atribut ditulis pada tag awal sebuah elemen atau pada
    tag tunggal.
   Text node, adalah text yang merupakan isi dari sebuah elemen, ditulis diantara tag pembuka
    dan tag penutup.
   Comment node adalah baris yang tidak dieksekusi oleh parser
   Processing Instruction node, adalah perintah pengolahan dalam dokumen XML. Node ini
    ditandai awali dengan karakter <? Dan diakhiri dengan ?>. Tapi perlu diingat bahwa header
    standard XML <?xml version=”1.0” encoding=”iso-8859-1”?> bukanlah processing instruction
    node. Header standard bukanlah bagian dari hirarki pohon dokumen XML.
   NameSpace Node, node ini mewakili deklarasi namespace


Document Type Definition (DTD)
        Sesuai namanya DTD berfungsi untuk mendefinisikan tipe documen XML. Pada saat
mempelajari salah satu bahasa pemrograman atau scripting, diperkenalkan deklarasi variable,
deklarasi fungsi dan deklarasi tipe data. Serupa dengan itu, DTD mendefinisikan struktur dokumen
XML dengan daftar element yang digunakan.
        DTD memungkinkan format yang unik untuk setiap file xml. DTD akan sangat berguna

                                                                                            123
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




untuk membuat aplikasi dalam Visual Basic, ASP atau bahasa pemrograman lain yang mendukung
XML, yaitu untuk memastikan bahwa data yang diterima aplikasi itu adalah data yang valid. Atau
bermanfaat juga digunakan bila satu organisasi menyepakati penggunaan satu DTD untuk tukar
menukar data dan informasi.
        Unsur-unsur yang dideklarasikan dalam DTD adalah semua unsur yang membentuk suatu
dokumen XML yaitu
   Element, satu blok data yang diawali tag pembuka dan tag penutup.
   Attribute, informasi pendukung element yang disertakan pada tag pembuka
   Entity, karakter pengganti untuk sekumpulan informasi yang didefinisikan


XML dan J2ME
        Penggunaan TinyXML untuk melakukan parsing dokumen XML adalah sebagai berikut:
1. Buatlah objek XMLParser semacam ini:
    XMLParser xp = new XMLParser();
2. Ada dua operasi yang dapat dilakukan oleh TinyXML, yakni memparse dokumen XML atau
    DTD (Document Type Definition) dari sebuah XML. Untuk parsing XML dipanggil fungsi :
        public void parseXML (XMLResponder obj) throws ParseException;
    Untuk parsing DTD dipanggil fungsi:
        public void parseDTD(XMLResponder obj) throws ParseException;
3. Buatlah kelas yang mengimplementasikan XMLResponder untuk proses parsing XML.
    XMLResponder merupakan Java Interface. Kelas yang mengimplementasikan interface
    XMLResponder harus mengimplementasikan fungsi-fungsi berikut:
       public java.io.InputStream
        getDocumentStream() throws ParseException
               Fungsi ini akan dipanggil pertama kali ketika dilakukan parsing dokumen
        XML/DTD. Fungsi ini menentukan stream data yang akan di-parsing.
       public InputStream resolveDTDEntity(String name, String pubID, String sysID) throws
        ParseException
               Fungsi ini akan dipanggil untuk memproses eksternal DTD. Umumnya fungsi ini
        diimplementasikan dengan memanggil fungsi resolveExternalEntity di bawah ini.
       public InputStream resolveExternalEntity(String name, String pubID, String sysID) throws
        ParseException


                                                                                           124
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




                Fungsi ini akan dipanggil untuk memproses eksternal DTD
      public void recordDocStart()
                Fungsi ini akan dipanggil setelah getDocumentStream() di atas untuk menunjukkan
       bahwa stream data dokumen XML yang akan diparsing berhasil dibuka.
      public void recordDocEnd()
                Fungsi ini akan dipanggil setelah selesai melakukan parsing dokumen XML dan
       menunjukkan bahwa stream data berhasil ditutup kembali.
      public void recordDoctypeDeclaration(String name, String pubID, String sysID) throws
       ParseException
                Fungsi ini akan dipanggil ketika parser selesai membaca informasi dari DTD yang
       ada. Parameter dari fungsi ini adalah:
       name : Nama dari dokumen type definition (DTD)
       pubID : Public ID dari DTD yang mungkin null
       sysID : System ID dari DTD yang mungkin null jika external DTD tidak terdefinisi.
      public    void    recordElementDeclaration(String     name,        String   content)    throws
       ParseException{}
                Fungsi ini akan dipanggil ketika parser membaca deklarasi elemen dalam DTD.
       Parameter dalam fungsi ini:
       name : Nama dari tag elemen
       content : Definisi untuk menentukan elemen dan data apa saja yang bisa ada dalam tag
       elemen ini. Definisi ini biasanya berupa regular expression.
      public void recordNotationDeclaration(String name, String pubID, string sysID) throws
       ParseException
                Fungsi ini akan dipanggil ketika parser membaca notationdi dalam DTD. Parameter
       yang ada di sini adalah :
       name : Nama dari notation
       pubID : Public ID dari notation yang mungkin null
       sysID : System ID dari notation yang mungkin null jika tidak terdefinisi. Nilainya
       umumnya berupa nama file.
      public void recordEntityDeclaration(String name, String value, String pubID, String sysID,
       String notation) throws ParseException
                Fungsi ini akan dipanggil ketika parser membaca deklarasi general dari entiti.

                                                                                                125
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




       Parameter yang ada disini adalah :
       name : Nama dari entiti
       value : Nilai dari entiti
       pubID : public ID dari value entiti
       sysID : System ID dari value entiti
       notation : Spesifikasi notasi yang berasosiasi dengan entiti ini, dan dapat bernilai null
      public void recordAttlistDeclaration(String element, String attr, boolean notation, String
       type, String defmod, String def) throws ParseException
                Fungsi ini akan dipanggil ketika parser membaca definisi atribut pada atribut list di
       dalam DTD. Aplikasi dapat menyimpan definisi-definisi atribut ini untuk kemudian
       disimpan sebagai nilai default dari suatu elemen. Parameter yang ada di sini adalah:
       element : Element dimana atribut akan digunakan
       attr : Nama atribut yang didefinisikan dari DTD
       notation : Jika Anda merupakan notation atribut
       type : Tipe dari nilai atribut
       defmod : Deskripsi nature dari nilai default atribut, dimana ada kemungkinan nilainya
       “FIXED”, “REQUIRED”, “IMPLIED”, atau “DEFAULT”.
       def : Nilai default atribut, bisa bernilai null
      public void recordElementStart(String name, Hashtable attr) throws ParseException
                Fungsi ini akan dipanggil ketika parser membaca suatu tag pembuka elemen dalam
       dokumen XML. Anda bisa memperoleh informasi nama tag elemen XML dan atributnya
       dengan memanfaatkan parameter yang ada dari fungsi ini, yakni :
       name : Nama tag elemen dalam XML
       attr : Daftar atribut tag elemen XML
      public void recordElementEnd(String name) throws ParseException
                Fungsi ini akan dipanggil ketika parser membaca suatu tag penutup elemen dalam
       dokumen XML. Anda bisa memperoleh informasi nama tag elemen XML, yakni:
       name : Nama tag penutup elemen dalam XML
      public void recordPI(String name, String pValue) throws ParseException
                Fungsi ini akan dipanggil ketika parser membaca suatu processing instruction (PI)
       dalam dokumen XML. Parameter dalam fungsi ini adalah:
       name : Nama PI


                                                                                                   126
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




       pValue : Nilai PI
      public void recordCharData(String charData)
               Fungsi ini akan dipanggil untuk membaca data dari elemen XML. Data yang dibaca
       akan disimpan pada parameter charData dari fungsi ini.
      public void recordComment(String comment)
               Fungsi ini akan dipanggil untuk membaca komentar dari elemen XML. Komentar
       yang dibaca akan disimpan pada parameter comment dari fungsi ini.


Berikut adalah contoh aplikasi parser XML sederhana:
import java.io.*;
import java.util.*;
import gd.xml.*;


class objXMLResponder implements XMLResponder {
   private String filename = null;
   private String prefix = “ “;
   private String curElement = “ “;
   objXMLResponder(String f) {
       filename = f;
   }
   public java.io.InputStream getDocumentStream() throws ParseException {
       try { return new FileInputStream(filename);
       } catch (FileNotFoundException e) {
           throw new ParseException(“File not Found”);
       }
   }
   public InputStream resolveDTDEntity {String name, String pubID, String sysID)
throws ParseException {
       return resolveExternalEntity(name, pubID, sysID);
   }
   public   InputStream    resolveExternalEntity(String         name,   String   pubID,   String
sysID) throws ParseException {
       if (sysID != null) {
           File f = new File((new File(filename)).getParent(), sysID);
              try {
                 return new FileInputStream(f);
              } catch (FileNotFoundException e) {



                                                                                           127
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




                 throw new ParseException(“file not found (“+f+”)”);
             }
       } else    {return null;}
  }
  public void recordDocStart() {
      System.out.println(“Parsing activity started”);
  }
  public void recordDocEnd() {
      System.out.println(“Parsing activity finished”);
  }
  public     void    recordElementStart(String   name,   Hashtable      attr)    throws
ParseException {
      curElement = name;
      System.out.println(prefix+”Element : “ + name);
      if (attr != null) {
          Enumeration e = attr.keys();
      System.out.print(prefix);
      String conj = “ “;
      while (e.hasMoreElements()) {
          Object k = e.nextElement();
          System.out.print(conj+k+” = “+attr.get(k));
          Conj = “,”;
      }
      System.out.println(“ ”);
      }
       prefix = prefix+” “;
  }
  public void recordElementEnd(String name) throws ParseException {
      prefix = prefix.substring(2);
  }
  public void recordPI(String name, String pValue) {
      System.out.println(prefix +”*”name+”PI: “+pValue);
  }
  public void recordCharData(String charData) {
      System.out.println(prefix+ “Data elemen” + curElement+ “-> “ +charData);
  }
  public void recordComment(String comment) {
      System.out.println(prefix+”* Komentar : “ + comment);
  }
  public void recordDoctypeDeclaration(String name, String pubID, String sysID)


                                                                                   128
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




throws ParseException {
      System.out.print(prefix+”!DOCTYPE: “+name);
      if (pubID != null) System.out.print(“ pubID = “+pubID);
      if (sysID != null) System.out.print(“ sysID = “+sysID);
      System.out.println(“ “);
      prefix = “ “;
  }
  public       void   recordElementDeclaration(String    name,   String    content)    throws
ParseException {}
  public void recordNotationDeclaration(String name, String pubID, String sysID)
throws         ParseException {}
  public void recordEntityDeclaration(String name, String value, String pubID,
String sysID, String notation) throws ParseException{
      System.out.print(prefix+”!ENTITY: “+name);
      if (value != null)
      System.out.print(“value = ” ”+value+”” “);
      if (pubID != null)
      System.out.print(“pubID = “ +pubID);
      if (sysID != null)
      System.out.print(“sysID = “ +sysID);
      if (notation != null)
      System.out.print(“notation = “+notation);
      System.out.println(“”);
  }
  public      void    recordAttlistDeclaration(String   element,    String    attr,   boolean
notation, String type,         String defmod, String def) {}
  }
class parsingXML {
  public static void main(String args[]) {
      if (args.length != 1) :
             System.err.println(“Penggunaan : “);
             System.err.println(“Java parsingXM1 <fileXML> “);
               System.exit(-1);
         }
         try {
              XMLParser p = new XMLParser();
              objXMLResponder q = new objXMLResponder (args[0]);
              p.parseXML(q);
         } catch (parseException e){}
  }


                                                                                         129
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




}



MIDP client untuk akses informasi e-mail user dari website yang dikembalikan dalam format XML
import javax.microedition.io.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import java.io.*;
import java.util.*;
import gd.xml.*;


public class readXML extends MIDlet implements CommandListener {
    private Display display;
    private Command openCmd = new Command(“Info”, Command.OK, 1);
    private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2);
    private Command backCmd = new Command(“Kembali”, Command.EXIT, 2);
    private Form f1, f2;
    private TextField t1, t2;
    private String URL = new String(http://127.0.0.1/infouser.xml);
    public readXML(){}
    public void startApp() {
        display = Display.getDisplay(this);
        f1 = new Form(“Informasi E-mail”);
        t1 = new TextField(“Nama User”, “Andino Maseleno”, 1024, TextField.ANY);
        f1.append(t1);
        f1.addCommand(openCmd);
        f1.addCommand(exitCmd);
        f1.setCommandListener(this);
        display.setCurrent(f1);
    }
    public void inform() {
        HttpConnection c = null;
        InputStream is = null;
        f2 = new Form(“User Information”);
        t2 = new TextField(“”, null, 1024, TextField.ANY);
        byte[] data = new byte[1024];
        try {
           c = (HttpConnection)Connector.open(URL);
           is = c.openInputStream();
           XMLParser p = new XMLParser();



                                                                                         130
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




          objXMLResponder oXML = new objXMLResponder(is);
          if (c.getResponseCode() == HttpConnection.HTTP_OK) {
             p.parseXML(oXML);
          } else {
            f2.setTitle(“Respon Web Server”);
            t2.setString(“Not     OK     HTTP”    +   c.getResponseCode()     +    “    “     +
c.getResponseMessage());
            f2.append(t2);
      } catch (IOException e) {
            t2.setString(“Error I/O : “ + e.toString());
            e.printStackTrace();
      } catch (ParseException e) {
            t2.setString(“Error Parse XML : “ + e.toString());
            e.printStackTrace();
      } finally {
          try {
             if (is != null) { is.close();}
             if (c != null) {c.close();}
          } catch (IOException e) {
          f2.addCommand(backCmd);
          f2.setCommandListener(this);
          display.setCurrent(f2);
      }
  }
//Kelas   dibawah    merupakan   kelas   yang    mengimplementasikan   proses-proses     saat
melakukan //parsing XML
class objXMLResponder implements XMLResponder {
  private String curElement = “ “;
  private int Depth = 0;
  private java.io.InputStream s;
  private boolean processNow = false;
  private boolean foundUser = false;
  private StringBuffer detailsUser = new StringBuffer();
  //Konstruktor
  objXMLResponder(InputStream f){
      s = f;
  }
  public InputStream getDocumentStream() throws ParseException {
      return s;
  }


                                                                                        131
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




  public InputStream resolveDTDEntity(String name, String pubID, String sysID)
throws ParseException {
       return resolveExternalEntity(name, pubID, sysID);
  }
  public       InputStream      resolveExternalEntity(String       name,    String    pubID,   String
sysID) throws ParseException {
       return null;
  }
  public void recordDocStart(){}
  public void recordDocEnd() {
       if (!foundUser) {
           t2.setString(“User “ + t1.getString() + “ tidak ditemukan”);
       } else {
           t2.setString(“User        “   +   t1.getString()    +   “   ditemukan. Details      :   “     +
detailUser.toString());
       }
       System.gc();
      }
      public       void      recordElementStart(String        name,     Hashtable     attr)    throws
ParseException {
           Depth++;
           if (attr != null) {
                Enumeration e = attr.keys);
                while (e.hasMoreElements()) {
                   String k = e.nextElement().toString();
                   if (k.trim().equals(“id”) && Depth == 2) {
                        if                                         (t1.getString().trim().equals
(attr.get(k).toString().trim())) {
                             processNow = true;
                             foundUser = true;
                       } else {
                             processNow = false;
                       }
                   }
               }
           }
           curElement = name;
           System.gc();
  }
  public void RecordElementEnd(String name) throws ParseException {


                                                                                                   132
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




      Depth++;
  }
  public void recordPI(String name, String pValue) {}
  public void recordCharData(String charData) {
      if (processNow) {
          if (curElement.trim().equals(“firstname”)) {
               detailsUser.append(“ (*) First Name = “ + charData);
          } else if (curElement.trim().equals(“lastname”)) {
              detailsUser.append(“ (*) Last Name = “ +charData);
          } else if (curElement.trim().equals(“age”)) {
              detailsUser.append(“ (*) Age = “ +charData+ “ tahun”);
          } else if (curElement.trim().equals(“country”)) {
              detailsUser.append(“ (*) Negara = “ +charData);
          } else if (curElement.trim().equals(“email”)) {
              detailsUser.append(“ (*) Email = “ +charData);
          }
      }
  }
  public void recordComment(String comment) {}
  public void recordDoctypeDeclration(String name, String pubID, String sysID)
throws ParseException{}
  public void recordNotationDeclaration(String name, String pubID, String sysID)
throws                                                                  ParseException{}
  public void recordEntityDeclaration(String name, String value, String pubID,
String sysID, String notation) throws ParseException{}
  public      void   recordAttlistDeclaration(String   element,   String   attr,   boolean
notation, String type, String defmod, String def){}
}//end of class
  public void quit() {destroyApp(true);}
  public void back() {display.setCurrent(f1);}
  public void commandAction(Command c, Displayable d) {
      if (c == exitCmd) {
          quit();
      } else if (c == openCmd) {
          Inform();
      } else if (c == backCmd) {
      }
  }
  public void pauseApp() {}
  public void destroyApp(boolean unconditional) {notifyDestroyed(){


                                                                                      133
Andino Maseleno
Bab 7 – Aplikasi XML dengan J2ME




    }
}




                                            134
Andino Maseleno

More Related Content

PDF
Jeni Intro1 Bab02 Pengenalan Bahasa Java
PDF
PDF
Makalah java
PDF
Makalah java
PPTX
Java ppt
PPTX
Ppt java
PDF
[Www.indowebster.com] jeni-intro1-bab02-pengenalan bahasa-java
PPTX
Ppt java
Jeni Intro1 Bab02 Pengenalan Bahasa Java
Makalah java
Makalah java
Java ppt
Ppt java
[Www.indowebster.com] jeni-intro1-bab02-pengenalan bahasa-java
Ppt java

What's hot (14)

PPTX
Ppt java rullyamrizal-1102412020
DOCX
Makalah java
PPTX
Os java
DOCX
Tugas java praktektohir
PPTX
Java
PPTX
Java ppt
PPT
Mata Kuliah Pemrograman Java - LP3I Medan
PPT
Pengenalan java
DOCX
DOCX
Makalah java
PPTX
Pemrograman iii chapter i
PPT
PDF
Modul 1 pbo
Ppt java rullyamrizal-1102412020
Makalah java
Os java
Tugas java praktektohir
Java
Java ppt
Mata Kuliah Pemrograman Java - LP3I Medan
Pengenalan java
Makalah java
Pemrograman iii chapter i
Modul 1 pbo
Ad

Similar to Andino Maseleno - Modul J2ME (20)

PDF
Pengantar Pemrograman Java
PPTX
PDF
Modul2 - Pengenalan Bahasa Java
PDF
Jeni intro1-bab02-pengenalan bahasa java
PDF
Network Programming 2 - Dasar Pemrograman Java
PDF
Makalah java
PDF
Makalah java
DOCX
Makalah java
PPTX
Java
DOCX
Makalah java final
PPTX
PPT JAVA
PPTX
Pertemuan 2 Pengenalan JAVA dengan Netbeans.pptx
PPTX
Bahasa pemrograman java by aldo arrohim .pptx
PPTX
Pertemuan 1 &2 Pengenalan Pemrograman JAVA.pptx
PDF
Java netbeans
PDF
JENI-Intro1-Bab02-Pengenalan Bahasa Java.pdf
DOCX
Tugas latihan java tohir 1
PPTX
Java
PPT
Pert 2 PBO
DOCX
Laporan i
Pengantar Pemrograman Java
Modul2 - Pengenalan Bahasa Java
Jeni intro1-bab02-pengenalan bahasa java
Network Programming 2 - Dasar Pemrograman Java
Makalah java
Makalah java
Makalah java
Java
Makalah java final
PPT JAVA
Pertemuan 2 Pengenalan JAVA dengan Netbeans.pptx
Bahasa pemrograman java by aldo arrohim .pptx
Pertemuan 1 &2 Pengenalan Pemrograman JAVA.pptx
Java netbeans
JENI-Intro1-Bab02-Pengenalan Bahasa Java.pdf
Tugas latihan java tohir 1
Java
Pert 2 PBO
Laporan i
Ad

More from Andino Maseleno (20)

PDF
Strengthening Interaction from Direct to Virtual Basis: Insights from Ethica...
PDF
Proposed smart traffic signal control in brunei darussalam
PPTX
Bedah Buku Manajemen itu Mudah - STMIK Pringsewu Kota Agung
PDF
Daftar website penyedia informasi beasiswa dan lowongan kerja sebagai peneliti
PDF
Meraih Beasiswa dengan Sedekah
PPTX
Viva Presentation - Fuzzy Logic and Dempster-Shafer Theory to Detect The Risk...
PDF
Daftar Jurnal (Kuliah ilmu komputer dengan Andino Maseleno - 3 April 2015)
PPTX
Andino maseleno - Bedah Buku Manajemen itu Mudah
PPTX
Sistem Informasi Lingkungan
PPTX
Sistem Operasi: Arsitektur komputer, Pengantar Sistem Operasi dan Kernel
PPTX
Introduction to information system
PPTX
Contribution of ocean sectors to the green economy
PPTX
Uses of the oceans
PPTX
Atmospheric pressure and Atmospheric Temperature
PDF
Analisis Penerapan Teknologi Informasi Dalam Otonomi Daerah
PDF
Avian Influenza (H5N1) Expert System using Dempster-Shafer Theory
PDF
Skin Infection Detection using Dempster-Shafer Theory
PDF
Poultry Diseases Detection using Dempster-Shafer Theory
PDF
Poultry Diseases Expert System using Dempster-Shafer Theory
PDF
Avian Influenza (H5N1) Warning System using Dempster-Shafer Theory and Web Ma...
Strengthening Interaction from Direct to Virtual Basis: Insights from Ethica...
Proposed smart traffic signal control in brunei darussalam
Bedah Buku Manajemen itu Mudah - STMIK Pringsewu Kota Agung
Daftar website penyedia informasi beasiswa dan lowongan kerja sebagai peneliti
Meraih Beasiswa dengan Sedekah
Viva Presentation - Fuzzy Logic and Dempster-Shafer Theory to Detect The Risk...
Daftar Jurnal (Kuliah ilmu komputer dengan Andino Maseleno - 3 April 2015)
Andino maseleno - Bedah Buku Manajemen itu Mudah
Sistem Informasi Lingkungan
Sistem Operasi: Arsitektur komputer, Pengantar Sistem Operasi dan Kernel
Introduction to information system
Contribution of ocean sectors to the green economy
Uses of the oceans
Atmospheric pressure and Atmospheric Temperature
Analisis Penerapan Teknologi Informasi Dalam Otonomi Daerah
Avian Influenza (H5N1) Expert System using Dempster-Shafer Theory
Skin Infection Detection using Dempster-Shafer Theory
Poultry Diseases Detection using Dempster-Shafer Theory
Poultry Diseases Expert System using Dempster-Shafer Theory
Avian Influenza (H5N1) Warning System using Dempster-Shafer Theory and Web Ma...

Recently uploaded (9)

PDF
Modul_Pemula_Merakit_Komputer untuk smppdf
PPT
pengantar-sistem-informasi manajemen.ppt
PPTX
Materi asdsa asd asd sad sa dsa dsa d sa
PPTX
Materi_Array_Karakter_String untuk kelas XI sma.pptx
DOCX
Keutuhan Aplikasi Konsep dan Praktik dalam Upaya menciptakan aplikasi Anti Vi...
PDF
Rekomendasi Riset Lanjutan : perspektif_futurologis.pdf
PPTX
Peranan AI dalam Dunia Pendidikan dan Industri Aplikasinya
PPTX
Implementasi Microservices pada Manufaktur
DOCX
Antivirus Versi.FULL.JALiN.KB.PRO Keutuhan Aplikasi Konsep dan Praktik dalam ...
Modul_Pemula_Merakit_Komputer untuk smppdf
pengantar-sistem-informasi manajemen.ppt
Materi asdsa asd asd sad sa dsa dsa d sa
Materi_Array_Karakter_String untuk kelas XI sma.pptx
Keutuhan Aplikasi Konsep dan Praktik dalam Upaya menciptakan aplikasi Anti Vi...
Rekomendasi Riset Lanjutan : perspektif_futurologis.pdf
Peranan AI dalam Dunia Pendidikan dan Industri Aplikasinya
Implementasi Microservices pada Manufaktur
Antivirus Versi.FULL.JALiN.KB.PRO Keutuhan Aplikasi Konsep dan Praktik dalam ...

Andino Maseleno - Modul J2ME

  • 1. JAVA 2 MICRO EDITION Andino Maseleno Diterbitkan pertama kali tahun 2003
  • 2. Bab 1 – Pemrograman Java Bab 1 Pemrograman Java Bahasa Java awalnya bernama Oak, yakni bagian dari projek Green yang dikembangkan oleh Sun Microsystem untuk memprogram perangkat-perangkat elektronik rumah tangga semacam televisi. Namun pada perkembangannya, bahasa Oak ini menjadi bahasa yang bisa digunakan untuk pemrograman secara umum dan dikenal menjadi bahasa Java saat ini. Java sebagai bahasa pemrograman dikenal sebagai bahasa pemrograman tingkat tinggi dengan kriteria sebagai berikut: 1. Sederhana(Simple) Java dirancang untuk mudah dipelajari, terutama bagi programmer-programmer yang telah mengenal C/C++ akan mudah sekali untuk berpindah ke Java. 2. Berorientasi Objek(Object Oriented) Rancangan berorientasi objek merupakan suatu teknik yang memusatkan rancangan pada data(objek) dan interface. Java merupakan bahasa pemrograman berorientasi objek. 3. Terdistribusi(Distributed) Java memiliki library rutin yang luas untuk dirangkai pada protokol TCP/IP dengan mudah. 4. Kuat(Robust) Java dirancang sebagai bahasa pemrograman yang handal. Java dimaksudkan untuk membuat suatu program yang benar-benar dapat dipercaya dalam berbagi hal. Java banyak menekankan pada pengecekan awal untuk kemungkinan terjadinya masalah, pengecekan pada saat run time dan mengurangi kemungkinan timbulnya kesalahan(error). 5. Aman(Secure) Java dirancang sebagai bahasa pemrograman yang aman. Java membuat suatu sistem yang mekanisme keamanannya benar-benar sulit dikecoh. 6. Netral Arsitektur(Arsitecture Neutral) Java Compiler yang digunakan untuk mengkompilasi kode program Java dirancang untuk menghasilkan kode yang netral terhadap semua arsitektur perangkat keras. 7. Portable Dengan semboyan write once run everywhere, Java dirancang untuk dapat dijalankan di semua platform. 1 Andino Maseleno
  • 3. Bab 1 – Pemrograman Java 8. Interpreter Interpreter Java dapat mengeksekusi kode byte Java secara langsung pada komputer-komputer yang memiliki interpreter. 9. Kinerja Tinggi(High Performance) Java dirancang untuk menghasilkan aplikasi dengan performansi yang terbaik. 10. Multithreaded Multithreading adalah kemampuan sebuah program untuk melakukan lebih dari satu pekerjaan sekaligus. 11. Dinamis Java adalah bahasa pemrograman yang dinamis. Java dirancang untuk beradaptasi dengan lingkungan yang terus berkembang. Alasan Java digunakan untuk aplikasi wireless Ada beberapa alasan mengapa harus Java dipilih untuk aplikasi komunikasi bergerak: 1. Java merupakan bahasa pemrograman yang aman. Hal ini disebabkan karena kode Java harus selalu dieksekusi dengan Java Virtual Machine(JVM), yang menyediakan lingkungan yang aman untuk eksekusi kode yang telah di-download. Sebuah aplikasi biner dapat mengacaukan sebuah peralatan(misalnya tampilan bue screen pada handphone) namun aplikasi Java, dalam hal yang paling buruk, hanya dapat mengacaukan Virtual Machine-nya saja. 2. Bahasa pemrograman Java adalah bahasa yang kokoh. Penggunaan Garbage Collector akan mengurangi waktu yang diperlukan oleh programer untuk menemukan kebocoran dalam penggunaan memori. Demikian pula penggunaan mekanisme exception pada Java mampu meningkatkan kemampuan programmer dalam membuat aplikasi yang kokoh. 3. Portabilitas Java sangat berguna dalam aplikasi-aplikasi wireless. Pertama, dengan menulis sebuah program saja, aplikasi tersebut dapat dijalankan di berbagai peralatan. Alasan kedua karena aplikasi-aplikasi tersebut dapat dikirimkan kesebuah peralatan melalui jaringan wireless(proses ini sering dinamakan Over-the-air, atau OTA provisioning). Java Virtual Machine (JVM) Kode program Java dapat ditulis menggunakan editor teks seperti Notepad, Textpad maupun JCreator dan lain sebagainya. Java compiler yang digunakan untuk mengkompilasi kode 2 Andino Maseleno
  • 4. Bab 1 – Pemrograman Java program Java dirancang untuk menghasilkan kode yang netral terhadap semua arsitektur perangkat keras(hardware) yang disebut sebagai Java bytecode(*.class). Java Virtual Machine (JVM) menjadi bagian dari teknologi Java yang menyediakan media untuk menjalankan aplikasi Java(Java bytecode). Java bytecode dapat dianggap sebagai kode-kode mesin dari JVM. Selanjutnya JVM akan menginterpretasikan kode-kode tersebut menjadi kode native atau kode mesin dari arsitektur yang bersangkutan. Java dirancang untuk dapat dijalankan di semua platform baik itu Linux, Windows, Netware maupun Macintosh serta dapat dijalankan pada arsitektur perangkat keras yang berbeda, seperti Intel, AMD, Sun Sparc, PowerPC dan lain sebagainya. Jadi, aplikasi Java tidak perlu dikompilasi ulang jika telah dikompilasi di suatu platform dan akan dijalankan di platform yang berbeda dengan platform saat dikompilasi, karena aplikasi Java dijalankan di atas JVM. *.java Java Compiler *.class Java Interpreter Native Code Executed Computer Gambar 1.1 Proses Kompilasi Kode Java Java Application Programming Interface (Java API) Ada berbagai fitur yang ditawarkan oleh Java API untuk mengembangkan aplikasi Java, antara lain sebagai berikut : 1. Applet Java Applet merupakan program Java yang berjalan di atas browser. Penggunaan applet ini akan membuat halaman HTML lebih dinamis dan menarik. 2. Java Networking 3 Andino Maseleno
  • 5. Bab 1 – Pemrograman Java Java Networking merupakan sekumpulan API yang menyediakan fungsi-fungsi untuk aplikasi jaringan. Java Networking menyediakan akses untuk TCP, UDP, IP Address dan URL. Java Networking tidak menyediakan akses untuk ICMP, karena alasan sekuritas dan pada kondisi umum hanya administrator yang dapat memanfaatkan protokol ICMP. 3. Java Database Connectivity(JDBC) JDBC menyediakan sekumpulan API untuk mengatur keamanan mengakses database seperti Oracle, MySQL, PostgreSQL, Microsoft SQL Server. 4. Java Server Pages(JSP) JSP adalah suatu teknologi web berbasis bahasa pemrograman Java dan berjalan pada platform Java. JSP merupakan pengembangan dari Servlet serta merupakan bagian dari teknologi Java 2 Platform, Enterprise Edition(J2EE). 5. Java Card Java Card digunakan untuk aplikasi-aplikasi pada smart card, sebagai contoh yaitu SIM Card pada handphone. Teknologi Java 1. Java 2 Platform, Standard Edition (J2SETM) Platform digunakan untuk menjalankan dan mengembangkan aplikasi Java pada level Personal Computer (PC). Platform ini berisi class-class inti pada Java dan Graphical User Interface (GUI). 2. Java 2 Platform, Micro Edition (J2METM) Platform ini digunakan untuk menjalankan dan mengembangkan aplikasi-aplikasi Java pada handheld devices atau perangkat-perangkat semacam handphone, Personal Digital Assistance(PDA) dan PocketPC. 3. Java 2 Platform, Enterprise Edition (J2EETM) Platform ini berupa paket yang berisi class-class dan interface-interface yang digunakan untuk menjalankan dan mengembangkan aplikasi Java berbasis web, seperti class-class Servlet, Java Server Pages(JSP) dan Enterprise Java Beans(EJB) serta Java CORBA. 4 Andino Maseleno
  • 6. Bab 1 – Pemrograman Java Lingkungan kerja teknologi Java dapat digambarkan seperti gambar 1.2 dibawah ini: Gambar 1.2 Platform Java 2 Variabel pada Java Variabel merupakan container yang digunakan untuk menyimpan suatu nilai pada sebuah program dengan tipe tertentu. Pada dasarnya ada dua macam tipe variabel data dalam bahasa Java, yakni tipe primitif dan tipe reference. Tabel di bawah ini menunjukkan tipe primitif pada Java. Tabel 2.1 Tipe primitif pada Java Keyword Description Size/Format (integers) byte Byte-length integer 8-bit two's complement short Short integer 16-bit two's complement int Integer 32-bit two's complement long Long integer 64-bit two's complement (real numbers) float Single-precision floating point 32-bit IEEE 754 double Double-precision floating point 64-bit IEEE 754 (other types) 5 Andino Maseleno
  • 7. Bab 1 – Pemrograman Java char A single character 16-bit Unicode character boolean A boolean value (true or false) true or false Contoh program //MaxVariablesDemo.java public class MaxVariablesDemo { public static void main(String args[]) { // integer byte largestByte = Byte.MAX_VALUE; short largestShort = Short.MAX_VALUE; int largestInteger = Integer.MAX_VALUE; long largestLong = Long.MAX_VALUE; // real float largestFloat = Float.MAX_VALUE; double largestDouble = Double.MAX_VALUE; char aChar = 'S'; boolean aBoolean = true; System.out.println("Nilai terbesar byte :" + largestByte); System.out.println("Nilai terbesar short :“ + largestShort); System.out.println("Nilai terbesar integer : " + largestInteger); System.out.println("Nilai terbesar long : " + largestLong); System.out.println("Nilai terbesar float : " + largestFloat); System.out.println("Nilai terbesar double : " + largestDouble); if (Character.isUpperCase(aChar)) { System.out.println("The character " + aChar + " is upper case."); } else { System.out.println("The character " + aChar + " is lower case."); } System.out.println("Nilai boolean : " + aBoolean); } } Sedangkan tipe data variabel berupa reference terdiri atas tipe variabel data:  tipe class  tipe array  tipe interface Operator pada Java Operator pada Java dibedakan menjadi beberapa jenis, yaitu:  Operator Aritmetika 6 Andino Maseleno
  • 8. Bab 1 – Pemrograman Java  Operator Relasional  Operator Kondisional  Operator Shift dan Lojik  Operator Assignment  Operator lainnya Operator Aritmetika Tabel 2.2 Operator aritmatika Operator Penggunaan Deskripsi + op1 + op2 Menambahkan op1 dengan op2 - op1 - op2 Megurangkan op1 dengan op2 * op1 * op2 Mengalikan op1 dengan op2 / op1 / op2 Membagi op1 dengan op2 % op1 % op2 Menghasilkan sisa hasil bagi antara op1 dengan op2 Contoh program 7 Andino Maseleno
  • 9. Bab 1 – Pemrograman Java //ArithmeticDemo.java public class ArithmeticDemo { public static void main(String[] args) { int i = 37; int j = 42; double x = 27.475; double y = 7.22; System.out.println("Nilai variabel..."); System.out.println(" i = " + i); System.out.println(" j = " + j); System.out.println(" x = " + x); System.out.println(" y = " + y); System.out.println("Penambahan..."); System.out.println(" i + j = " + (i + j)); System.out.println(" x + y = " + (x + y)); System.out.println("Pengurangan..."); System.out.println(" i - j = " + (i - j)); System.out.println(" x - y = " + (x - y)); System.out.println("Perkalian..."); System.out.println(" i * j = " + (i * j)); System.out.println(" x * y = " + (x * y)); System.out.println("Pembagian..."); System.out.println(" i / j = " + (i / j)); System.out.println(" x / y = " + (x / y)); System.out.println("Sisa hasil bagi..."); System.out.println(" i % j = " + (i % j)); System.out.println(" x % y = " + (x % y)); //mixing types System.out.println("Mixing types..."); System.out.println(" j + y = " + (j + y)); System.out.println(" i * x = " + (i * x)); } } 8 Andino Maseleno
  • 10. Bab 1 – Pemrograman Java //SortDemo.java public class SortDemo { public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 }; for (int i = arrayOfInts.length; --i >= 0; ) { for (int j = 0; j < i; j++) { if (arrayOfInts[j] > arrayOfInts[j+1]) { int temp = arrayOfInts[j]; arrayOfInts[j] = arrayOfInts[j+1]; arrayOfInts[j+1] = temp; } } } for (int i = 0; i < arrayOfInts.length; i++) { System.out.print(arrayOfInts[i] + " "); } System.out.println(); } } Operator Increment/Decrement Tabel 2.3 Operator increment/decrement Operator Penggunaam Deskripsi ++ op++ op dinaikkan nilainya 1 setelah dilakukan operasi pada op ++ ++op op dinaikkan nilainya 1 sebelum dilakukan operasi pada op -- op-- op diturunkan nilainya 1 sebelum dilakukan operasi pada op -- --op op diturunkan nilainya 1 setelah dilakukan operasi pada op Operator Relasional Operator relasional pada Java dapat digunakan untuk membandingkan antara dua variabel data, lebih lengkapnya dapat dilihat dalam tabel berikut ini: Tabel 2.4 Operator relasional Operator Penggunaan Deskripsi op1 > Menghasilkan true jika op1 lebih besar dari > op2 op2 9 Andino Maseleno
  • 11. Bab 1 – Pemrograman Java op1 >= Menghasilkan true jika op1 lebih besar atau >= op2 sama dengan dari op2 op1 < Menghasilkan true jika op1 lebih kecil dari < op2 op2 op1 <= Menghasilkan true jika op1 lebih kecil atau <= op2 sama dengan dari op2 op1 == == Menghasilkan true jika op1 sama dengan op2 op2 op1 != Menghasilkan true jika op1 tidak sama dengan != op2 op2 Contoh program 10 Andino Maseleno
  • 12. Bab 1 – Pemrograman Java /RelationalDemo.java public class RelationalDemo { public static void main(String[] args) { int i = 37; int j = 42; int k = 42; System.out.println("Nilai variabel..."); System.out.println(" i = " + i); System.out.println(" j = " + j); System.out.println(" k = " + k); System.out.println("Lebih besar dari..."); System.out.println(" i > j = " + (i > j)); System.out.println(" j > i = " + (j > i)); System.out.println(" k > j = " + (k > j)); System.out.println("Lebih besar atau sama dengan..."); System.out.println(" i >= j = " + (i >= j)); //false System.out.println(" j >= i = " + (j >= i)); //true System.out.println(" k >= j = " + (k >= j)); //true System.out.println("Kurang dari..."); System.out.println(" i < j = " + (i < j)); //true System.out.println(" j < i = " + (j < i)); //false System.out.println(" k < j = " + (k < j)); //false System.out.println("Kurang dari atau sama dengan..."); System.out.println(" i <= j = " + (i <= j)); //true System.out.println(" j <= i = " + (j <= i)); //false System.out.println(" k <= j = " + (k <= j)); //true System.out.println("Sama dengan..."); System.out.println(" i == j = " + (i == j)); //false System.out.println(" k == j = " + (k == j)); //true System.out.println("Tidak sama dengan..."); System.out.println(" i != j = " + (i != j)); //true System.out.println(" k != j = " + (k != j)); //false } } Operator Kondisional Operator kondisional dalam Java ada enam macam sebagaimana digambarkan pada tabel di bawah: Tabel 2.5 Operator kondisional Operator Penggunaan Deskripsi op1 && Menghasilkan true jika op1 dan op2, keduanya && op2 bernilai boolean true 11 Andino Maseleno
  • 13. Bab 1 – Pemrograman Java op1 || Menghasilkan true jika op1 atau op2, salah satunya bernilai boolean || op2 true Menghasilkan true jika op bernilai boolean ! ! op false op1 & Bitwise AND, menghasilkan true jika op1 dan & op2 op2 bernilai true op1 | Bitwise OR, menghasilkan true jika op1 atau op2 salah satunya | op2 bernilai true op1 ^ Menghasilkan true jika salah satu diantara op1 atau op2 bernilai ^ op2 true, namun tidak keduanya Operator Shift dan Lojik Tabel 2.6 Operator shift dan lojik Operator Penggunaan Deskripsi >> op1 >> op2 Menggeser bit op1 ke kanan sejauh op2 << op1 << op2 Menggeser bit op1 ke kiri sejauh op2 >>> op1 >>> op2 Menggeser bit op1 ke kiri sejauh op2 Operator Bitwise Operator bitwise dalam Java juga digunakan untuk memanipulasi bit. Tabel 2.7 Operator Bitwise Operator Penggunaan Deskripsi & op1 & op2 Bitwise AND | op1 | op2 Bitwise OR ^ op1 ^ op2 Bitwise xor ~ ~op2 Bitwise complement 12 Andino Maseleno
  • 14. Bab 1 – Pemrograman Java Bitwise AND Bitwise AND akan menghasilkan bit “1” jika kedua operator bernilai bit “1”. Tabel 2.8 Bitwise AND op1 op2 op1 & op2 0 0 0 0 1 0 1 0 0 1 1 1 Bitwise OR Bitwise OR akan menghasilkan bit “1” jika salah satu operator bernilai bit “1”. Tabel 2.9 Bitwise OR op1 op2 op1 | op2 0 0 0 0 1 1 1 0 1 1 1 1 Bitwise XOR Bitwise XOR akan menghasilkan bit “1” jika kedua operator memiliki nilai bit yang berbeda Tabel 2.10 Bitwise XOR op1 op2 op1^op2 0 0 0 0 1 1 1 0 1 1 1 0 Contoh program 13 Andino Maseleno
  • 15. Bab 1 – Pemrograman Java //BitwiseDemo.java public class BitwiseDemo { static final int VISIBLE = 1; static final int DRAGGABLE = 2; static final int SELECTABLE = 4; static final int EDITABLE = 8; public static void main(String[] args) { int flags = 0; flags = flags | VISIBLE; flags = flags | DRAGGABLE; if ((flags & VISIBLE) == VISIBLE) { if ((flags & DRAGGABLE) == DRAGGABLE) { System.out.println("Flags are Visible and Draggable."); } } flags = flags | EDITABLE; if ((flags & EDITABLE) == EDITABLE) { System.out.println("Flags are now also Editable."); } } } Operator Assignment Operator assignment pada Java digunakan untuk memberikan sebuah nilai ke sebuah variabel. Operator assignment hanya berupa „=‟, Tabel 2.11 Operator Assignment Operator Penggunaan Ekivalen dengan += op1 += op2 op1 = op1 + op2 -= op1 -= op2 op1 = op1 - op2 *= op1 *= op2 op1 = op1 * op2 /= op1 /= op2 op1 = op1 / op2 %= op1 %= op2 op1 = op1 % op2 &= op1 &= op2 op1 = op1 & op2 |= op1 |= op2 op1 = op1 | op2 ^= op1 ^= op2 op1 = op1 ^ op2 <<= op1 <<= op2 op1 = op1 << op2 14 Andino Maseleno
  • 16. Bab 1 – Pemrograman Java >>= op1 >>= op2 op1 = op1 >> op2 >>>= op1 >>>= op2 op1 = op1 >>> op2 Operator Lainnya Tabel 2.12 Operator lainnya Operator Deskripsi ?: Shortcut if-else statement [] Used to declare arrays, create arrays, and access array elements . Used to form qualified names ( params ) Delimits a comma-separated list of parameters ( type ) Casts (converts) a value to the specified type new Creates a new object or a new array instanceof Determines whether its first operand is an instance of its second operand Contoh program //ConditionalOp.java public class ConditionalOp { public static void main(String args[]) { int nBuku = 1; // jumlah buku System.out.println("Saya mempunyai " + nBuku + " buku" + (nBuku == 1 ? "." : "s.")); nBuku++; // Increment jumlah buku System.out.println("Saya mempunyai " + nBuku + " buku" + (nBuku == 1 ? "." : "s.")); } } Controlflow pada Java Operasi Kondisional If-Else Statement if-else digunakan untuk mengeksekusi sebuah blok jika memenuhi sebuah kondisi tertentu. Sintaks penggunaannya adalah : 15 Andino Maseleno
  • 17. Bab 1 – Pemrograman Java if (kondisi){ statement } Contoh program //IfDemo1.java class ifDemo1{ public static void main(String args[]){ int idx = 2; if(idx>9){ System.out.println(“Idx lebih besar dari 10”); } } } Ada kalanya kita menginginkan dua pencabangan, yakni jika suatu kondisi terpenuhi, lakukan aksi A, jika tidak, lakukan aksi B. Dua percabangan ini dimungkinkan dengan menggunakan if-else() sebagai berikut : if (kondisi){ statement1 }else{ statement2 } Pada pernyataan di atas, jika kondisi bernilai true, statement 1 akan dijalankan. Sebaliknya, jika kondisi bernilai false, statement 2 yang akan dijalankan. Contoh program //IfDemo2.java class ifDemo2{ public static void main(String args[]){ int idx=0; if(idx>9) System.out.println(“Idx lebih besar dari 9”); }else{ System.out.println(“Idx tidak lebih besar dari 10”); } } } 16 Andino Maseleno
  • 18. Bab 1 – Pemrograman Java //NumberCheck1.java public class NumberCheck1 { public static void main(String[] args) { int number = 0; number = 1+(int)(100*Math.random()); if(number%2 == 0) System.out.println("Anda memperoleh bilangan genap, " + number); else System.out.println("Anda memperoleh bilangan ganjil, " + number); } } //NumberCheck2.java public class NumberCheck2 { public static void main(String[] args) { int number = 0; number = 1+(int)(100*Math.random()); if(number%2 == 0) { if(number < 50) System.out.println("Anda memperoleh bilangan genap < 50, " + number); } else System.out.println("Anda memperleh bilangan ganjil, " + number); // It is odd } } 17 Andino Maseleno
  • 19. Bab 1 – Pemrograman Java //LetterCheck1.java public class LetterCheck1 { public static void main(String args[]) { char symbol = 'A'; symbol = (char)(128.0*Math.random()); if(symbol >= 'A') { if(symbol <= 'Z') System.out.println("Anda memiliki huruf besar " + symbol); else if(symbol >= 'a') if(symbol <= 'z') System.out.println("Anda memiliki huruf kecil " + symbol); else System.out.println( "Kode lebih besar dari a, tetapi ini bukan huruf"); else System.out.println( "Kode lebih kecil dari a dan bukan huruf"); } else System.out.println("Kode lebih kecil dari A dan bukan huruf!!"); } } //LetterCheck2.java public class LetterCheck2 { public static void main(String args[]) { char symbol = 'A'; symbol = (char)(128.0*Math.random()); if(symbol >= 'A' && symbol <= 'Z') System.out.println("Anda memiliki huruf besar " + symbol); else if(symbol >= 'a' && symbol <= 'z') System.out.println("Anda memiliki huruf kecil " + symbol); else System.out.println("Kode ini bukan huruf!!"); } } 18 Andino Maseleno
  • 20. Bab 1 – Pemrograman Java //LetterCheck3.java public class LetterCheck3 { public static void main(String args[]) { char symbol = 'A'; symbol = (char)(128.0*Math.random()); if(Character.isUpperCase(symbol)) System.out.println("Anda memiliki huruf besar " + symbol); else if(Character.isLowerCase(symbol)) System.out.println("Anda memiliki huruf kecil " + symbol); else System.out.println("Kode ini bukan huruf!!"); } } Switch-Case Statement switch-case digunakan untuk mengeksekusi sebuah blok jiak memenuhi sebuah kondisi tertentu. Contoh program //SwitchDemo.java public class SwitchDemo { public static void main(String[] args) { int month = 8; switch (month) { case 1: System.out.println("Januari"); break; case 2: System.out.println("Februari"); break; case 3: System.out.println("Maret"); break; case 4: System.out.println("April"); break; case 5: System.out.println("Mei"); break; case 6: System.out.println("Juni"); break; case 7: System.out.println("Juli"); break; case 8: System.out.println("Agustus"); break; case 9: System.out.println("September"); break; case 10: System.out.println("Oktober"); break; case 11: System.out.println("November"); break; case 12: System.out.println("Desember"); break; } } } 19 Andino Maseleno
  • 21. Bab 1 – Pemrograman Java //SwitchDemo2.java public class SwitchDemo2 { public static void main(String[] args) { int month = 2; int year = 2000; int numDays = 0; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: numDays = 31; break; case 4: case 6: case 9: case 11: numDays = 30; break; case 2: if ( ((year % 4 == 0) && !(year % 100 == 0)) || (year % 400 == 0) ) numDays = 29; else numDays = 28; break; } System.out.println("Jumlah hari = " + numDays); } } Operasi Pengulangan While Statement while digunakan untuk mengeksekusi sebuah blok secara berulang selama memenuhi kondisi tertentu. Sintaks penggunaannya adalah sebagai berikut: while (ekspresi) { statement } Pada pernyataan di atas, selama ekspresi menghasilkan nilai true, statement yang ada akan dieksekusi secara terus menerus. 20 Andino Maseleno
  • 22. Bab 1 – Pemrograman Java Contoh program //WhileDemo.java class WhileDemo{ public static void main(String args[]){ String str1 = “Welcome”; int idx = 0; while(idx<str1.length()){ System.out.println(“Karakter ke : “ +idx+”=”+str1.charAt(idx)); idx++; } } } //WhileLoop.java public class WhileLoop { public static void main(String[] args) { int limit = 20; int sum = 0; int i = 1; while(i <= limit) sum += i++; System.out.println("sum = " + sum); } } Do-While Sama halnya dengan while, statement do-while digunakan untuk mengeksekusi sebuah blok secara berulang sampai tidak memenuhi kondisi tertentu. Pada penggunaan while, ekspresi diperiksa pada saat awal, jadi ada kemungkinan blok statement dalam while tidak pernah dieksekusi. Pada penggunaan do-whilw, ekspresi tidak diperiksa pada saat awal eksekusi, jadi minimal blok statement do-while akan dieksekusi sekali. Sintaks penggunaannya sebagai berikut: do{ statement }while (ekspresi) { Contoh program 21 Andino Maseleno
  • 23. Bab 1 – Pemrograman Java //DoWhileLoop.java public class DoWhileLoop { public static void main(String[] args) { int limit = 20; int sum = 0; int i = 1; do { sum += i; i++; } while(i <= limit); System.out.println("sum = " + sum); } } For Statement for digunakan untuk mengeksekusi sebuah blok secara berulang dalam sebuah range tertentu. Sintaks penggunaannya adalah sebagai berikut: for (inisialisasi;terminasi;increment) { statement } Increment dalam for merupakan ekspresi yang dieksekusi pada awal eksekusi for. Terminasi digunakan untuk menentukan kapan pengulangan akan dihentikan. Increment merupakan ekspresi yang akan dieksekusi setiap selesai melakukan satu looping (pengulangan). Perlu diperhatikan bahwa ketiga bagian di dalam for() bersifat opsional, jadi boleh tidak ada. Namun, jika ketiga bagian di atas kosong, akan menyebabkan terjadinya pengulangan tanpa henti (loop forever). Contoh program //ForLoop1.java class ForLoop1{ public static void main(String args[]){ for (int idx=0;idx<10;idx++){ System.out.println(idx +” ”); } System.out.println(“”); } } 22 Andino Maseleno
  • 24. Bab 1 – Pemrograman Java //ForLoop2.java public class ForLoop2 { public static void main(String[] args) { int limit = 20; int sum = 0; for(int i = 1; i <= limit; i++) sum += i; System.out.println("sum = " +sum); } } //ForLoop3.java class ForLoop3{ public static void main(String args[]){ int idx=0; for(;idx<10;){ System.out.println(idx +” “); idx++; } System.out.println(“”); } } //ForLoop4.java public class ForLoop4 { public static void main(String[] args) { int limit = 20; int sum = 0; for(double radius = 1.0; radius <= 2.0; radius += 0.2) { System.out.println("radius = " + radius + " area = " + Math.PI*radius*radius); } } } 23 Andino Maseleno
  • 25. Bab 1 – Pemrograman Java //Factorial1.java public class Factorial1 { public static void main(String[] args) { long limit = 20; long factorial = 1; for(int i = 1; i <= limit; i++) { factorial = 1; int j =2; while(j <= i) factorial *= j++; System.out.println(i + "!" + " adalah " + factorial); } } } //Factorial2.java public class Factorial2 { public static void main(String[] args) { long limit = 20; long factorial = 1; OuterLoop: for(int i = 1; i <= limit; i++) { factorial = 1; for(int j = 2; j <= i; j++) { if(i > 10 && i % 2 == 1) continue OuterLoop; factorial *= j; } System.out.println(i + "!" + " adalah " + factorial); } } } 24 Andino Maseleno
  • 26. Bab 1 – Pemrograman Java //BilanganPrima.java public class BilanganPrima { public static void main(String[] args) { int nValues = 50; boolean isPrime = true; for(int i = 2; i <= nValues; i++) { isPrime=true; for(int j = 2; j < i; j++) { if(i % j == 0) { isPrime = false; break; } } if(isPrime) System.out.println(i); } } } 25 Andino Maseleno
  • 27. Bab 2 – Java 2 Micro Edition Bab 2 Java 2 Micro Edition Java 2 Micro Edition (J2ME) merupakan bagian dari teknologi Java 2, seperti yang terlihat pada Gambar 2.1, yang digunakan untuk menjalankan dan mengembangkan aplikasi-aplikasi Java pada handheld devices atau perangkat-perangkat semacam ponsel, Palm, PDA, dan PocketPC. Gambar 2.1 Java 2 Flatform Java 2 micro edition berguna untuk membangun sebuah aplikasi pada peralatan dengan jumlah memori dan kapasitas penyimpanan yang terbatas, serta kemampuan user interface yang terbatas seperti perangkat komunikasi bergerak yaitu handphone dan PDA, yang memiliki karakteristik berbeda dengan sebuah personal komputer. Java 2 micro edition terdiri atas komponen-komponen sebagai berikut: 1. Java Virtual Machine (JVM) JVM yang ada pada paket J2ME dirancang agar bisa dijalankan pada berbagai perangkat handheld yang kompatibel dengan java dan komponen ini untuk menjalankan program-program java pada emulator. 2. Java API (Application Programming Interface) Komponen ini kumpulan dari librari untuk menjalankan dan mengembangkan program java pada handheld devices, misalnya kelas-kelas java untuk manipulasi layer ponsel, mendeteksi 26 Andino Maseleno
  • 28. Bab 2 – Java 2 Micro Edition masukan tombol ponsel dan menyimpan file 3. Tools lain untuk pengembangan aplikasi java, semacam emulator Motorolla. Java 2 micro edition memiliki dua jenis aplikasi yaitu: 1. Walled garden application, yaitu aplikasi yang berdiri sendiri atau stand-alone pada handphone tanpa perlu mengakses sumber data eksternal melalui jaringan pembawa atau carrier network. contoh aplikasi ini adalah kalkulator, organizer. 2. Network aware application. Aplikasi ini memiliki kemampuan untuk mengakses sumber data eksternal. contoh aplikasi e-mail yang berada didalam handphone. Java 2 Micro Edition dibagi menjadi dua buah bagian yang dikenal dengan istilah configuration dan profiles, seperti yang terlihat pada Gambar 2.2. Configuration adalah spesifikasi yang menjelaskan tentang sebuah virtual machine dan Application Programming Interface dasar yang dapat digunakan dalam class-class tertentu. Profile menyediakan implementasi-implementasi tambahan yang spesifik dari sebuah handheld devices. Sebuah profile dibangun dalam sebuah configuration, namun menambahkan beberapa Application Programming Interface khusus agar dihasilkan sebuah lingkungan yang lengkap untuk membangun aplikasi. Gambar 2.2 Configuration dan Profile pada J2ME Application Java 2 Micro Edition Configuration Java 2 micro edition configuration mendefinisikan lingkungan kerja J2ME runtime. karena setiap handheld devices memiliki fitur berbeda, J2ME configuration dirancang untuk menyediakan librari standar yang mengimplementasikan fitur standar dari sebuah handheld devices. lingkungan 27 Andino Maseleno
  • 29. Bab 2 – Java 2 Micro Edition kerja J2ME configuration yang dimaksud meliputi java virtual machine (JVM) digunakan untuk menjalankan program java, dan java virtual machine pada J2ME yang berbeda dengan J2ME pada java development kit (JDK) karena hanya fitur-fitur penting berkaitan dengan perangkat wireless yang diimplementasikan. Ada dua kategori J2ME configuration saat ini yaitu: 1. CLDC (Connected Limited Device Configuration). Kategori ini umumnya digunakan untuk aplikasi java pada handphone seperti Nokia, Samsung, Motorola, dan PDA (Personal Digital Assistants) Umumnya peralatan wireless untuk perangkat tersebut memiliki kapasitas memori yang kecil berukuran 160-512 KiloBytes dan dengan koneksi jaringan yang tidak tetap 2. CDC (Connected Device Configuration) Kategori ini umumnya digunakan untuk aplikasi java pada perangkat-perangkat handheld devices dengan kapasitas memori yang lebih besar berukuran minimal 2 Mbytes dan dengan koneksi jaringan yang lebih kokoh contohnya internet television, nokia communicator, TV pada mobil dan lain-lain. Perbedaan antara CLDC dan CDC dapat dilihat pada tabel 2.1 Tabel 2.1 Perbedaan CLDC dan CDC CLDC CDC Mengimplementasikan subset dari J2SE Mengimplementasikan seluruh fitur pada J2SE Processor 32 Bit Processor 16 Bit JVM yang digunakan dikenal dengan nama JVM yang digunakan dikenal dengan nama connected virtual machine (CVM) Kilobyte virtual machine (KVM) Java 2 Micro Edition Profile J2ME profile menyediakan implementasi-implementasi tambahan yang sangat spesifik dari sebuah handheld devices. contohnya sebuah ponsel memiliki kemampuan standar dari sebuah ponsel yaitu untuk berkomunikasi, namun setiap ponsel memiliki fitur-fitur tersendiri misalnya Siemens bisa menyimpan mp3 dan nokia memiliki game dan lain sebagainya, kemampuan standar itulah yang diimplementasikan oleh J2ME configuration sedangkan kemampuan atau fitur lainnya diimplementasikan oleh J2ME profile. Jadi sebuah profile dibangun dalam sebuah configuration 28 Andino Maseleno
  • 30. Bab 2 – Java 2 Micro Edition namun menambahkan beberapa Application Programming Interface (API) khusus agar dihasilkan sebuah lingkungan yang lengkap untuk membangun aplikasi. Ada lima kategori J2ME profile saat ini yaitu Mobile Information Device Profile (MIDP), Foundation Profile (FP), Personal Profile, RMI Profile, Personal Digital Assistance Profile. Connected Limited Device Configuration (CLDC) CLDC digunakan untuk implementasikan program java pada perangkat-perangkat keras dengan ukuran memori yang sangat terbatas, akibatnya fitur-fitur yang kurang penting untuk diimplementasikan dalam handheld devices yang bersangkutan dari java 2 harus dibuang. Fitur-fitur yang dibuang tersebut antara lain: 1. Tidak ada dukungan untuk floating point Kelas-kelas untuk perhitungan floating point, yakni java.lang.Float dan java.lang.Double dibuang dari CLDC. 2. Tidak ada dukungan untuk finalisasi objek Garbage collector digunakan untuk “bersih-bersih memori” membuang fungsi finalize pada kelas java.lang.Object, sekalipun fungsi ini penting pada Java 2. 3. Tidak ada dukungan untuk JNI (Java Native Interface) Kelas JNI yang memungkinkan Java mengakses library yang dibuat dengan bahasa selain Java seperti C, C++, dan Basic , tidak didukung oleh CLDC. 4. Penanganan kesalahan/exception yang terbatas CLDC hanya mendefisinikan tiga kelas untuk penanganan kesalahan / exception yaitu kelas java.lang.Error, Kelas java.lang.OutOfMemory, Kelas java.lang.virtual Machine Error. Kelas-kelas standar bawaan java 2 standard edition (J2SE) yang didukung oleh CLDC adalah sebagai berikut: 29 Andino Maseleno
  • 31. Bab 2 – Java 2 Micro Edition Tabel 2.2 Kelas-kelas pada J2SE yang ada pada CLDC. Nama Paket (Java Package) Nama Kelas (Java Class) Java.io DataInput DataOutput DataInputStream InputStream DataOutputStream OutputStream InputStreamReader OutputStreamWriter Reader Writer EOFException IOException PrintStream InterruptedException UnsupportedEncodingException UTFDataFormatException ByteArrayInputStream ByteArrayOutputStream 30 Andino Maseleno
  • 32. Bab 2 – Java 2 Micro Edition Java.lang ArithmeticException StringBuffer SecurityException Exception InterruptedException Runnable RuntimeException Runtime NullpointerException Character InstantiationException Boolean ClassCastException Integer ClassNotFoundException System IllegalAccessException Object IllegalArgumentException Byte NumberFormatException Thread ArrayStoreException String OutOfMemoryError Throwable VirtualMachineError Error IllegalThreadStateException Long IndexOutOfBoundException Math IllegalMonitorStateException Class 31 Andino Maseleno NegativeArraySizeException
  • 33. Bab 2 – Java 2 Micro Edition Java.util Calendar Date Enumeration Hastable Random Stack Time Vector EmptyStackException NoSuchElementException Kelas-kelas tambahan yang tidak ada dalam java 2 standard edition (J2SE) adalah javax.microedition, yang menyediakan API (Application Programming Interface) untuk implementasi program pada handheld devices. KToolbar KToolbar merupakan lingkungan pengembangan yang disediakan oleh J2ME Wireless Toolkit untuk pengembangan MIDlet. Aplikasi yang kita buat terdiri atas direktori-direktori berikut: 1. src Berisi file-file kode Java. 2. bin Berisi file-file JAD, JAR, dan manifest. 3. lib Berisi file-file yang diperlukan dalam format JAR atau ZIP. 4. res Berisi file-file resource. Berikut adalah gambar Ktoolbar dari J2ME Wireless Toolkit: 32 Andino Maseleno
  • 34. Bab 2 – Java 2 Micro Edition Gambar 2.3 Ktoolbar, lingkungan pengembangan Java MIDP(MIDlet) Emulator Dalam membuat aplikasi MIDlet kita tidak perlu mencobanya langsung ke perangkat handheld device. Kita bisa mencobanya terlebih dahulu dengan menggunakan sebuah emulator. Disini kita menggunakan 2 jenis emulator, yaitu emulator DefaultGrayPhone dan emulator DefaultColorPhone. Perbedaan dari keduanya adalah terletak pada layarnya. Pada emulator DefaultGrayPhone hanya memiliki warna hitam dan putih layaknya handphone biasa yang tidak berwarna. Beda dengan emulator DefaultColorPhone yang memiliki layar berwarna. Gambar berikut menunjukkan emulator DefaultGrayPhone: 33 Andino Maseleno
  • 35. Bab 2 – Java 2 Micro Edition Gambar 2.4 Emulator DefaultGrayPhone Emulator DefaultColorPhone tampak seperti gambar 2.5 dibawah ini: 34 Andino Maseleno
  • 36. Bab 2 – Java 2 Micro Edition Gambar 2.5 Emulator DefaultColorPhone MIDLET Midlet merupakan aplikasi yang dibuat menggunakan java 2 micro edition dengan profile Mobile Information Device Profile (MIDP). Midlet berjalan dalam sebuah perangkat handheld tetapi midlet tidak berinteraksi langsung dengan hardware dari ponsel atau perangkat handheld yang lainnya melainkan berinteraksi melalui application management software (AMS). Terdapat 3 buah tool untuk membuat sebuah aplikasi MIDlet maupun J2ME lainnya. Tool-tool tersebut yaitu Java Development kit (JDK) versi 1.3 atau yang lebih tinggi, J2ME Wireless Toolkit atau J2MEWTK yang merupakan paket-paket tool yang mudah digunakan dalam membuat maupun menguji sebuah aplikasi Midlet, dan sebuah Text editor seperti Notepad, Ultraedit, JEdit dan sebagainya. Secara umum terdapat beberapa hal penting dalam membuat sebuah aplikasi MIDlet, 35 Andino Maseleno
  • 37. Bab 2 – Java 2 Micro Edition yaitu menyangkut lifecycle, Graphical user interface (GUI), dan Application Descriptor . LifeCycle Midlet Lifecycle dari sebuah midlet ditangani oleh Application Management Software (AMS). AMS ini adalah sebuah lingkungan tempat siklus dari sebuah midlet mampu diciptakan, dijalankan, dihentikan, maupun dihilangkan. AMS juga merupakan program bawaan yang ada dalam perangkat handheld tersebut yang berguna untuk mengatur manajemen aplikasi midlet yang ada. Ada tiga status dalam Lifecycle sebuah midlet, yang terdapat pada tabel berikut ini: Tabel 2.3 Status Lifecycle sebuah Midlet Nama Status Keterangan Pause Status ini terjadi ketika midlet selesai diinisialisasi dan tidak melakukan aksi apapun. Secara garis besar, status midlet adalah pause pada saat : 1. Setelah midlet dibuat dengan konstruktor new( ) . 2. Dari status Active, kemudian berhasil memanggil fungsi MIDdlet.pauseApp( ). 3. Dari status Active, kemudian berhasil memanggil fungsi MIDlet.notifyPaused( ). 4. Dari status Active, namun ketika akan start( ) terjadi kesalahan berupa exception : MIDletStateChangeException Active Status ini terjadi ketika midlet sedang aktif / berjalan dengan normal, yakni setelah memanggil fungsi MIDlet.startApp( ) Destroyed Status ini terjadi ketika midlet berhenti berjalan atau exit, sehingga seluruh sumber daya yang digunakan akan dibebaskan. Status ini terjadi ketika berhasil dilakukan pemanggilan fungsi MIDlet.destroyApp( ) atau MIDlet.notifyDetroyed( ). Jika digambarkan, perubahan status dalam daur hidup (lifecycle) dalam sebuah midlet dapat dilihat pada gambar 2.6 36 Andino Maseleno
  • 38. Bab 2 – Java 2 Micro Edition new( ) Paused destroyApp( ) pauseApp( ) Destroyed startApp( ) Active destroyApp( ) Gambar 2.6 LifeCycle dan perubahan status sebuah Midlet Eksekusi MIDlet Umumnya urutan eksekusi sebuah MIDlet adalah sebagai berikut: 1. AMS (Application Management Software) menginisilisasi sebuah objek MIDlet, sehingga midlet berada pada status paused. 2. Ketika AMS memutuskan bahwa midlet sudah waktunya dijalankan, maka AMS memanggil fungsi MIDlet.startApp( ) sehingga midlet akan mulai aktif berfungsi. 3. Ketika AMS memutuskan midlet harus dinonaktifkan sementara, maka AMS akan memanggil fungsi MIDlet.pauseApp( ) sehingga midlet akan berhenti bekerja. 4. Ketika AMS memutuskan bahwa midlet harus dinonaktifkan selamanya, maka AMS akan memanggil fungsi MIDlet.destroyApp( ) sehinggax alokasi memori yang digunakan oleh midlet yang bersangkutan akan dibersihkan. 37 Andino Maseleno
  • 39. Bab 2 – Java 2 Micro Edition Graphical User Interface (GUI) Perangkat handheld semacam handphone memiliki berbagai keterbatasan, keterbatasan- keterbatasan ini menyebabkan perlunya ada teknik pemrograman GUI yang berbeda dengan teknik pemrograman yang umumnya digunakan pada aplikasi-aplikasi yang dijalankan pada sebuah komputer. Connected Limited Device Connection (CLDC) tidak menyediakan fungsi-fungsi untuk GUI, namun fungsi-fungsi ini ditangani oleh Mobile Information Device Profile (MIDP). Semua fungsi-fungsi untuk antarmuka berbasis window (GUI) ditangani oleh paket javax.microedition.lcdui. Graphical user interface yang disediakan oleh MIDP terbagi atas dua level yaitu High Level dan Low Level. Pada level pemrograman yang rendah (low level) fungsionalitasnya lebih spesifik ke jenis handheld yang digunakan hal ini memungkinkan kurangnya portabilitas midlet yang dibuat, misalnya midlet pada handheld Motorola, midlet tersebut belum tentu bisa dijalankan dengan baik pada handheld lain. Mirip dengan game-game pada ponsel Nokia contohnya snake, yang jika dijalankan pada ponsel siemens tidak akan jalan dikarenakan keperluan game membutuhkan fungsi-fungsi untuk menggambar dan mengolah sesuatu yang levelnya sudah pixel- pixel gambar. Kelas-kelas untuk pemrograman GUI pada level yang rendah diimplementasikan oleh kelas javax.microedition.lcdui.canvas. Pada level pemrograman yang tinggi (high level) merupakan level pemrograman yang dianjurkan karena aplikasi midlet akan lebih portable dengan banyak perangkat handheld yang berbeda. Misalnya untuk mengembangkan sebuah form-form windows midlet pada handheld motorola maka jika dijalankan aplikasi midlet pada handheld lain hasilnya akan sama. Kelas-kelas untuk manajemen pemrograman yang tinggi akan diimplementasikan oleh kelas javax.microedition.lcdui.screen. Application Descriptor Aplikasi wireless dikemas dalam sebuah kemasan yang berekstensi *.JAR. Selain itu dikenal pula file *.JAD yang disebut sebagai application descriptor yang berguna untuk mendeskripsikan isi dari file JAR tadi. Kedua file ini haruslah di-upload ke ponsel pengguna agar aplikasi dapat dijalankan. 38 Andino Maseleno
  • 40. Bab 3 – Pemrograman GUI Bab 3 Pemrograman GUI Berbeda dengan sebuah komputer desktop, perangkat handheld semacam handphone, Palm, dan organizer memiliki berbagai keterbatasan, misalnya ukuran layar yang jauh lebih kecil dan masukan input yang tidak berupa mouse. Keterbatasan-keterbatasan ini menyebabkan perlunya ada teknik pemrograman GUI yang berbeda dengan teknik pemrograman yang umumnya digunakan pada aplikasi-aplikasi yang dijalankan pada sebuah komputer. CLDC (Connected Limited Device Connection) tidak menyediakan fungsi-fungsi untuk GUI, namun fungsi-fungsi ini akan ditangani oleh MIDP (Mobile Information Device Profile). Jenis Fungsi-fungsi API pada MIDP untuk GUI Fungsi-fungsi untuk pembuatan antarmuka berbasis Window (GUI) yang disediakan oleh MIDP terbagi atas dua level, yakni highlevel dan lowlevel. Semua fungsi-fungsi untuk antarmuka berbasis window ini dilakukan oleh paket javax.microedition.lcdui. Pada level pemrograman yang lebih tinggi (highlevel) yang merupakan level pemrograman yang dianjurkan, aplikasi MIDlet akan lebih portabel dengan banyak perangkat handheld yang berbeda. Jadi, misalnya mengembangkan sebuah form–form window MIDlet pada handheld Siemens SL45i, jika dijalankan aplikasi MIDlet tersebut pada handheld lain, hasilnya akan sama. Kelas-kelas untuk manajemen pemrograman yang lebih tinggi akan diturunkan dari javax.microedition.lcdui.Screen. Pada level pemrograman yang lebih rendah (lowlevel), akan didapatkan fungsionalitas yang lebih spesifik ke jenis handheld yang digunakan. Hal ini memungkinkan kurangnya portabilitas MIDlet yang dibuat, misalnya membuat MIDlet pada handheld Motorola i_85s, MIDlet tersebut belum tentu bisa dijalankan dengan baik pada handheld lain. Menyerupai dengan game-game pada handphone Nokia 5110, misalnya Snake, yang jika coba dijalankan pada handphone Ericson T10S tidak akan jalan. Kelas-kelas untuk pemrograman GUI pada level yang lebih rendah ini diimplementasikan oleh kelas javax.microedition.lcdui.Canvas dan javax.microedition.lcdui.Graphics. Model Pemrograman GUI pada MIDP Untuk menampilkan sesuatu pada layar, misalnya tulisan, form, dan sebagainya harus 39 Andino Maseleno
  • 41. Bab 3 – Pemrograman GUI mengakses display dari handheld yang dapat diakses dengan kelas javax.microedition.lcdui.Display. Objek kedua adalah screen, yang berbeda dengan display. Screen digunakan untuk menangani komponen-komponen GUI, misalnya window, form, dialogbox, dan menangani masukan dari pengguna misalnya dari keypad. Objek screen ini direpresentasikan dengan kelas javax.microedition.lcdui.Screen. Pada setiap waktu hanya satu objek screen yang bisa ditampilkan oleh objek Display, untuk menampilkan digunakan fungsi setCurrent() pada objek Display. Ada tiga tipe screen pada MIDlet, yakni:  Complex Screen Object Tipe ini mengatur komponen-komponen GUI yang sudah tidak bisa ditambahi oleh komponen screen yang lain. Misalnya, screen yang berisi objek ListBox untuk meminta masukan user, tidak akan bisa kemudian diisi dengan objek lain.  Generic Screen Object Tipe ini mengatur komponen-komponen GUI Form, yang bisa ditambahi oleh komponen screen yang lain. Misalnya, screen yang berisi objek Form.  Low Level Screen Object Digunakan oleh subkelas javax.microedition.lcdui.Graphics dan javax.microedition.lcdui.Screen HighLevel API untuk Pembuatan GUI Kelas-kelas yang menyediakan fungsionalitas untuk pembuatan GUI pada Java MIDP ada pada paket javax.microedition.lcdui. pada paket tersebut ada tiga interface dan 21 kelas. Display Kelas Display merupakan kelas yang menyediakan fungsi-fungsi untuk manajemen layar pada perangkat handheld, menampilkan objek screen, dan meyediakan informasi tentang properti dari perangkat handheld yang digunakan. Akses ke layar dapat diacu dengan statik getDisplay() pada kelas Display. public static Display getDisplay(MIDlet m) Penggunaan fungsi ini umumnya dilakukan di dalam fungsi startApp() dimana sebuah MIDlet akan menjadi aktif, seperti ini: public class yourMIDletName extends MIDlet{ Display display = null; //Konstruktor public yourMIDletName(){ 40 Andino Maseleno
  • 42. Bab 3 – Pemrograman GUI } public void startApp(){ display = Display.getDisplay(this); } public void pauseApp(){} public void destroyApp(Boolean unconditional){} } Fungsi-fungsi lain dalam kelas javax.microedition.lcdui.Display adalah sebagai berikut:  public Displayable getCurrent(); Menghasilkan objek screen – Displayable yang sedang ditampilkan ke layar.  public boolean isColor(); Menghasilkan nilai true jika perangkat handheld yang digunakan mendukung warna atau nilai false jika hanya mendukung grayscale.  public int numColors(); Menghasilkan jumlah warna yang didukung oleh perangkat handheld yang bersangkutan. Berikut contoh programnya: //Program HelloWorld.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class helloworld extends MIDlet { private Display display; private Alert alert = new Alert("MyAlert"); public helloworld() { display = Display.getDisplay(this); } public void startApp() { TextBox t = new TextBox("Screen Object", "HelloWorld", 256, 0); alert.setType(AlertType.WARNING); alert.setString("This is Alert"); display.setCurrent(alert, t); } public void pauseApp() {} public void destroyApp (boolean unconditional) {} } 41 Andino Maseleno
  • 43. Bab 3 – Pemrograman GUI Screen Objek screen menyediakan fungsionalitas untuk interaksi antara pengguna dengan perangkat handheld. Objek screen ini memiliki empat jenis objek turunan yang umum digunakan, yakni TextBox, Alert, List, dan Form. Kelas javax.microedition.lcdui.Screen merupakan kelas abstrak dengan dua karakteristik, yaitu objek screen bisa memiliki title dan ticker. Fungsi-fungsi dalam objek javax.microedition.lcdui.Screen yang digunakan untuk manajemen properti title dan ticker adalah:  public void setTitle(String s); Untuk menetapkan properti title dari objek screen  public String getTitle(); Menghasilkan string properti title dari objek screen  public void setTicker(Ticker x); Untuk menetapkan properti ticker dari objek screen  public Ticker getTicker(); Menghasilkan objek Ticker yang sedang aktif pada objek screen Ticker Ticker merupakan teks yang berjalan pada bagian atas layar aplikasi MIDlet. Sebuah ticker dapat ditempatkan pada objek-objek turunan kelas Screen yang telah disebutkan, yakni TextBox, List, Form, Alert. Berikut contoh program kelas javax.microedition.lcdui.Ticker: //Program tickerDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class tickerDemo extends MIDlet { private Display display; private Ticker t; public tickerDemo(){ } public void startApp() { display = Display.getDisplay(this); 42 Andino Maseleno
  • 44. Bab 3 – Pemrograman GUI t = new Ticker("This is Ticker"); List l = new List("Simple Choice", Choice.EXCLUSIVE); l.append("Choice 1",null); l.append("Choice 2",null); l.setTicker(t); display.setCurrent(l); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } TextBox Kelas TextBox merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Screen. TextBox menyediakan media untuk menerima masukan teks dari keypad pengguna handheld. Jadi jika aplikasi MIDlet Anda membutuhkan masukan dari pengguna, misalnya password, nama, alamat dan informasi berbasis teks lainnya Anda akan menggunakan objek TextBox ini. Konstruktor dari kelas TextBox ini adalah: public TextBox(String title, String text, int maxSize, int constraints) parameter-parameter:  String title Untuk memberikan title pada Screen  String text Untuk memberikan nilai awal pada TextBox  int maxSize Untuk memberikan batasan maksimal jumlah karakter yang bisa diterima oleh TextBox. Jadi Anda tidak akan bisa memasukkan karakter yang jumlahnya melebihi batas maksimal ini.  int constraint Ada beberapa nilai yang bisa digunakan untuk parameter ini, yakni: 1. TextField.ANY Artinya, bisa memasukkan sembarang karakter teks 2. TextField.EMAILADDR Artinya, bisa memasukkan teks yang merupakan alamat email. Misalnya : 43 Andino Maseleno
  • 45. Bab 3 – Pemrograman GUI andinomaseleno@yahoo.com 3. TextField.NUMERIC Artinya, hanya bisa memasukkan teks berupa angka saja. 4. TextField.PHONENUMBER Artinya, hanya bisa memasukkan teks berupa nomor telepon saja, misalnya +628156037413, 08122311345. 5. TextField.URL Artinya, bisa memasukkan teks berupa alamat web atau URL lain, misalnya http://andinomaseleno.net 6. TextField.PASSWORD Artinya memasukkan password pada saat login ke Windows, masukan akan ditampilkan dengan karakter tertentu, misalnya ‘*’. Tipe batasan ini bisa digunakan dengan tipe batasan yang lain dengan menggunakan operator ‘|’ sehingga menambah kemampuan pembatasan yang ada. Fungsi penting dalam kelas TextBox lainnya adalah :  public int size() Menghasilkan jumlah karakter yang saat ini telah dimasukkan dalam TextBox.  public void delete(int offset, int length); Menghapus karakter dari posisi offset sepanjang jumlah karakter = length.  public int getCarerPosition(); Menghasilkan posisi kursor pada TextBox saat ini.  public String getString(); Menghasilkan string yang saat ini ada pada TextBox.  public void setString(String str); Menetapkan string pada TextBox menjadi str pada parameter fungsi di atas.  public void insert(String str, int position); Memasukkan string str pada parameter fungsi di atas pada TextBox mulai dari posisi position. Berikut contoh programnya: //Program textBoxDemo.java import javax.microedition.midlet.*; import javax.microedition.Textbox.*; public class textBoxDemo extends MIDlet { private Display display; 44 Andino Maseleno
  • 46. Bab 3 – Pemrograman GUI public textBoxDemo(){ } public void startApp(){ display = Display.getDisplay(this); TextBox t = new TextBox("This is TextBox","",256,TextField.ANY); Integer maxSize = new Integer(t.getMaxSize()); String toPrint = "Jumlah maksimal karakter"; t.setString(toPrint +"="+maxSize.toString()); display.setCurrent(t); } public void pauseApp() { } public void destroyApp(boolean unconditional){ } } List Kelas list (javax.microedition.lcdui.List) merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Screen yang menyediakan masukan pilihan (multiple choice) pada layar. Konstruktor dari kelas List ini ada dua, yakni: public List (String title, int listType) public List (String title, int listType, String[] listElement, Image[] listImages) Parameter-parameter:  String title Untuk memberikan title pada list  Int listType Tipe list yang diberikan dapat berisi 1. Choice.EXCLUSIVE Berarti setiap saat hanya bisa dipilih 1 buah pilihan] 2. Choice.IMPLICIT Sama halnya dengan Choice.EXCLUSIVE, namun penampilannya berbeda 3. Choice.MULTIPLE Berarti pengguna bisa memilih lebih dari 1 pilihan  String[] listElement 45 Andino Maseleno
  • 47. Bab 3 – Pemrograman GUI Merupakan array dari elemen list yang akan ditampilkan  Image[] listImage Merupakan array dari gambar (javax.microedition.lcdui.Image) elemen list yang akan ditampilkan. Jika menggunakan konstruktor yang pertama public List(String title, int listType), akan dibuat sebuah list kosong yang kemudian bisa menambahkan, menyisipkan, atau mengganti pilihan dalam list. Fungsi-fungsi yang berkaitan dengan hal ini adalah:  public int append(String element, Image image) Menambahkan satu elemen pada daftar pilihan dengan gambar tertentu. Jika tidak akan menampilkan gambar, parameter image bisa di set null. Fungsi ini menghasilkan nilai integer yang menunjukkan indeks lokasi dimana elemen baru saja ditambahkan.  public void insert(int index, String element, Image image) Menyisipkan satu elemen pada daftar pilihan dengan gambar tertentu pada lokasi yang ditentukan oleh nilai parameter index. Jika tidak akan menampilkan gambar, parameter image bisa di set null.  public void set(int index, String element, Image image) Menetapkan satu elemen pada daftar pilihan di lokasi yang ditentukan oleh nilai parameter index dengan gambar tertentu. Jika tidak akan menampilkan gambar, parameter image bisa di set null. Contoh penggunaan kelas list sebagai berikut: //Program listDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class listDemo extends MIDlet{ private Display display; public listDemo(){ } public void startApp() { display = Display.getDisplay(this); List myList = new List("This is List", Choice.IMPLICIT); myList.append("Choice 1",null); myList.append("Choice 2",null); myList.append("Choice 3",null); myList.insert(1,"Inserted Choice",null); 46 Andino Maseleno
  • 48. Bab 3 – Pemrograman GUI display.setCurrent(myList); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi penting dalam kelas List lainnya adalah:  public Image getImage(int index) Jika objek List menggunakan gambar, fungsi ini menghasilkan objek Image yang digunakan pada lokasi seperti yang disebutkan parameter index.  public String getString(int index) Menghasilkan string teks yang ada pada objek List pada lokasi ke index  public boolean isSelected(int index) Menghasilkan nilai true jika elemen ke-index dipilih oleh pengguna, jika tidak maka akan menghasilkan nilai false.  public void delete(int index) Menghapus elemen ke-index pada daftar pilihan yang ada.  public int getSelectedIndex() Menghasilkan nilai indeks lokasi dimana sebuah elemen dipilih.  public int size() Menghasilkan nilai jumlah elemen dalam list Form Bekerja dengan form memungkinkan untuk menampilkan beberapa komponen GUI semacam daftar pilihan, masukan teks (textbox) dalam stu layar. Form diimplementasikan oleh kelas javax.microedition.lcdui.Form. Form dapat menampung komponen-komponen yang disebut item dalam satu layar, yaitu item-item tersebut adalah textfields, gauge, dan choice groups. Item- item tersebut merupakan implementasi dari kelas turunan Item (javax.microedition.lcdui.Item). Ada dua konstruktor form yang umum digunakan, yakni: Public Form(String title) Public Form(String title, Item[] items) 47 Andino Maseleno
  • 49. Bab 3 – Pemrograman GUI Konstruktor pertama secara sederhana menyediakan sebuah form dengan judul form seperti parameter title yang diberika, sedangkan konstruktor yang kedua juga mendefinisikan item-item apa saja yang akan ada di form yang akan dibuat. Sebagai gambaran, berikut contoh programnya: //Program formDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class formDemo extends MIDlet { private Display display; public formDemo() { } public void startApp() { Display display = Display.getDisplay(this); Form f = new Form("Empty Form"); display.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi-fungsi berikut adalah fungsi-fungsi penting dalam kelas Form:  public int append(Image img) Menambahkan gambar ke form yang dibungkus dalam kelas javax.microedition.lcdui.Image.  public int append(Item itm) Menambahkan item ke form yang merupkan kelas-kelas turunan Item (javax.microedition.lcdui.Item).  public int size() Menghasilkan nilai integer yang merupakan jumlah item dalam form.  public void delete(int numItem) Menghapus elemen atau item ke-numItem pada form.  public Item get(int numItem) Menghasilkan objek Item pada form yang merupakan item ke numItem.  public void set(int numItem, Item itm) 48 Andino Maseleno
  • 50. Bab 3 – Pemrograman GUI Menetapkan item ke-numItem menjadi objek Item sesuai parameter itm.  public void insert(int numItem, Item itm) Menyisipkan item pada item ke-numItem dengan objek Item sesuai parameter itm. Kelas Item (javax.microedition.lcdui Komponen-komponen yang bisa diletakkan dalam sebuah form merupakan komponen-komponen yang memiliki kelas yang merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item. Komponen-komponen tersebut adalah:  ChoiceGroup Kelas ini menyediakan komponen yang mirip dengan list, yakni untuk menyediakan daftar pilihan.  DateField Kelas ini menyediakan komponen untuk memasukkan informasi tanggal dan waktu.  Gauge Kelas ini menyediakan komponen grafik horizontal yang biasanya digunakan untuk memberikan gambaran berapa persen proses berjalan.  Image dan ImageItem Kelas ini menyediakan komponen grafik untuk manipulasi gambar.  StringItem Kelas ini menyediakan komponen teks string yang tidak bisa diedit oleh pengguna.  TextField Kelas ini menyediakan komponen untuk masukan teks string oleh pengguna. ChoiceGroup Kelas ChoiceGroup (javax.microedition.lcdui.ChoiceGroup) merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item yang menyediakan masukan pilihan (multiple choice) pada layar. Konstruktor dari kelas ChoiceGroup ini ada dua, yakni: public ChoiceGroup(String title, int choiceType) public ChoiceGroup(String title, int choiceType, String[] choiceElement, Image[] choiceImages) Parameter-parameter:  String title 49 Andino Maseleno
  • 51. Bab 3 – Pemrograman GUI Untuk memberikan title pada daftar pilihan yang ditampilkan.  int choiceType Tipe pilihan ini yang digunakan, dapat berisi: 1. Choice.EXCLUSIVE Berarti setiap saat hanya bisa dipilih 1 buah pilihan saja. 2. Choice.MULTIPLE Berarti pengguna bisa memilih lebih dari 1 pilihan.  String[] choiceElement Merupakan array dari elemen pada daftar pilihan yang akan ditampilkan.  Image[] choiceImages Merupakan array dari elemen gambar (javax.microedition.lcdui.Image) yang akan ditampilkan pada daftar pilihan. Jika menggunakan konstruktor yang pertama public.ChoiceGroup(String title, int choiceType), maka akan dibuat sebuah daftar pilihan kosong yang kemudian bisa menambahkan, menyisipkan, atau mengganti pilihan dalam list. Fungsi-fungsi yang berkaitan dengan hal ini adalah:  public int append(String element, Image image) Menambahkan satu elemen pada daftar pilihan dengan gambar tertentu. Jika tidak akan menampilkan gambar, parameter image bisa di set null. Fungsi inio menghasilkan nilai integer yang menunjukkan indeks lokasi dimana elemen baru saja ditambahkan.  public void insert(int index, String element, Image image) Menyisipkan satu elemen pada daftar pilihan dengan gambar tertentu pada lokasi yang ditentukan oleh nilai parameter index. Jika tidak akan menampilkan gambar, parameter image bisa di set null.  public void set(int index, String element, Image image) Menetapkan satu elemen pada daftar pilihan di lokasi yang ditentukan oleh nilai parameter index dengan gambar tertentu. Jika tidak akan menampilkan gambar, parameter image bisa ditetapkan null. Contoh penggunaan kelas ChoiceGroup (javax.microedition.lcdui.ChoiceGroup) adalah sebagai berikut: //Program choiceGroupDemo.java 50 Andino Maseleno
  • 52. Bab 3 – Pemrograman GUI import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class choiceGroupDemo extends MIDlet { private Display display; public choiceGroupDemo() { } public void startApp() { display = Display.getDisplay(this); Form f = new Form("Pilih yang Anda inginkan"); ChoiceGroup cg = new ChoiceGroup("Pilihan Makanan", Choice.EXCLUSIVE); cg.append("Ayam",null); cg.append("Ikan",null); cg.insert(1,"Telur",null); f.append(cg); display.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi penting dalam kelas ChoiceGroup lainnya adalah:  public Image getImage(int index) Jika objek ChoiceGroup menggunakan gambar, maka fungsi ini menghasilkan objek Image yang digunakan pada lokasi seperti yang disebutkan parameter index.  public String getString(int index) Menghasilkan string teks yang ada pada objek ChoiceGroup pada lokasi ke-index.  public boolean isSelected(int index) Menghasilkan nilai true jika elemen ke-index dipilih oleh pengguna, jika tidak, akan menghasilkan nilai false.  public void delete(int index) Menghapus elemen ke-index pada daftar pilihan yang ada.  public int getSelectedIndex() Menghasilkan nilai indeks lokasi sebuah elemen dipilih  public int size() 51 Andino Maseleno
  • 53. Bab 3 – Pemrograman GUI Menghasilkan nilai jumlah elemen dalam daftar pilihan. DateField Kelas DateField (javax.microedition.lcdui.DateField) merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item yang menyediakan masukan berupa waktu atau tanggal untuk MIDlet. Konstruktor dari kelas DateField ini ada 2 buah yakni: public DateField(String title, int mode) public DateField(String title, int mode, TimeZone timezone) Parameter-parameter:  String title Untuk memberikan title pada masukan tanggal/waktu yang ditampilkan.  Int Mode Tipe masukan yang digunakan, dapat berisi: 1. DateField.TIME Berarti digunakan untuk mengambil masukan waktu. 2. DateField.DATE Berarti digunakan untuk mengambil masukan tanggal. 3. DateField.DATE_TIME Berarti digunakan untuk mengambil masukan waktu/tanggal.  TimeZone timezone Untuk memberikan informasi zona waktu yang akan digunakan. Kelas TimeZone ada dalam paket java.util. Berikut adalah kode Java untuk menampilkan informasi tanggal pada perangkat handheld: //Program dateDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class dateDemo extends MIDlet { private Display display; public dateDemo() { } public void startApp() { display = Display.getDisplay(this); Form f = new Form("Date Information"); 52 Andino Maseleno
  • 54. Bab 3 – Pemrograman GUI DateField d = new DateField("Today's date", DateField.DATE); f.append(d); display.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Gauge Objek Gauge merepresentasikan grafik batang yang disusun secara horizontal yang dapat digunakan dalam form untuk merepresentasikan jalannya sebuah proses dan lain sebagainya. Objek Gauge diimplementasikan oleh kelas Gauge(javax.microedition.lcdui.Gauge) yang merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item. Konstruktor dari kelas Gauge ini adalah: public Gauge (String title, boolean interactive, int maxValue, int initialValue) Parameter-parameter:  String title Untuk memberikan title pada Gauge yang ditampilkan.  boolean interactive Apakah akan ditampilkan secara interaktif atau tidak? Jika modenya interaktif, user bisa mengubah progress bar yang ada dan jika modenya tidak interaktif, user tidak bisa mengubah progress bar yang ada.  int maxValue Nilai maksimum yang diperbolehkan, dimana nilai ini harus > 0.  int initialValue Nilai awal yang digunakan, nilainya antara 0 sampai dengan nilai maksimum yang telah didefinisikan. Agar lebih jelas perhatikan contoh sederhana berikut ini: //Program gaugeDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Date; 53 Andino Maseleno
  • 55. Bab 3 – Pemrograman GUI public class gaugeDemo extends MIDlet { private Display display; public gaugeDemo() { } public void startApp() { display = Display.getDisplay(this); Form f = new Form("What is Gauge ?"); Gauge g1 = new Gauge("This is a Gauge",false,15,1); f.append(g1); display.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Untuk mendapatkan informasi apakah progress bar yang dibuat bersifat interaktif atau tidak dengan menggunakan fungsi:  public boolean isInteractive() Jika dikembalikan nilai true, progress bar bersifat interactive. Dari objek Gauge ini, bisa diperoleh nilai yang sedang ada sekarang, nilai maksimal yang diperbolehkan dengan fungsi-fungsi berikut:  public int getValue() Menghasilan nilai integer dari progress bar yang ada  public int getMaxValue() Menghasilkan nilai maksimum dari progress bar yang ada Selain itu, bisa ditetapkan nilai yang sedang ada sekarang, nilai maksimal yang diperbolehkan dengan fungsi-fungsi berikut:  public void setValue(int val) Menetapkan nilai integer dari progress bar yang ada.  public void setMaxValue(int maxval) Menetapkan nilai maksimum dari progressbar yang ada. Bisa juga diubah label judul dari progress bar yang ada menggunakan fungsi:  public void setLabel(String str) Menetapkan label progress bar yang ada dengan teks string pada parameter. 54 Andino Maseleno
  • 56. Bab 3 – Pemrograman GUI StringItem Objek StringItem digunakan untuk meletakkan objek teks string yang tidak bisa diubah oleh pengguna secara langsung pada form. Kelas StringItem diimplementasikan oleh kelas StringItem (javax.microedition.lcdui.StringItem) yang merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item. Konstruktor dari kelas StringItem ini adalah: public Gauge(String label, String content) Parameter-parameter:  String title Untuk memberikan title pada objek teks string yang ditampilkan.  String content Isi dari teks yang akan ditampilkan pada form. Berikut contoh programnya: //Program stringItemDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class stringItemDemo extends MIDlet { private Display display; public stringItemDemo() { } public void startApp() { display = Display.getDisplay(this); Form f = new Form("Greeting"); StringItem si = new StringItem("I say: "Hi Girls"); f.append(si); display.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi-fungsi yang ada di dalam kelas ini adalah:  public void setText(String teks) Menetapkan teks sesuai parameter teks yang diberikan pada objek StringItem 55 Andino Maseleno
  • 57. Bab 3 – Pemrograman GUI  public void setLabel(String lbl) Menetapkan label pada objek StringItem sesuai parameter lbl yang diberikan.  public String getText() Menghasilkan teks string yang ada pada objek  public String getLabel() Menghasilkan label yang ada pada objek StringItem. TextField Objek TextField digunakan untuk meletakkan objek teks string yang bisa diubah oleh pengguna secara langsung pada form. Jadi, objek ini mirip dengan objek TextBox. Objek TextField diimplementasikan oleh kelas TextField (javax.microedition.lcdui.TextField) yang merupakan kelas turunan dari kelas abstrak javax.microedition.lcdui.Item. Konstruktor dari kelas TextField ini adalah: public TextField(String title, String text, int maxSize, int constraints) Parameter-parameter: String title Untuk memberikan title pada TextField yang aktif. String text Untuk memberikan nilai awal pada TextField. int maxSize Untuk memberikan batasan maksimal jumlah karakter yang bisa diterima oleh TextField. Jadi tidak akan bisa memasukkan karakter yang jumlahnya melebihi batas maksimal ini. int constraint Ada beberapa nilai yang bisa digunakan untuk parameter ini, yakni: TextField.ANY Artinya, bisa memasukkan sembarang karakter teks. TextField.EMAILADDR Artinya, bisa memasukkan teks yang merupakan alamat email, misalnya andinomaseleno@yahoo.com TextField.NUMERIC Artinya, hanya bisa memasukkan teks berupa angka saja. TextField.PHONENUMBER 56 Andino Maseleno
  • 58. Bab 3 – Pemrograman GUI Artinya, hanya bisa memasukkan teks yang berupa nomor telepon saja, misalnya +628156864651, 08156864651. TextField.URL Artinya, bisa memasukkan teks berupa alamat Web atau URL lain, misalnya http://andinomaseleno.net TextField.PASSWORD Artinya, seperti memasukkan password pada saat logi ke Windows, masukkan akan ditampilkan dengan karater tertentu, misalnya ‘*’. Tipe batasan ini bisa digunakan dengan tipe batasan yang lain dengan menggunakan operator ‘|’ sehingga menambah kemampuan pembatasan yang ada. Berikut contoh programnya: //Program textFieldDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class textFieldDemo extends MIDlet { private Display display; public textFieldDemo() { } public void startApp() { display = Display.getDisplay(this); TextField lname = new TextField("Login Name","andinomaseleno",25,TextField.ANY); TextField pval = new TextField("Password","secret",45,TextField.ANY|TextField.PASSWORD); Form f = new Form("Sign on"); f.append(lname); f.append(pval); display.setCurrent(f); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi penting dalam kelas TextField lainnya adalah: 57 Andino Maseleno
  • 59. Bab 3 – Pemrograman GUI  public int size() Menghasilkan jumlah karakter yang saat ini telah dimasukkan dalam TextField  public void delete(int offset, int length) Menghapus karakter dari posisi offset sepanjang jumlah karakter = length.  public int getCaretPosition() Menghasilkan posisi kursor pada TextField saat ini.  public String getString() Menghasilkan string yang saat ini ada pada TextField.  public void setString(String str) Menetapkan string pada TextField menjadi str pada parameter fungsi di atas.  public void insert(String str, int position) Memasukkan string str pada parameter fungsi di atas pada TextField mulai dari posisi position. Image Objek Image digunakan untuk meletakkan objek gambar yang bisa bersifat immutable atau mutable. Gambar yang bersifat immutable artinya tidak bisa diubah-ubah oleh aplikasi, dan umumnya berupa gambar yang diambil dari sebuah file gambar, URL atauu tempat lain. Sebaliknya gambar yang bersifat mutable bisa diubah-ubah oleh aplikasi. Konstruktor dari kelas Image ini bersifat statik, sehingga tidak menggunakan operator new untuk membuat sebuah objek Image melainkan mengacu ke fungsi createImage() pada objek Image ini: public static void createImage(String name) public static void createImage(Image img) public static void createImage(int width, int height) Konstruktor pertama dan kedua digunakan untuk membuat objek Image yang bersifat immutable. Perlu diketahui bahwa jenis file gambar yang didukung saat ini hanya file dengan format PNG (Portable Network Graphics). Berikut contoh programnya: //Program imageDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; public class imageDemo extends MIDlet { private Display display; public imageDemo() { 58 Andino Maseleno
  • 60. Bab 3 – Pemrograman GUI } public void startApp() { display = Display.getDisplay(this); try { Image myimg = Image.createImage("/Andino.png"); Form f = new Form("Andino"); f.append(myimg); display.setCurrent(f); } catch (IOException e) { } } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi-fungsi penting dalam kelas Image ini adalah:  public Graphics getGraphics() Menghasilkan objek Graphics yang bersesuaian dari objek Image yang bersangkutan.  public int getHeight() Menghasilkan tinggi/panjang objek gambar yang ada.  public int getWidth() Menghasilkan lebar objek gambar yang ada.  public boolean isMutable() Menghasilkan nilai true jika objek gambar bersifat mutable. ImageItem Objek ImageItem digunakan untuk mengotrol objek Image yang ada pada form atau alert. Konstruktor dari kelas ImageItem ini adalah: public void ImageItem(String label, Image img, int layout, String altText) Parameter-parameter:  String label Untuk memberikan judul pada objek ImageItem yang aktif.  String altText 59 Andino Maseleno
  • 61. Bab 3 – Pemrograman GUI Untuk memberikan alternatif teks string pada gambar.  Image img Objek Image yang akan dikontrol.  int layout Ada beberapa nilai yang bisa digunakan untuk parameter ini, yakni: 1. ImageItem.LAYOUT_CENTER Gambar akan diatur agar pada posisi tengah. 2. ImageItem.LAYOUT_DEFAULT Gambar diatur sesuai posisi standarnya. 3. ImageItem.LAYOUT_LEFT Gambar diatur agar pada posisi kiri. 4. ImageItem.LAYOUT_RIGHT Gambar diatur agar pada posisi kanan. 5. ImageItem.LAYOUT_NEWLINE_AFTER Setelah gambar dibuat akan diberikan sebuah baris baru. 6. ImageItem.LAYOUT_NEWLINE_BEFORE Sebelum gambar dibuat akan diberikan sebuah baris baru. Berikut contoh programnya: //Program imageDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; public class imageDemo extends MIDlet { private Display display; public imageDemo() { } public void startApp() { display = Display.getDisplay(this); try { Image myimg = Image.createImage(myimg); ImageItem item = new ImageItem("My Duke", img2, ImageItem.LAYOUT_NEWLINE_BEFORE, "My Duke"); Form f = new Form ("Duke"); f.append(myimg); 60 Andino Maseleno
  • 62. Bab 3 – Pemrograman GUI f.append(item); display.setCurrent(f); } catch (IOException e) { } } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi-fungsi penting dalam kelas ImageItem ini adalah:  public String getAltText() Menghasilkan teks string yang merupakan teks alternatif dari objek ImageItem.  public Image getImage() Menghasilkan objek Image dari objek ImageItem yang bersangkutan.  public int getLayout() Menghasilkan tipe layout yang digunakan oleh objek ImageItem yang bersangkutan.  public void setAltText(String altText) Menetapkan teks string yang merupakan teks alternatif pada objek ImageItem.  public void setImage(Image img) Menetapkan objek Image dari objek ImageItem yang bersangkutan.  public void setLayout(int layout) Menetapkan tipe layout yang akan digunakan oleh objek ImageItem yang bersangkutan. LowLevel API untuk Pembuatan GUI Canvas Kelas canvas merupakan kelas yang menyediakan fungsi-fungsi untuk manajemen antarmuka pada level rendah handheld. Kelas ini merupakan kelas abstrak sehingga harus membuat kelas turunannnya dahulu untuk melakukan manajemen antarmuka pada level rendah. Berikut kode sumber kelas javax.microedition.lcdui.Canvas: package javax.microedition.lcdui.*; public abstrack class Canvas extends Displayable { 61 Andino Maseleno
  • 63. Bab 3 – Pemrograman GUI public static final int UP = 1; public static final int DOWN = 6; public static final int LEFT = 2; public static final int RIGHT = 5; public static final int FIRE = 8; public static final int GAME_A = 9; public static final int GAME_B = 10; public static final int GAME_C = 11; public static final int GAME_D = 12; public static final int KEY_NUM0 = 48; public static final int KEY_NUM1 = 49; public static final int KEY_NUM2 = 50; public static final int KEY_NUM3 = 51; public static final int KEY_NUM4 = 52; public static final int KEY_NUM5 = 53; public static final int KEY_NUM6 = 54; public static final int KEY_NUM7 = 55; public static final int KEY_NUM8 = 56; public static final int KEY_NUM9 = 57; public static final int KEY_STAR = 42; public static final int KEY_POUND = 35; protected Canvas() { } public int getWidth() { return Display.WIDTH; } public int getHeight() { return Display.HEIGHT; } public boolean isDoubleBuffered() { return Display.IS_DOUBLE_BUFFERED; } public boolean hasPointerEvents() { return Display.POINTER_SUPPORTED; } public boolean hasPointerMotionEvents() { return Display.MOTION_SUPPORTED; } public boolean hasRepeatEvents() { 62 Andino Maseleno
  • 64. Bab 3 – Pemrograman GUI return Display.REPEAT_SUPPORTED; } public int getKeyCode(int gameAction) { int n = Display.getKeyCode(gameAction); if (n == 0) throw new illegalArgumentException(); else return s; } public int getGameAction(int keyCode) { int n = Display.getGameAction(keyCode); if (n == -1) throw new IllegalArgumentException(); else return n; } protected void keyPressed(int i) { } protected void keyRepeated(int i) { } protected void keyReleased(int i) { } protected void pointerPressed(int i, int j) { } protected void pointerReleased(int i, int j) { } protected void pointerDragged(int I, int j) { } public final void repaint(int x, int y, int width, int haight) { synchronized(Display.LCDUILock) { super.repaint(x, y, width, height); } } public final void serviceRepaints() { Display d = super.currentDisplay; if (d != null) d.serviceRepaints(); } protected void showNotify() { } 63 Andino Maseleno
  • 65. Bab 3 – Pemrograman GUI protected void hideNotify() { } protected abstrack void paint(Graphics g); } Tampak bahwa kelas Canvas merupakan kelas abstrak sekaligus turunan dari kelas Displayable. Penggunaan kelas Canvas umumnya bersamaan dengan kelas Graphics, karena kelas Graphics lah yang menyediakan objek-objek grafik dan fungsi-fungsi yang dibutuhkan untuk manipulasi grafik level rendah. Contoh penggunaan kelas Canvas adalah sebagai berikut: //Program canvasDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class myCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255, 0, 0); g.fillRect(0, 0, getWidth(), getHeight()); g.setColor(255, 255, 255); g.drawString("Selamat Pagi Dunia", 0, 0, g.TOP | g.LEFT); } }; public class canvasDemo extends MIDlet { private Display display; public canvasDemo() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new myCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Fungsi penting yang berkaitan dengan informasi besarnya dimensi x dan y dari layar yang ada adalah: 64 Andino Maseleno
  • 66. Bab 3 – Pemrograman GUI  public int getHeight() Menghasilkan tinggi maksimal atau nilai ordinat maksimal dari layar.  public int getWidth() Menghasilkan lebar maksimal atau nilai absis maksimal dari layar. Font Kelas Font (javax.microedition.lcdui.Font) digunakan untuk manipulasi tipe font yang disediakan oleh perangkat handheld. Font tidak bisa dibuat oleh aplikasi, aplikasi hanya bisa meminta font yang diinginkan sesuai tipe, ukuran, dan atribut lain dan sistem akan mengembalikan font yang paling sesuai ke aplikasi. Atribut dari sebuah font adalah ukuran (size), corak (style), dan tipe font (face) sebagai berikut: Ukuran Ada tiga nilai untuk ukuran, yakni: Font.SIZE_SMALL Font.SIZE_MEDIUM Font.SIZE_LARGE Masing-masing nilai di atas berkaitan dengan ukuran kecil, sedang, dan besar. Corak Ada empat nilai untuk corak, yakni: Font.STYLE_BOLD Font.STYLE_ITALIC Font.STYLE_PLAIN Font.STYLE_UNDERLINED Tipe Ada tiga nilai untuk tipe font, yakni: Font.FACE_MONOSPACE Font.FACE_PROPORTIONAL Font.FACE_SYSTEM Tidak ada konstruktor untuk kelas ini, umumnya pembuatan objek Font dengan memanggil fungsi statik getFont() yang disediakan oleh kelas Font semacam ini: Font f = Font.getFont(FACE_SYSTEM, STYLE_PLAIN, SIZE_SMALL) Parameter dari fungsi getFont() ada 3, dimana parameter pertama adalah tipe (face), parameter 65 Andino Maseleno
  • 67. Bab 3 – Pemrograman GUI kedua adalah corak (style), dan parameter ketiga adalah ukuran (size). Berikut contoh programnya: //Program fontDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class fontCanvas extends Canvas { public void paint (Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(255,0,0); g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_LARGE)); g.drawString("System Font", 0, 0, g.LEFT | g.TOP); g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_MEDIUM)); g.drawString("Medium Size", 0, 15, g.LEFT | g.TOP); g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM)); g.drawString("Bold Style", 0, 30, g.LEFT | g.TOP); g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_ITALIC, Font.SIZE_MEDIUM)); g.drawString("Italic Style", 0, 45, g. LEFT | g.TOP); g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_UNDERLINED, Font.SIZE_MEDIUM)); g.drawString("Underlined Style", 0, 60, g.LEFT | g.TOP); } }; public class fontDemo extends MIDlet { private Display display; public fontDemo() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new fontCanvas(); display.setCurrent(canvas); } public void pauseApp() { } 66 Andino Maseleno
  • 68. Bab 3 – Pemrograman GUI public void destroyApp(boolean unconditional) { } } Fungsi-fungsi penting lainnya dalam kelas Font adalah:  public boolean isBold() Menghasilkan true jika font merupakan huruf tebal.  public boolean isItalic() Menghasilkan true jika font merupakan huruf miring.  public boolean isPlaint() Menghasilkan true jika font merupakan huruf standar.  public boolean isUnderlined() Menghasilkan true jika font merupakan hurut dengan garis bawah.  public int getStyle() Mengembalikan corak (style) dari font yang bersangkutan dari layar, apakah Font.STYLE_BOLD, Font.STYLE_PLAIN, Font.STYLE_ITALICS, atau Font.STYLE_UNDERLINED.  public int getFace() Mengembalikan tipe font (face) dari font yang bersangkutan dari layar, apakah Font.FACE_MONOSPACE, Font.FACE_PROPORTIONAL atau Font.FACE_SYSTEM.  public int getSize() Mengembalikan ukuran font, apakah Font.SIZE_SMALL, Font.SIZE_MEDIUM, atau Font.SIZE_LARGE.  public int getHeight Menghasilkan tinggi font yang ada.  public int string Width(String str) Menghasilkan lebar dari string str pada parameter. Graphics Kelas Graphics (javax.microedition.lcdui.Graphics) digunakan untuk membuat objek-objek dua dimensi. Komponen-komponen grafik primitif yang bisa dimanipulasi adalah teks, garis, gambar (image), rectangle (untuk objek-objek persegi), dan arcs (untuk lengkungan-lengkungan). 67 Andino Maseleno
  • 69. Bab 3 – Pemrograman GUI Warna yang disediakan adalah 24 bit dengan masing-masing 8 bit untuk warna merah (red), 8 bit hijau (green), dan 8 bit biru (blue). Warna Jika ingin menggunakan pewarnaan, misalnya untuk menulis teks, menggambar garis atau lengkungan, dan operasi lain pada objek Graphics, bisa menggunakan fungsi sebagai berikut:  public void setColor(int red, int green, int blue) Parameter-parameter red, green, blue masing-masing berkaitan dengan warna dasar, yakni merah, hijau, dan biru dan nilainya antara 0-255, misalnya setColor(255,255,0).  public void setColor(int RGB) Parameter RGB adalah sepeti 0xRRGGBB, jadi ada bagian RR untuk warna merah (red), GG untuk warna hijau (green), dan biru (blue) dan nilainya adalah nilai hexadesimal (00-FF), misalnya setColor(0x00FF0000). Setiap kali menggunakan fungsi setColor(), maka otomatis operasi grafis berikutnya akan menggunakan pewarnaan sesuai yang diberikan pada setColor(). Selain menggunakan warna RGB, banyak perangkat handheld yang masih menggunakan warna grayscale, dan karenanya disediakan pula fungsi:  public void setGrayScale(int scale) Parameter scale adalah tingkat grayscale yang berkisar antara 0-255. Fungsi lain yang berkaitan dengan masalah warna adalah:  public int getColor() Menghasilkan informasi nilai warna yang saat ini aktif, nilainya berformat 0xRRGGBB, misalnya jika warna sekarang merah, akan menghasilkan nilai 0xFF0000, jika hijau, akan menghasilkan nilai 0x00FF00 dan seterusnya.  public int getRecComponent() Menghasilkan informasi nilai warna merah yang saat ini aktif, nilainya berkisar antara 0-255.  public int getGreenComponent() Menghasilkan informasi nilai warna hijau yang saat ini aktif, nilainya berkisar antara 0-255.  public int getBlueComponent() Menghasilkan informasi nilai warna biru yang saat ini aktif, nilainya berkisar antara 0-255.  public int getGrayScale() Menghasilkan informasi nilai warna grayscale yang saat ini aktif, nilainya berkisar antara 0- 68 Andino Maseleno
  • 70. Bab 3 – Pemrograman GUI 255. Contoh penggunaan warna ini adalah sebagai berikut: //program colorDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class colorCanvas extends Canvas { public void paint (Graphics g) { g.setColor(255,0,0); g.fillRect(0,0,getWidth(),10); g.setColor(0,255,0); g.fillRect(0,10,getWidth(),20); g.setColor(0,0,255); g.fillRect(0,20,getWidth(),30); g.setGrayScale(5); g.fillRect(0,30,getWidth(),40); g.setColor(0xFFFFFF); g.fillRect(0,40,getWidth(),getHeight()); g.setColor(0xff00ff); int red = g.getRedComponent(); int green = g.getGreenComponent(); int blue = g.getBlueComponent(); String rS = "Merah: "+(new Integer(red)).toString()+ "n"; String gS = "Hijau: "+(new Integer(green)).toString()+ "n"; String bS = "Biru: "+(new Integer(blue)).toString()+ "n"; g.drawString(rS, 1, 45, g.LEFT | g.TOP); g.drawString(gS, 1, 45 + (g.getFont()).getHeight(), g.LEFT | g.TOP); g.drawString(bs, 1, 45 + (2 * (g.getFont()).getHeight()), g.LEFT | g.TOP); } }; public class colorDemo extends MIDlet { private Display display; public colorDemo() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new colorCanvas(); display.setCurrent(canvas); } 69 Andino Maseleno
  • 71. Bab 3 – Pemrograman GUI public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Teks Setelah menetapkan warna sesuai yang diinginkan, selanjutnya bisa ditambahkan teks pada layar dengan menggunakan fungsi drawString() sebagai berikut:  public void drawString(String str, int x, int y, int anchor) Menambahkan sebuah string pada posisi x dan y, dengan aturan posisi sesuai nilai anchor. Nilai anchor merupakan gabungan dari konstanta statik pada kelas javax.microedition.lcdui.Graphics. 1. TOP Meletakkan sebuah teks rata atas. 2. BASELINE Meletakkan sebuah teks rata tengah. 3. BOTTOM Meletakkan sebuah teks rata bawah, dengan nilai-nilai berikut: a. LEFT Berarti meletakkan sebuah teks rata kiri. b. HCENTER Berarti meletakkan sebuah teks rata tengah secara horizontal. c. RIGHT Meletakkan sebuah teks rata kanan. Fungsi-fungsi lain yang erat kaitannya dengan penulisan teks string adalah fungsi-fungsi yang berkaitan dengan objek Font, yakni getHeight() dan stringWidth(). Kedua fungsi tersebut memberikan informasi besarnya tinggi font dan lebar string, yang nantinya akan mempengaruhi penulisan string berikutnya. Selain menuliskan teks String, juga bisa dituliskan sebuah karakter dengan menggunakan fungsi drawChar() sebagai berikut:  public void drawChar(char c, str, int x, int y, int anchor) Menambahkan sebuah karakter pada posisi x dan y, dengan aturan posisi sesuai nilai anchor. Nilai anchor ini sama dengan aturan nilai anchor pada fungsi drawString(). 70 Andino Maseleno
  • 72. Bab 3 – Pemrograman GUI Berikut contoh programnya: //Program teksStringDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class teksCanvas extends Canvas { public void paint(Graphics g) { String s1 = "Teks 1"; String s2 = "Teks 2"; String s3 = "Teks 3"; char c1 = 'x'; Font f = g.getFont(); g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0,0,0); g.drawString(s1,1,1,g.TOP | g.LEFT); g.drawString(s2,1,1+ f.getHeight(), g.TOP | g.LEFT); g.drawString(s3,1+f.stringWidth(s1),1, g.TOP | g.LEFT); g.drawChar(c1,1+f.stringWidth(s2),1+f.getHeight(), g.TOP | g.LEFT); } }; public class teksStringDemo extends MIDlet { private Display display; public teksStringDemo(){ } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new teksCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Garis Selain menambahkan teks, bisa juga menggambar garis dengan menggunakan fungsi 71 Andino Maseleno
  • 73. Bab 3 – Pemrograman GUI drawLine() sebagai berikut:  public void drawLine(int x1, int y1, int x2, int y2) Menggambar garis dari koordinat (x1,y1) sampai dengan koordinat (x2,y2). Contoh penggambaran garis adalah sebagai berikut: //Program lineDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class lineCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0,0,0); g.drawLine(0,0,getWidth(),getHeight()); g.drawLine(0,0,getWidth()-10,getHeight()); g.drawLine(0,0,getWidth(),getHeight()-10); g.drawLine(0,0,getWidth()-20,getHeight()); g.drawLine(0,0,getWidth(),getHeight()-20); g.drawLine(0,0,getWidth()-30,getHeight()); g.drawLine(0,0,getWidth(),getHeight()-30); g.drawLine(0,0,getWidth()-40,getHeight()); g.drawLine(0,0,getWidth(),getHeight()-40); } }; public class lineDemo extends MIDlet { private Display display; public lineDemo() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new lineCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } 72 Andino Maseleno
  • 74. Bab 3 – Pemrograman GUI Persegi (rectangle) Untuk membuat sebuah segi empat berupa persegi panjang atau bujursangkar, digunakan fungsi drawRect() sebagai berikut:  public void drawRect(int x, int y, int width, int height) Menggambar segi empat dengan koordinat pojok kiri atas (x,y) dan lebar = width serta panjang = height. Contoh penggambaran persegi ini adalah sebagai berikut: //Program rectDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class rectCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.drawRect(0,0,10,10); g.drawRect(10,10,10,10); g.drawRect(20,20,10,10); g.drawRect(30,30,10,10); g.drawRect(40,40,10,10); g.drawRect(50,50,10,10); g.drawRect(60,60,10,10); g.drawRect(70,70,10,10); g.drawRect(10,50,30,10); g.drawRect(10,60,30,10); g.setColor(10,70,30,10); } }; public class rectDemo extends MIDlet { private Display display; public rectDemo() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new rectCanvas(); display.setCurrent(canvas); } 73 Andino Maseleno
  • 75. Bab 3 – Pemrograman GUI public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Lengkungan Untuk membuat sebuah lengkungan yang kemudian memungkinkan dalam membuat sebuah lingkaran, elips atau bidang lengkung lainnya, digunakan fungsi drawArc() sebagai berikut:  public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) Menggambar lengkungan dengan koordinat pojok kiri atas adalah (x,y) dengan ukuran lebar = width serta panjang = height. Sudut awal adalah startAngle dan arcAngle adalah nilai sudut relatif terhadap sudut awal. Sudut 0 derajat dalam hal ini adalah pada posisi jam 3 dan penambahan sudut, yakni yang nilainya ditentukan oleh arcAngle adalah berlawanan arah dengan jarum jam. Contoh penggambaran lengkungan adalah sebagai berikut: //Program arcDemo.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class arcCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(255,0,0); int absis = getWidth()/2; int ordinat = getHeight()/2; g.drawArc(absis,ordinat,40,40,0,360); absis = 5; ordinat = 5; g.drawArc(absis,ordinat,40,40,30,180); absis = 50; ordinat = 5; g.drawArc(absis, ordinat, 40, 40, 0, ,90); } }; public class arcDemo extends MIDlet { 74 Andino Maseleno
  • 76. Bab 3 – Pemrograman GUI private Display display; public arcDemo() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new arcCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Gambar 3 Dimensi Dengan menggunakan fungsi-fungsi dasar untuk membuat garis, lengkungan, dan persegi, berikut akan diberikan beberapa contoh pembuatanobjek 3 dimensi: //Program Kubus.java import javax.microedition.midlet.*; import javax.microediton.lcdui.*; class kubusCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(235,0,0); int absis = 40; int ordinat = 3; int i; for(i=1; i<20; i++) { g.fillRect(absis-i, ordinat+i, 40, 40); } g.setColor(255,0,0); g.fillRect(absis-i, ordinat+i, 40, 40); } }; public class Kubus extends MIDlet { private Display display; 75 Andino Maseleno
  • 77. Bab 3 – Pemrograman GUI public kubus() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new kubusCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Piramida Berikut contoh program untuk membuat sebuah piramida: //Program Piramida.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class piramidCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(235,0,0); int absis = 30; int ordinat = 3; int i; for(i=1; i<15; i++) { g.drawLine(abis,ordinat,55+i,(getHeight()-10)-i); } g.setColor(255,0,0); for (i = -(55-30); i<=(55-30); i++) { g.drawLine(absis,ordinat,30+i,getHeight()-10); } } }; public class Piramida extends MIDlet { private Display display; public Piramida() { 76 Andino Maseleno
  • 78. Bab 3 – Pemrograman GUI } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new piramidCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Tabung Berikut contoh program untuk membuat sebuah tabung: //Program Tabung.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class tabungCanvas extends Canvas { public void paint(Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(235,0,0); int absis = 20; int ordinat = 3; for (int i=1; i<50; i++) { g.fillArc(absis,ordinat+i,40,25,0,-180); } g.setColor(255,0,0); g.fillArc(absis,ordinat,40,25,0,360); } }; public class Tabung extends MIDlet { private Display display; public Tabung() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new tabungCanvas(); 77 Andino Maseleno
  • 79. Bab 3 – Pemrograman GUI display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } 78 Andino Maseleno
  • 80. Bab 4 –Manajemen Event Bab 4 Manajemen Event Ketika terjadi interaksi antara pengguna dengan perangkat handheld semacam handphone, Palm, dan organizer, maka akan dihasilkan suatu event. Misalnya, jika memilih suatu menu, memasukkan teks ke dalam objek TextField, maka sistem akan memproduksi sebuah event yang memberitahu aplikasi bahwa telah terjadi suatu event sebagai wujud interaksi dari pengguna sehingga aplikasi MIDlet bisa melakukan sesuatu berdasar event tersebut. Level Tinggi untuk Event Untuk bisa menangani event pada level tinggi (high level), cukup mengimplementasikan interface CommandListener dan atau ItemStateListener yang dideklarasikan pada paket javax.microedition.lcdui. Command dan Interface CommandListener Kelas Command (javax.microedition.lcdui.Command) merupakan kelas yang mengenkapsulasi informasi sebuah aksi. Dari informasi yang dienkapsulasi oleh kelas ini, maka aplikasi bisa menentukan aksi apa yang dilakukan, tipenya bagaimana dan lain sebagainya. Pada bab yang terdahulu telah digunakan beberapa objek GUI seperti textbox, tanggal (DateField), dan menu pilihan (ChoiceGroup). Semua objek tersebut memiliki tiga fungsi yang berkaitan dengan manajemen event dengan objek Command ini, yakni:  public void addCommand(Command cmd) Mengasosiasikan objek GUI yang bersangkutan dengan objek Command cmd.  public void removeCommand(Command cmd) Menghapus asosiasi objek GUI yang bersangkutan dengan objek Command cmd yang pernah dibuat.  public void setCommandListener(CommandListener l) Mengasosiasikan objek GUI yang bersangkutan dengan interface CommandListener . Ketiga fungsi tersebut merupakan fungsi yang diturunkan oleh kelas Displayable. Konstruktor kelas Command adalah: public Command(String label, int commandType, int prio) 79 Andino Maseleno
  • 81. Bab 4 –Manajemen Event parameter-parameter:  String label Memberikan label pada perintah yang ada.  commandType Tipe perintah yang ada, disini ada beberapa nilai yang diperbolehkan, yakni: 1. Command.BACK Digunakan untuk kembali ke layar sebelumnya, seperti halnya fungsi Back pada browser Internet. 2. Command.CANCEL Digunakan untuk membatalkan akses ke layar, jadi secara lojik sama halnya dengan kembali ke layar sebelumnya. 3. Command.OK Digunakan untuk mengacu ke jawaban positif atas suatu hal, misalnya konfirmasi untuk menghapus teks dan sebagainya. 4. Command.HELP Digunakan untuk menampilkan fasilitas help pada layar. 5. Command.STOP Digunakan untuk menghentikan suatu proses yang sedang berjalan. 6. Command.EXIT Digunakan untuk keluar dari suatu aplikasi.  prio Merupakan nilai integer yang menjadi prioritas dari perintah yang ada. Nilai prioritas ini harus positif dan dimulai dari angka 1, nilai terendah merupakan nilai prioritas tertinggi. Nilai prioritas ini akan mempengaruhi penempatan suatu perintah di layar. Berikut contoh programnya: //Program EventEx1.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class EventEx1 extends MIDlet implements CommandListener { Display display = null; List menu = null; TextBox input = null; 80 Andino Maseleno
  • 82. Bab 4 –Manajemen Event static final Command backCommand = new Command("Back", Command.BACK, 0); static final Command mainMenuCommand = new Command("Main", Command.SCREEN, 1); static final Command exitCommand = new Command("Exit", Command.STOP, 2); String currentMenu = null; public EventEx1() { } public void startApp() throws MIDletStateChangeException { display = Display.getDisplay(this); menu = new List("Menu Items", Choice.IMPLICIT); menu.append("Item1", null); menu.append("Item2", null); menu.append("Item3", null); menu.append("Item4", null); menu.addCommand(exitCommand); menu.setCommandListener(this); mainMenu(); } public void pauseApp() { display = null; menu = null; input = null; } public void destroyApp(boolean unconditional) { notifyDestroyed(); } void mainMenu() { display.setCurrent(menu); currentMenu = "Main"; } public void prepare() { input = new TextBox("Enter some text: ", "", 5, TextField.ANY); input.addCommand(backCommand); input.setCommandListener(this); input.setString(""); display.setCurrent(input); } public void testItem1() { prepare(); currentMenu = "item1"; } 81 Andino Maseleno
  • 83. Bab 4 –Manajemen Event public void testItem2() { prepare(); currentMenu = "item2"; } public void testItem3() { prepare(); currentMenu = "item3"; } public void testItem4() { prepare(); currentMenu = "item4"; } public void commandAction(Command c, Displayable d) { String label = c.getLabel(); if (label.equals("Exit")) { destroyApp(true); } else if (label.equals("Back")) { if(currentMenu.equals("Item1") || currentMenu.equals("Item2") || currentMenu.equals("Item3") || currentMenu.equals("Item4"); { mainMenu(); } } else { List down = (List)display.getCurrent(); Switch(down.getSelectedIndex()) { case 0: testItem1();break; case 1: testItem2();break; case 2: testItem3();break; case 3: testItem4();break; } } } } Interface ItemStateListener Jika objek-objek berkelas Command (javax.microedition.lcdui.Command) dikaitkan dengan interface CommandListener, ada interface yang lain yang khusus digunakan untuk menangani event yang terjadi pada objek-objek yang biasa ditempatkan pada sebuah form semacam ChoiceGroup, DateField, Gauge, dan TextField. Jadi event yang dimaksud di sini adalah ketika terjadi hal-hal 82 Andino Maseleno
  • 84. Bab 4 –Manajemen Event berikut:  Pengguna mengubah pilihan pada ChoiceGroup.  Pengguna mengubah nilai pada Gauge yang ditetapkan interaktif.  Pengguna mengubah data pada TextField.  Pengguna memasukkan atau mengubah informasi tanggal dan atau waktu pada DateField. Kelas yang berkaitan dengan interface ini adalah kelas Item (javax.microedition.lcdui.Item) yang merupakan superkelas dari sebuah objek yang bisa ditempatkan pada sebuah form. Superkelas Item ini menyediakan fungsi getLabel() yang diturunkan ke semua subkelasnya yakni sebagai berikut:  public string getLabel() Menghasilkan string label dari objek Item yang bersangkutan. Fungsi tersebut penting untuk menentukan jenis aksi yang akan dilakukan oleh aplikasi. Selayaknya sebuah interface, objek yang mengimplementasikan suatu interface harus mengimplementasikan fungsi-fungsi yang ada di dalam interface tersebut. Interface ItemStateListener hanya menyediakan 1 buah fungsi yang harus diimplementasikan oleh kelas yang mengimplementasikannya yakni:  public void itemStateChanged(Item t) Selain itu form yang akan mengimplementasikan interface ini harus memanggil fungsi setItemStateListener(Listener t). Berikut contoh programnya: //Program itemChange.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class itemChange extends MIDlet implements ItemStateListener { private Display display; private Form f; private TextBox t; private DateField d; public itemChange() { } public void startApp() { f = new Form("Informasi Waktu"); d = new DateField("Today's date", DateField.DATE); f.append(d); 83 Andino Maseleno
  • 85. Bab 4 –Manajemen Event f.setItemStateListener(this); Display.getDisplay(this).setCurrent(f); } public void pauseApp() {} public void destroyApp (boolean unconditional) {} public void itemStateChanged(Item t) { StringItem s = new StringItem("","Anda telah memasukkan info tanggal"); f.append(s); } } Penanganan Level Rendah untuk Event Penanganan event pada level tinggi digunakan pada komponen-komponen GUI level tinggi semacam TextBox, Gauge, dan ChoiceGroup. Penanganan event level rendah digunakan pada komponen GUI level rendah, yakni dengan kelas Canvas. Berikut contoh programnya: //Program pindahKotak.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class pindahKotakCanvas extends Canvas { private int x = 0; private int y = 0; private int w = 10; private int h = 10; public void paint (Graphics g) { g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(23,0,0); g.fillRect(x,y,w,h); } protected void keyPressed(int Keycode) { int action = getGameAction(Keycode); if(action == RIGHT) { x+=w; } else if(action == LEFT) { x-=w; } else if(action == DOWN) { 84 Andino Maseleno
  • 86. Bab 4 –Manajemen Event y+=h; } else if(action == UP) { y-=h; } if(x<0) { x=0; } if(y<0) : y=0; } if((x+w)>=getWidth()) { x=getWidth()-w; } if((y+h)>=getHeight()) { y=getHeight()-y; } repaint(); } }; public class pindahKotak extends MIDlet { private Display display; public pindahKotak() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new pindahKotakCanvas(); display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } Dalam penanganan event pada level rendah tidak disediakan interface khusus sebagaimana penanganan event pada level tinggi, namun digunakan fungsi-fungsi yang disediakan oleh kelas Canvas (javax.microedition.lcdui.Canvas) itu sendiri, yakni:  protected void keyPressed(int keyCode) Fungsi ini digunakan untuk mendeteksi sebuah tombol sedang ditekan. 85 Andino Maseleno
  • 87. Bab 4 –Manajemen Event  protected void keyReleased(int keyCode) Fungsi ini digunakan untuk mendeteksi sebuah tombol selesai ditekan.  protected void keyRepeated(int keyCode) Fungsi ini digunakan untuk mendeteksi sebuah tombol ditekan secara terus menerus.  protected void pointerPressed(int x, int y)  protected void pointerDragged(int x, int y)  protected void pointerReleased(int x, int y) Namun tidak semua fungsi di atas bisa diimplementasikan pada semua emulator dan perangkat aslinya, misalnya pointerPressed(), pointerDragged(), dan pointerReleased() yang tidak selalu tersedia pada sebuah perangkat. Demikian pula dengan keyRepeated () yang juga tidak selalu tersedia pada sebuah perangkat, sehingga perlu melakukan pengecekan terlebih dahulu dengan fungsi-fungsi berikut:  public boolean hasPointerEvents()  public boolean hasPointerMotionsEvents()  public boolean hasRepeatEvents() Fungsi pertama digunakan untuk memeriksa apakah sebuah perangkat mendukung adanya masukan pointer (sejenis touch screen pada Palm dan PocketPC) atau tidak, dan berkaitan dengan dimungkinkannya penggunaan fungsi pointerPressed() dan pointerReleased() pada sebuah perangkat. Fungsi kedua, yakni hasPointerMotionEvents() berkaitan dengan dimungkinkannya atau tidak dimungkinkannya penggunaan fungsi pointerDragged(). Fungsi ketiga berkaitan dengan dimungkinkannya atau dimungkinkannya penggunaan fungsi keyRepeated() pada perangkat yang menjalankan MIDlet. Definsi Kunci Masukan pada Kelas Canvas Pada kelas Canvas telah disediakan konstanta-konstanta yang penting untuk mengenali jenis masukan yang diberikan oleh pengguna. Konstanta-konstanta ini merupakan nilai integer yang terdiri atas nilai-nilai berikut:  KEY_NUM0 Bernilai integer 48, dan dikaitkan dengan tombol angka 0.  KEY_NUM1 Bernilai integer 49, dan dikaitkan dengan tombol angka 1.  KEY_NUM2 86 Andino Maseleno
  • 88. Bab 4 –Manajemen Event Bernilai integer 50, dan dikaitkan dengan tombol angka 2.  KEY_NUM3 Bernilai integer 51, dan dikaitkan dengan tombol angka 3.  KEY_NUM4 Bernilai integer 52, dan dikaitkan dengan tombol angka 4.  KEY_NUM5 Bernilai integer 53, dan dikaitkan dengan tombol angka 5.  KEY_NUM6 Bernilai integer 54, dan dikaitkan dengan tombol angka 6.  KEY_NUM7 Bernilai integer 55, dan dikaitkan dengan tombol angka 7.  KEY_NUM8 Bernilai integer 56, dan dikaitkan dengan tombol angka 8.  KEY_NUM9 Bernilai integer 57, dan dikaitkan dengan tombol angka 9.  KEY_STAR Bernilai integer 42, dan dikaitkan dengan bintang ‘*’.  KEY_POUND Bernilai integer 35, dan dikaitkan dengan tombol angka ‘#’.  UP Bernilai integer 1, dan dikaitkan dengan tombol panah atas.  DOWN Bernilai integer 6, dan dikaitkan dengan tombol panah bawah.  LEFT Bernilai integer 2, dan dikaitkan dengan tombol panah kiri.  RIGHT Bernilai integer 5, dan dikaitkan dengan tombol panah kanan. Fungsi-fungsi pada kelas Canvas yang dikaitkan dengan nilai-nilai konstanta lain yang disediakan adalah:  public int getGameAction(int keyCode) Akan menghasilkan nilai integer yang berkaitan dengan keyCode, yang umumnya diambil dari fungsi-fungsi keyPressed(), keyReleased(), dan sejenisnya. 87 Andino Maseleno
  • 89. Bab 4 –Manajemen Event  public String getKeyName(int keyCode) Akan menghasilkan nama kunci yang berkaitan dengan keyCode yang umumnya diambil dari fungsi-fungsi keyPressed(), keyReleased(), dan sejenisnya.  public int getKeyCode Fungsi kebalikan dari getGameAction(), yang menghasilkan nilai integer keyCode yang berkaitan dengan nilai gameAction yang dihasilkan oleh fungsi getGameAction. Berikut contoh programnya: //Program deteksiTombol.java import javax.microedition.midlet.*; import javax.microedition.lcdui.*; class deteksiTombolCanvas extends Canvas { private String namaTombol = null; private Font f; public void paint(Graphics g) { f = g.getFont(); int tinggiFont = f.getHeight(); g.setColor(255,255,255); g.fillRect(0,0,getWidth(),getHeight()); g.setColor(0x000000); if (namaTombol != null) { g.drawString("Anda menekan:",1,1,g.TOP | g.LEFT); g.drawString(namaTombol,1,1+tinggiFont,g.TOP | g.LEFT); } } protected void keyPressed(int keyCode) { namaTombol = getKeyName(keyCode); repaint(); } }; public class deteksiTombol extends MIDlet { private Display display; public deteksiTombol() { } public void startApp() { display = Display.getDisplay(this); Canvas canvas = new deteksiTombolCanvas(); 88 Andino Maseleno
  • 90. Bab 4 –Manajemen Event display.setCurrent(canvas); } public void pauseApp() { } public void destroyApp(boolean unconditional) { } } 89 Andino Maseleno
  • 91. Bab 5 – Pemrograman Database Bab 5 Pemrograman Database Pada sebuah perangkat handphone berbasis Java yang bisa menjalankan MIDlet, disediakan media untuk penyimpanan yang bersifat non-volatile. Artinya, jika menyimpan pada media yang non-volatile, semacam disket, harddisk, data tersebut tidak akan hilang jika terjadi kehilangan energi listrik. Media penyimpanan non-volatile ini dalam MIDlet dikenal dengan nama RMS (Record Management System). Record Management System (RMS) RMS merupakan implementasi database sederhana untuk digunakan dalam MIDlet Java yang berorientasi record. Jika aplikasi yang dibuat ingin memanfaatkan fasilitas RMS ini, terlebih dahulu harus mengimpor paket yang menyediakan fungsi-fungsi untuk manajemen RMS , yakni javax.microedition.rms.*. Data yang ada di dalam database RMS dikenal dengan istilah RecordStore. Fungsi-fungsi dalam paket javax.microedition.rms.* akan menyediakan fungsi-fungsi untuk menghapus, menambah, mengubah data, dan manipulasi lain pada RecordStore. Fungsi- fungsi dalam javax.microedition.rms.* juga menyediakan mekanisme yang memungkinkan dua atau lebih MIDlet dalam satu aplikasi untuk berbagi data RecordStore. Paket javax.microedition.rms Paket javax.microedition.rms menyediakan fungsi-fungsi untuk mengimplementasikan database RMS pada MIDlet. Paket ini terdiri atas: Interface  RecordComparator Mendefinisikan komparator atau pembanding ketika melakukan komparasi/perbandingan antara dua record dalam RMS.  Record Enumerator Merepresentasikan enumator record yang bersifat bidirectional (dua arah).  RecordFilter Mendefinisikan filter yang digunakan untuk menganalisis sebuah record pada RecordStore, apakah memenuhi suatu kriteria tertentu sesuai dengan filter yang diberikan atau tidak. 90 Andino Maseleno
  • 92. Bab 5 – Pemrograman Database RecordListener Mendeteksi record yang ditambahkan, diubah, atau dihapus dalam sebuah RecordStore. Kelas  RecordStore Merupakan kelas utama yang harus digunakan untuk membuat objek RecordStore Exception  InvalidRecordIDException Jika ditemukan RecordID yang tidak valid, eksepsi ini akan dilemparkan.  RecordStoreException Eksepsi umum yang digunakan jika terjadi kesalahan pada manajemen objek RecordStore.  RecordStoreFullException Jika tempat penyimpanan RecordStore sudah penuh, eksepsi ini akan dilemparkan ke sistem.  RecordStoreNotFoundException Jika tempat penyimpanan RecordStore tidak ditemukan, eksepsi ini akan dilemparkan ke sistem.  RecordStoreNotOpenException Jika tempat penyimpanan RecordStore tidak dibuka (opened), eksepsi ini akan dilemparkan ke sistem. Pemrograman RMS Bagian ini akan membahas hal-hal penting yang perlu diketahui untuk dapat memprogram database pada MIDlet dengan RMS. Kelas RecordStore Database pada MIDlet diimplementasikan dengan RecordStore. Untuk membuat database RecordStore baru, cukup memanggil fungsi statik openRecordStore() seperti di bawah ini: RecordStore obj = RecordStore.openRecordStore(“myDatabase”, true) Parameter pertama pada fungsi openRecordStore adalah nama database yang akan dibuat, sedangkan parameter kedua dapat bernilai true/false, jika ditetapkan true. Ketika RecordStore tidak ditemukan, otomatis akan langsung dibuat. Berikut program untuk membuat database RecordStore: //Program newDatabaseRMS.java 91 Andino Maseleno
  • 93. Bab 5 – Pemrograman Database import javax.microedition.rms.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class newDatabaseRMS extends MIDlet implements CommandListener { private Display display; private Command createCmd = new Command(“Buat”, Command.OK, 1); private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Form f; private TextField t; private RecordStore myDb; private Ticker tck; public newDatabaseRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form(“Pemrograman RMS”); t = new TextField(“Nama RecordStore”, null, 32, TextField.ANY); tck = new Ticker(“”); f.append(t); f.addCommand(createCmd); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); display.setCurrent(f); } public void buatDb() { try{ myDb = RecordStore.openRecordStore(t.getString(), true); tck.setString(“Database “ +t.getString() + “berhasil dibuat”); display.setCurrent(f); } catch (RecordStoreException e) { tck.setString(“Ada kesalahan pembuatan database”); display.setCurrent(f); } } public void keluar() { this.destroyApp(true); } 92 Andino Maseleno
  • 94. Bab 5 – Pemrograman Database public void commandAction(Command c, Displayable d) { String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } else if (lbl.equals(“Buat”)) { buatDb(); } } public void pauseApp() { } public void destroyApp (boolean unconditional) { notifyDestroyed(); } } Menambah Data pada RecordStore Operasi pertama dalam manipulasi database RMS adalah menambah data pada RecordStore. Satu hal yang perlu diketahui adalah, data yang dioperasikan dalam database RMS menggunakan array of bytes, sehingga akan digunakan kelas-kelas berikut untuk membungkus data menjadi array of bytes (larik bit data):  DataInputStream  DataOutputStream  ByteArrayInputStream  ByteArrayOutputStream Kelas-kelas di atas disediakan pada paket java.io. Fungsi pada kelas RecordStore yang digunakan untuk menambah data adalah sebagai berikut:  public void addRecord(byte[] data, int offset, int length) data : larik bit data yang akan ditambahkan ke RecordStore offset : index awal larik data yang akan ditambahkan length : panjang bit data yang akan ditambahkan Jika terjadi kesalahan, ada empat kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:  RecordStoreNotOpenException Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)  RecordStoreFullException 93 Andino Maseleno
  • 95. Bab 5 – Pemrograman Database Terjadi jika RecordStore sudah tidak bisa ditambah lagi datanya.  RecordStoreException Terjadi kesalahan pada RecordStore di luar dua hal di atas.  NullPointerException Jika bit datanya null, namun length lebih besar daripada nol Program di bawah ini digunakan untuk menambah data pada RecordStore pada MIDlet //Program tambahDataRMS.java import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class tambahdataRMS extends MIDlet implements CommandListener { private Display display; private Command openCmd = new Command(“Buka DB”, Command.OK, 1); private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Command addCmd = new Command(“Tambahkan, Command.OK, 1); private Form f, f2; private TextField t, t2; private RecordStore myDb; private Ticker tck; public tambahDataRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form(“Tambah data RMS”); t = new TextField(“Nama RecordStore”, null, 32, TextField.ANY); tck = new Ticker(“”); f.append(t); f.addCommand(openCmd); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); display.setCurrent(f); } public void tambahData() { f2 = new Form (“Tambah data pada “ +t.getString()); 94 Andino Maseleno
  • 96. Bab 5 – Pemrograman Database t2 = new TextField(“Data ?”, null, 256, TextField.ANY); f2.append(t2); f2.addCommand(addCmd); f2.addCommand(exitCmd); f2.setCommandListener(this); f2.setTicker(tck); display.setCurrent(f2); } public void tambahkan() { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(t2.getString()); byte[] b = baos.toByteArray(); myDb.addRecord(b, 0, b.length); tck.setString(“Data berhasil ditambahkan”); display.setCurrent(f2); } catch (IOException e) { tck.setString(“Ada kesalahan I/O”); display.setCurrent(f2); } catch (RecordStoreFullException e) { tck.setString(“Record Store sudah penuh); display.setCurrent(f2); } catch (RecordStoreNotOpenException e) { } catch (RecordStoreException e) { } } public void bukaDb() { try { myDb = RecordStore.OpenRecordStore(t.getString(), false); tck.setString(“Database “ +t.getString() +” berhasil dibuka”); tambahData(); } catch (RecordStoreNotFoundException e) { tck.setString(“Tidak ditemukan database yang dimaksud”); display.setCurrent(f); } catch (RecordStoreException e) { } } public void keluar() { try { 95 Andino Maseleno
  • 97. Bab 5 – Pemrograman Database myDb.closeRecordStore(); this.destroyApp(true); } catch (RecordStoreNotOpenException e) { System.out.println(“Gagal tutup Record Store”); } catch (RecordStoreException e) { } catch (NullPointException e) { this.destroyApp(true); } } public void commandAction(Command c, Displayable d) { String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } else if (lbl.equals(“Buka DB”)) { bukaDb(); } else if (lbl.equals(“Tambahkan”)) { tambahkan(); } } public void pauseApp () { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } } Program di atas akan menampilkan masukan informasi database yang telah dibuat dengan contoh MIDlet pertama pada bab ini, kemudian akan melakukan penambahan data sesuai dengan yang diinginkan. RecordID merupakan primary key atau nomor unik sebagai penanda dari suatu record. RecordID dalam sebuah RecordStore merupakan sebuah nilai integer diawali dengan nomor satu dan bersifat autoincrement, yakni record berikutnya akan selalu memiliki nilai RecordID = nilai RecordAD sebelumnya + 1. Mengambil Data dari RecordStore Operasi kedua dalam manipulasi database RMS adalah mengambil data dari ReordStore. Seperti yang telah diketahui sebelumnya, data dalam RecordStore disimpan dalam bentuk array of bytes, sehingga umumnya akan dilakukan hal berikut untuk mengubahnya menjadi objek String 96 Andino Maseleno
  • 98. Bab 5 – Pemrograman Database biasa. ByteArrayInputStream bais = new ByteArrayInputStream(record); DataInputStream dis = new DataInputStream(bais); String in = dis.readUTF(); Record adalah bit yang dibaca dari RecordStore yang bersangkutan. Adapun fungsi-fungsi yang digunakan untuk membaca dari RecordStore yang disediakan oleh kelas javax.microedtion.rms.RecordStore adalah:  public byte[] getRecord(int RecordID) RecordID: nomor RecordID yang akan diambil darinya. Jika terjadi kesalahan, ada tiga kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:  RecordStoreNotOpenException Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)  InvalidRecordIDException Terjadi jika RecordID yang diberikan tidak valid  RecordStoreException Terjadi jika kesalahan pemrosesan RecordStore di luar kesalahan di atas. Untuk mendapatkan jumlah data dalam RecordStore, dapat digunakan fungsi getNumRecords() sebagai berikut:  public int getNumRecords() Jika terjadi kesalahan ada satu kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni :  RecordStoreNotOpenException Terjadi jika RecordStore tidak dalam keadaan terbuka (opened). Agar lebih mengerti, coba perhatikan contoh program MIDlet berikut ini: //Program tampilDataRMS.java import javax.microedition.rms; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class tampilDataRMS extends MIDlet implements CommandListener { private Display display; private Command openCmd = new Command(“Tampilkan”, Command.OK, 1); private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); 97 Andino Maseleno
  • 99. Bab 5 – Pemrograman Database private Command backCmd = new Command(“Kembali”, Command.EXIT, 2); private Form f, f2; private TextField t, t2; private RecordStore myDb; private Ticker tck; public tampilDataRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form(“ Tampilkan data “); t = new TextField(“Nama Record Store”, null, 32, TextField.ANY); tck = new Ticker(“”); f.append(t); f.addCommand(openCmd); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); display.setCurrent(f); } public void tampilkan() { try { f2 = new Form(“Datanya “); ChoiceGroup dt = new ChoiceGroup(“”, Choice.EXCLUSIVE); f2.addCommand(backCmd); f2.setCommandListener(this); f2.append(dt); ByteArrayInputStream bais; DataInputStream dis; String in; //Baca seluruh data dalam database for (int i=1; i<myDb.getNumRecords(); i++) { bais = new ByteArrayInputStream(myDb.getRecord(i)); dis = new DataInputStream(bais); in = dis.readUTF(); dt.append(in, null); } display.setCurrent(f2); } catch (IOException e) { tck.setString(“Ada kesalahan I/O”); display.setCurrent(f2); 98 Andino Maseleno
  • 100. Bab 5 – Pemrograman Database } catch (RecordStoreNotOpenException e) { tck.setString(“Ada kesalahan RecordStore”); display.setCurrent(f2); } } public void kembali() { tck.setString(“”); display.setCurrent(f); } public void bukaDb() { try { myDb = RecordStore.openRecordStore(t.getString(), false); tck.setString(“Database “ +t.getString() + “berhasil dibuka”); tampilkan(); } catch (RecordStoreNotFoundException e) { tck.setString(“Tidak ditemukan database yang dimaksud”); display.setCurrent(f); } catch (RecordStoreException e) { } } public void keluar() { //tutup database terlebih dahulu try { myDb.closeRecordStore(); this.destroyApp(true); } catch (RecordStoreNotOpenException e) { System.out.println(“Gagal tutup Record Store”); } catch (RecordStoreException e) { } catch (NullPointerException e) { This.destroyApp(true); } } public void commandAction(Command c, Displayable d) { String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } else if (lbl.equals(“Tampilkan”)) { bukaDb(); } else if (lbl.equals(“Kembali”)) { kembali(); 99 Andino Maseleno
  • 101. Bab 5 – Pemrograman Database } } public void pauseApp() { //Tidak melakukan apa-apa } public void destroyApp (boolean unconditional) { notifyDestroyed(); } } Menghapus Data dari RecordStore Operasi ketiga dalam manipulasi database RMS adalah menghapus data dari RecordStore. Adapun fungsi-fungsi yang digunakan untuk menghapus data dari RecordStore yang disediakan oleh kelas javac.microedition.rms.RecordStore adalah:  public void deleteRecord(int RecordID) RecordID : nomor RecordID yang akan diambil datanya Jika terjadi kesalahan, ada tiga kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:  RecordStoreNotOpenException Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)  InvalidRecordIDException Terjadi jika RecordID yang diberikan tidak valid  RecordStoreException Terjadi jika kesalahan pemrosesan RecordStore di luar kesalahan di atas Untuk mendapatkan informasi RecordId, bisa digunakan prosedur yang sama dengan prosedur yang digunakan untuk menampilkan data yang telah dijelaskan sebelumnya. Berikut program menghapus data pada RecordStore pada MIDlet: //program hapusDataRMS.java import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class hapusDataRMS extends MIDlet implements CommandListener { private Display display; 100 Andino Maseleno
  • 102. Bab 5 – Pemrograman Database private Command openCmd = new Command(“Buka”, Command.OK, 1); private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Command backCmd = new Command(“Kembali”, Command.EXIT, 1); private Command hapusCmd = new Command(“Hapus”, Command.OK, 1); private Form f, f2; private TextField t, t2; private RecordStore myDb; private Ticker tck; private ChoiceGroup dt; public hapusDataRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form(“Hapus data”); t = new TextField(“Nama Record Store”, null, 32, TextField.ANY); tck = new Ticker(“”); f.append(t); f.addCommand(openCmd); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); display.setCurrent(f); } public void tampilkan() { try { f2 = new Form(“Datanya”); dt = new ChoiceGroup(“”, Choice.EXCLUSIVE); f2.addCommand(backCmd); f2.addCommand(hapusCmd); f2.setCommandListener(this); f2.append(dt); ByteArrayInputStream bais; DataInputStream dis; String in; RecordEnumeration enum = myDb.enumerateRecords(null, null, false); while(enum.hasNextElement()) { int recId = enum.nextRecordId(); bais = new ByteArrayInputStream(myDb.getRecord(recId)); dis = new DataInputStream(bais); in = dis.readUTF(); 101 Andino Maseleno
  • 103. Bab 5 – Pemrograman Database in = in + “ ( “ + (new Integer(recId)).toString() + “)”; dt.append(in, null); } display.setCurrent(f2); } catch (IOException e) { tck.setString(“Ada kesalahan I/O”); display.setCurrent(f2); } catch (RecordStoreNotOpenException e) { } catch (RecordStoreException e) { tck.setString(“Ada kesalahan RecordStore”); display.setCurrent(f2); } } public void kembali() { tck.setString(“”); display.setCurrent(f); } public void hapusData() { try { String strData = dt.getString(dt.getSelectedIndex()); ByteArrayInputStream bais; DataInputStream dis; String in; RecordEnumeration enum = myDb.enumerateRecords(null, null, false); while (enum.hasNextElement()) { int recId = enum.nextRecordId(); bais = new ByteArrayInputStream(myDb.getRecord(recId)); dis = new DataInputStream(bais); in = dis.readUTF(); in = in + “(“ + (new Integer(recId)).toString() + “)”; if (in.equals(strData)) { myDb.deleteRecord(recId); break; } } tampilkan(); } catch (IOException e) { tck.setString(“Ada kesalahan I/O”); display.setCurrent(f2); } catch (RecordStoreNotOpenException e) { 102 Andino Maseleno
  • 104. Bab 5 – Pemrograman Database } catch (RecordStoreException e) { tck.setString(“Ada kesalahan RecordStore”); display.setCurrent(f2); } } public void bukaDb() { try { myDb = RecordStore.OpenRecordStore(t.getString(), false); tck.setString(“Database “ + t.getString() + “berhasil dibuka”); tampilkan(); } catch (RecordStoreNotFoundException e) { tck.setString(“Tidak ditemukan database yang dimaksud”); display.setCurrent(f); } catch (RecordStoreException e) { } } public void keluar() { try { myDb.closeRecordStore(); this.destroyApp(true); } catch (RecordStoreNotOpenException e) { System.out.println(“Gagal tutup Record Store”); } catch (RecordStoreException e) { } catch (NullPointerException e) { this.destroyApp(true); } } public void commandAction (Command c, Displayable d) { String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } else if (lbl.equals(“Tampilkan”)) { bukaDb(); } else if (lbl.equals(“Kembali”)) { kembali(); } } public void pauseApp() { } public void destroyApp (boolean unconditional) { 103 Andino Maseleno
  • 105. Bab 5 – Pemrograman Database notifyDestroyed(); } } Mengganti Data dari RecordStore Operasi keempat dalam manipulasi database RMS adalah mengganti data dari RecordStore. Adapun fungsi-fungsi yang digunakan untuk mengganti data dari RecordStore yang disediakan oleh kelas javax.microedition.rms.RecordStore adalah:  public void setRecord(int RecordID, byte[] data, int offset, int length) data: larik bit data yang akan ditambahkan ke RecordStore offset: index awal larik data yang akan ditambahkan length: panjang bit data yang akan ditambahkan RecordID: nomor record ID yang akan diubah datanya Jika terjadi kesalahan, ada empat kemungkinan eksepsi yang dilemparkan oleh fungsi ini, yakni:  RecordStoreNotOpenException Terjadi jika RecordStore tidak dalam keadaan terbuka (opened)  RecordStoreFullException Terjadi jika RecordStore sudah tidak bisa ditambah lagi datanya  RecordStoreException Terjadi kesalahan pada RecordStore di luar dua hal di atas  InvalidRecordIDException Jika record ID tidak valid Untuk mendapatkan informasi RecordId, bisa digunakan prosedur yang sama dengan prosedur yang digunakan untuk menampilkan data. Berikut contoh program untuk mengganti data pada RecordStore pada MIDlet: //Program gantiDataRMS.java import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class gantiDataRMS extends MIDlet implements CommandListener { private Display display; 104 Andino Maseleno
  • 106. Bab 5 – Pemrograman Database private Command openCmd = new Command(“Buka”, Command.OK, 1); private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Command backCmd = new Command(“Kembali”, Command.EXIT, 1); private Command gantiCmd = new Command(“Ganti”, Command.OK, 1); private Command prosesGantiCmd = new Command(“Proses”, Command.OK, 1); private Form f, f2, f3; private TextField t, t2, t3; private RecordStore myDb; private Ticker tck; private ChoiceGroup dt; public gantiDataRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form(“Ganti data”); t = new TextField(“Nama Record Store”, null, 32, TextField.ANY); tck = new Ticker(“”); f.append(t); f.addCommand(openCmd); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); display.setCurrent(f); } public void tampilkan() { try { f2 = new Form(“Datanya”); dt = new ChoiceGroup(“”, Choice.EXCLUSIVE); f2.addCommand(backCmd); f2.addCommand(gantiCmd); f2.setCommandListener(this); f2.append(dt); ByteArrayInputStream bais; DataInputStream dis; String in; RecordEnumeration enum = myDb.enumerateRecords(null, null, false); while(enum.hasNextElement()) { 105 Andino Maseleno
  • 107. Bab 5 – Pemrograman Database int recId = enum.nextRecordId(); bais = new ByteArrayInputStream(myDb.getRecord(recId)); dis = new DataInputStream(bais); in = dis.readUTF(); in = in + “(“ + (new Integer(recId)).toString() + “)”; dt.append(in, null); } display.setCurrent(f2); } catch (IOException e) { tck.setString(“Ada kesalahan I/O”); display.setCurrent(f2); } catch (RecordStoreNotOpenException e) { } catch (RecordStoreException e) { tck.setString(“Ada kesalahan RecordStore”); display.setCurrent(f2); } } public void kembali() { tck.setString(“”); display.setCurrent(f); } public void formGantiData() { f3 = new Form(“Data Baru : “); t3 = new TextField(null, null, 256, TextField.ANY); f3.append(t3); f3.addCommand(prosesGantiCmd); f3.addCommand(backCmd); f3.setCommandListener(this); display.setCurrent(f3); } public void gantiData() { try { //Ambil informasi data yang dipilih untuk diganti String strData = dt.getString(dt.getSelectedIndex()); ByteArrayInputStream bais; DataInputStream dis; String in; int recId; RecordEnumeration enum = myDb.enumerateRecords(null, null, false); while(enum.hasNextElement()) { recId = enum.nextRecordId(); 106 Andino Maseleno
  • 108. Bab 5 – Pemrograman Database bais = new ByteArrayInputStream(myDb.getRecord(recId)); dis = new DataInputStream(bais); in = dis.readUTF(); in = in + “(“ + (new Integer(recId)).toString() + “)”; if (in.equals(strData)) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF(t3.getString()); byte[] b = baos.toByteArray(); myDb.setRecord(recId, b, 0, b.length); break; } } tampilkan(); } catch (IOException e) { tck.setString(“Ada kesalahan I/O”); display.setCurrent(f2); } catch (RecordStoreNotOpenException e) { } catch (RecordStoreException e) { tck.setString(“Ada kesalahan RecordStore”); display.setCurrent(f2); } } public void bukaDb(){ try{ myDb = RecordStore.openRecordStore(t.getString(),false); tck.setString(“Database “ +t.getString() + “berhasil dibuka”); tampilkan(); } catch(RecordStoreNotFoundException e) { tck.setString(“Tidak ditemukan database yang dimaksud”); display.setCurrent(f); } catch (RecordStoreException e) { } } public void keluar() { try{ myDb.closeRecordStore(); this.destroyApp(true); } catch (RecordStoreNotOpenException e) { 107 Andino Maseleno
  • 109. Bab 5 – Pemrograman Database System.out.println(“Gagal tutup Record Store”); } catch(RecordStoreException e) { } catch(NullPointerException e) { this.destroyApp(true; } } public void CommandAction(Command c, Displayable d) { String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } else if (lbl.equals(“Buka”)) { bukaDb(); } else if (lbl.equals(“Kembali”)) { kembali(); } else if (lbl.equals(“Ganti”)) { formGantiData(); } else if (lbl.equals(“Proses”)) { gantiData(); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } } Proses penggantian data ini caranya sama dengan cara yang digunakan untuk menambahkan data baru pada RecordStore, hanya saja dibutuhkan informasi nomor RecordID yang akan diubah datanya. Menampilkan Daftar RecordStore Untuk menampilkan informasi RecordStore yang ada dalam sistem , bisa digunakan fungsi berikut:  public static String[] listRecordStores() Fungsi ini menghasilkan list dari RecordStore yang ada. Jika tidak ada RecordStore maka akan dikembalikan nilai null. Contoh penggunaan fungsi listRecordStores() adalah sebagai berikut: 108 Andino Maseleno
  • 110. Bab 5 – Pemrograman Database //Program informasiRMS.java import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class informasiRMS extends MIDlet implements CommandListener { private Display display; private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Form f, f2; private TextField t, t2; private RecordStore myDb; private Ticker tck; private ChoiceGroup dt; public informasiRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form(null); dt = new ChoiceGroup(“Daftar Database”, Choice.EXCLUSIVE); tck = new Ticker(“Informasi RMS”); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); tampilkan(); display.setCurrent(f); } public void tampilkan() { String allDbs[] = RecordStore.listRecordStores(); for (int i=0; i<allDbs.length; i++) { dt.append(allDbs[i], null); } f.append(dt); } public void keluar() { this.destroyApp(true); } public void commandAction(Command c, Displayable d) { 109 Andino Maseleno
  • 111. Bab 5 – Pemrograman Database String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } } Menghapus RecordStore Untuk menghapus RecordStore yang ada dalam sistem, bisa digunakan fungsi sebagai berikut:  public void static deleteRecordStore(String name) Parameter name merupakan nama RecordStore yang akan dihapus. Jika terjadi kesalahan, ada dua kemungkinan eksepsi yang akan dilemparkan, yakni:  RecordStoreNotFoundException Terjadi jika RecordStore tidak ketemu  RecordStoreException Terjadi kesalahan pada RecordStore di luar dua hal di atas Berikut contoh program untuk menampilkan daftar database/RecordStore yang ada untuk bisa dihapus : //Program hapusDatabaseRMS.java import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; public class hapusDatabaseRMS extends MIDlet implements CommandListener { import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; 110 Andino Maseleno
  • 112. Bab 5 – Pemrograman Database public class hapusDatabaseRMS extends MIDlet implements CommandListener { private Display display; private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Command hapusCmd = new Command(“Hapus”, Command.OK, 1); private Form f, f2; private TextField t, t2; private RecordStore myDb; private Ticker tck; private ChoiceGroup dt; public hapusDatabaseRMS() { } public void startApp() { display = Display.getDisplay(this); f = new Form (null); tck = new Ticker(“Informasi RMS”); f.addCommand(exitCmd); f.addCommand(hapusCmd); f.setCommandListener(this); f.setTicker(tck); String allDbs[] = RecordStore.listRecordStores(); dt = new ChoiceGroup(“Daftar Database”, Choice.EXCLUSIVE); for (int i=0; i<allDbs.length; i++) { dt.append(allDbs[i], null); } f.append(dt); display.setCurrent(f); } public void hapusDb() { try { String dbName = dt.getString(dt.getSelectedIndex()); dt.delete(dt.getSelectedIndex()); RecordStore.deleteRecordStore(dbName); tck.setString(“Database “ + dbName + “telah dihapus”); display.setCurrent(f); } } public void keluar() { this.destroyApp(true); } public void CommandAction (Command c, Displayable d) { 111 Andino Maseleno
  • 113. Bab 5 – Pemrograman Database String lbl = c.getLabel(); if (lbl.equals(“Keluar”)) { keluar(); } else if (lbl.equals(“Hapus”)) { hapusDb(); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { notifyDestroyed(); } } 112 Andino Maseleno
  • 114. Bab 6 – Aplikasi J2ME dengan PHP Bab 6 Aplikasi J2ME dengan PHP PHP (Hypertext Preprosessor) adalah bahasa server-side scripting yang menyatu dengan tag-tag HTML dan dieksekusi di server untuk membuat halaman Web dinamis. Maksud dari server- side scripting adalah sintaks dan perintah-perintah yang berikan akan sepenuhnya dijalankan di server tetapi disertakan pada dokumen HTML biasa. Pembuatan Web ini merupakan kombinasi antara PHP sendiri sebagai bahasa pemrograman dan HTML sebagai pembangun halaman Web. Ketika pengunjung membuka halaman Web, server akan memproses perintah PHP dan lalu mengirim hasilnya ke browser pengunjung. PHP merupakan software yang Open Source dan mampu lintas platform. PHP mampu berjalan di Windows NT dan beberapa versi UNIX, dan dapat dibangun sebagai modul pada Web Server Apache. PHP menawarkan koneksitas yang baik dengan beberapa database antara lain Oracle, Mysql, dBase, Unix dbm dan tak terkecuali semua database berantarmuka ODBC. PHP juga mendukung komunikasi dengan layanan lain melalui protokol HTTP. Apabila PHP berada dalam halaman Web, maka tidak lagi dibutuhkan pengembangan lingkungan khusus atau direktori khusus. Hampir seluruh aplikasi berbasis Web dapat dibuat dengan PHP. Namun kekuatan utama adalah konektivitas database dengan Web. Dengan kemampuan ini akan mempunyai suatu sistem database yang dapat diakses dari Web. Ada tiga cara penulisan script PHP, yaitu: 1. <? Script PHP ?> 2. <?php Script PHP ?> 3. <script language = “php”> Script PHP </script> Web Server Web server bertugas untuk melayani permintaan browser terhadap halaman web atau dokumen lainya. Biasanya dijalankan sebagai suatu Daemon atau Service yang siap melayani setiap 113 Andino Maseleno
  • 115. Bab 6 – Aplikasi J2ME dengan PHP permintaan bila dibutuhkan. Pada umumnya Web server yang ada memiliki dukungan terhadap PHP, sehingga memungkinkan dihasilkan halaman web yang bersifat dinamis. Beberapa Web server yang sering digunakan antara lain PWS 4.0+(isapi), PWS 4.0+(cgi), Apache, Xitami, IIS 4.0. MySQL MySQL adalah multi user data base yang menggunakan bahasa Structured Query Language (SQL). MySQL dalam operasi client-server melibatkan server daemon MySQL disisi server dan berbagai macam program serta library yang berjalan disisi client. MySQL mampu menangani data yang cukup besar. Perusahaan pengembang MySQL yaitu TcX, mengaku mampu menyimpan data lebih dari 40 data base, 10.000 tabel dan sekitar 7 juta baris, totalnya kurang lebih 100 Gigabytes data. SQL adalah bahasa standar yang digunakan untuk mengakses server data base. Bahasa ini pada awalnya dikembangkan IBM, namun telah diadopsi dan digunakan sebagai standar industri. Dengan menggunakan SQL, proses akses data base menjadi lebih user-friendly dibandingkan dengan menggunakan dBASE atau Clipper yang masih menggunakan perintah-perintah pemrograman. Dalam konteks bahasa SQL, pada umumnya informasi tersimpan dalam tabel-tabel yang secara logik merupakan stuktur dua dimensi yang terdiri atas baris-baris data yang berada dalam satu atau lebih kolom. Baris pada tabel sering disebut sebagai instance dari data, sedangkan kolom sering disebut sebagai attributes atau field. Keseluruhan tabel itu dihimpun dalam satu kesatuan yang disebut data base. Berikut contoh programnya: 1. Simple HTTP Fetch J2ME Source Code: import java.io.*; import javax.microedition.io.*; import javax.microedition.lcdui.*; import javax.microedition.midlet.*; public class SimpleFetch extends MIDlet { private Display display; String url = "http://127.0.0.1/midlet/helloworld.txt"; 114 Andino Maseleno
  • 116. Bab 6 – Aplikasi J2ME dengan PHP public SimpleFetch() { display = Display.getDisplay(this); } public void startApp() { try { getViaStreamConnection(url); } catch (IOException e) { //Handle Exceptions any other way you like. System.out.println("IOException " + e); e.printStackTrace(); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { } /** * Read URL as Stream */ void getViaStreamConnection(String url) throws IOException { StreamConnection streamConnection = null; InputStream inputStream = null; StringBuffer b = new StringBuffer(); TextBox textBox = null; try { streamConnection = (StreamConnection)Connector.open(url); inputStream = streamConnection.openInputStream(); int ch; while((ch = inputStream.read()) != -1) { b.append((char) ch); } textBox = new TextBox("Simple URL Fetch", b.toString(), 1024, 0); } finally { if(inputStream != null) { inputStream.close(); } if(streamConnection != null) { streamConnection.close(); } } display.setCurrent(textBox); 115 Andino Maseleno
  • 117. Bab 6 – Aplikasi J2ME dengan PHP } } 2. Simple HTTP Get J2ME Source Code: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; import javax.microedition.io.*; import org.ksoap.*; import org.ksoap.transport.*; import org.ksoap.SoapObject; public class SimpleWebService extends javax.microedition.midlet.MIDlet { private Display display; private String url = http://127.0.0.1/midlet/webservice/service.php; TextBox textbox = null; public SimpleWebService() { display = Display.getDisplay(this); } public void startApp() { try { testWebService(); } catch (Exception ex) { System.out.println(ex); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void testWebService() throws Exception { StringBuffer stringBuffer = new StringBuffer(); TextBox textBox = null; // First WebService - echos name that is passed in, in this case 'Andino' SoapObject client = new SoapObject(url,"hello"); 116 Andino Maseleno
  • 118. Bab 6 – Aplikasi J2ME dengan PHP client.addProperty("name","Andino"); HttpTransport ht = new HttpTransport(url,"hello"); stringBuffer.append(ht.call(client)); // 2nd WebService - Supply 2 numbers and the result is the sum of the // two numbers client = new SoapObject(url,"add"); client.addProperty("x","7"); client.addProperty("y","6"); ht = new HttpTransport(url,"add"); stringBuffer.append("nAdd Result: " + ht.call(client)); // display results in textbox textBox = new TextBox("Simple WebService Test", stringBuffer.toString(), 1024, 0); display.setCurrent(textBox); } } PHP Source Code: <?php $response = "Hello"; if (isset($_GET)) { switch ($_GET["type"]) { case 1: $response = "Good Morning"; break; case 2: $response = "Good Afternoon"; break; case 3: $response = "Good Evening"; break; default: $response = "Hello"; break; } } echo $response; ?> 3. Simple Web Service J2ME Source Code: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; import javax.microedition.io.*; import org.ksoap.*; 117 Andino Maseleno
  • 119. Bab 6 – Aplikasi J2ME dengan PHP import org.ksoap.transport.*; import org.ksoap.SoapObject; public class SimpleWebService extends javax.microedition.midlet.MIDlet { private Display display; private String url = "http://127.0.0.1/midlet/webservice/service.php"; TextBox textbox = null; public SimpleWebService() { display = Display.getDisplay(this); } public void startApp() { try { testWebService(); } catch (Exception ex) { System.out.println(ex); } } public void pauseApp() { } public void destroyApp(boolean unconditional) { } public void testWebService() throws Exception { StringBuffer stringBuffer = new StringBuffer(); TextBox textBox = null; // First WebService - echos name that is passed in, in this case 'Andino' SoapObject client = new SoapObject(url,"hello"); client.addProperty("name","Andino"); HttpTransport ht = new HttpTransport(url,"hello"); stringBuffer.append(ht.call(client)); // 2nd WebService - Supply 2 numbers and the result is the sum of the // two numbers client = new SoapObject(url,"add"); client.addProperty("x","7"); client.addProperty("y","6"); ht = new HttpTransport(url,"add"); stringBuffer.append("nAdd Result: " + ht.call(client)); 118 Andino Maseleno
  • 120. Bab 6 – Aplikasi J2ME dengan PHP // display results in textbox textBox = new TextBox("Simple WebService Test", stringBuffer.toString(), 1024, 0); display.setCurrent(textBox); } } PHP Source Code: <?php // include NuSOAP library require_once('nusoap.php'); // Create Web Service Server $server = new soap_server; // Register Services $server->register('hello'); $server->register('add'); // Define Services function hello ($name){ return "Hello $name"; } function add ($x,$y){ return $x + $y; } $server->service($HTTP_RAW_POST_DATA); ?> 4. Simple Image Fetch J2ME Source Code: import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import java.io.*; public class SimpleImageFetch extends MIDlet { private Display display; private String URL = "http://127.0.0.1/midlet/image/test.php"; private Form formImage; public SimpleImageFetch() { 119 Andino Maseleno
  • 121. Bab 6 – Aplikasi J2ME dengan PHP try { display = Display.getDisplay(this); Image im = getImage(URL); formImage = new Form("Simple Image Test"); formImage.append(im); display.setCurrent(formImage); } catch (Exception ex) { System.out.println(ex); } } public void startApp() { } public void pauseApp() { } public void destroyApp(boolean unconditional) { } private Image getImage(String url) throws IOException { ContentConnection connection = (ContentConnection) Connector.open(url); DataInputStream iStrm = connection.openDataInputStream(); Image im = null; try { byte imageData[]; ByteArrayOutputStream bStrm = new ByteArrayOutputStream(); int ch; while ((ch = iStrm.read()) != -1) bStrm.write(ch); imageData = bStrm.toByteArray(); bStrm.close(); im = Image.createImage(imageData, 0, imageData.length); } finally { if (iStrm != null) iStrm.close(); if (connection != null) connection.close(); } return (im == null ? null : im); } } PHP Source Code: <?php $filename = "./phpjava.png"; 120 Andino Maseleno
  • 122. Bab 6 – Aplikasi J2ME dengan PHP $handle = fopen ($filename, "rb"); $contents = fread ($handle, filesize ($filename)); fclose ($handle); header("Content-type: image/gif"); header("Content-length: ".(string)(filesize($filename))); echo $contents ?> 121 Andino Maseleno
  • 123. Bab 7 – Aplikasi XML dengan J2ME Bab 7 Aplikasi XML dengan J2ME XML XML kependekan dari eXtensible Markup Language, dikembangkan mulai tahun 1996 dan mendapatkan pengakuan dari W3C pada bulan Februari 1998. Teknologi yang digunakan pada XML sebenarnya bukan teknologi baru, tapi merupakan turunan dari SGML yang telah dikembangkan pada awal 80-an dan telah banyak digunakan pada dokumentasi teknis proyek- proyek berskala besar. Ketika HTML dikembangkan pada tahun 1990, para penggagas XML mengadopsi bagian paling penting pada SGML dan dengan berpedoman pada pengembangan HTML menghasilkan markup language yang tidak kalah hebatnya dengan SGML. Seperti halnya HTML, XML juga menggunakan elemen yang ditandai dengan tag pembuka (diawali dengan „<‟ dan diakhiri dengan „>‟), tag penutup(diawali dengan „</ „diakhiri „>‟) dan atribut elemen(parameter yang dinyatakan dalam tag pembuka misal <form name=”isidata”>). Hanya bedanya, HTML medefinisikan dari awal tag dan atribut yang dipakai didalamnya, sedangkan pada XML kita bisa menggunakan tag dan atribut sesuai kehendak kita. XSLT XSLT adalah kependekan dari eXtensible StyleSheet Language:Transformation, adalah bagian dari XSL yang dikembangkan sebelumnya. XSL adalah Stylesheet yang khusus dikembangkan sebagai komplemen XML, untuk merubah informasi pada XML ke dalam bentuk lain agar bisa ditampilkan di layar, dicetak di kertas atau didengarkan telinga. Pada dasarnya proses ini dibagi menjadi dua bagian proses yakni pertama Transformasi Struktural yang meliputi pengumpulan, pengelompokan dan pengurutan data maupun penyusunan ulang, penambahan dan penghapusan tag dan atribut, dan yang kedua adalah proses merubah format menjadi pixel dilayar, nohtah tinta di kertas atau nada di speaker. Proses yang pertama itulah yang kemudian disebut XSLT, sedangkan yang kedua biasa disebut XSLFO (eXtensible Stylesheet Language:Formatting Object). Hasil Keluaran XSLT bisa berupa HTML, Text file atau XML dengan format yang baru. Sebenarnya untuk menampilkan dokumen XML agar lebih menarik dilihat di browser bisa dilakukan oleh Cascade StyleSheet. CSS yang sering digunakan untuk memformat HTML bisa juga 122 Andino Maseleno
  • 124. Bab 7 – Aplikasi XML dengan J2ME dipakai untuk XML. Akan tetapi CSS tidak mampu melakukan tugas tugas yang rumit seperti memformat angka desimal, menjumlah, menghitung rata-rata, menampilkan gambar, dan lain-lain. Dan untuk melakukan tugas-tugas itulah kita memerlukan XSLT XSLT Processor XSLT Processor atau yang biasa disebut Parser adalah software bantu yang tugasnya menerapkan perintah-perintah dalam XSLT pada dokumen sumber XML, dan menghasilkan dokumen keluaran baik berupa HTML, Text file ataupun XML. Bagian-Bagian dari Dokumen XML Sebuah dokumen XML terdiri dari bagian bagian yang disebut dengan node. Node-node itu adalah:  Root node yaitu node yang melingkupi keseluruhan dokumen. Dalam satu dokumen XML hanya ada satu root node. Node-node yang lainnya berada di dalam root node.  Element node yaitu bagian dari dokumen XML yang ditandai dengan tag pembuka dan tag penutup, atau bisa juga sebuah tag tunggal elemen kosong seperti <anggota nama=”budi”/> . Root node biasa juga disebut root element  Attribute note termasuk nama dan nilai atribut ditulis pada tag awal sebuah elemen atau pada tag tunggal.  Text node, adalah text yang merupakan isi dari sebuah elemen, ditulis diantara tag pembuka dan tag penutup.  Comment node adalah baris yang tidak dieksekusi oleh parser  Processing Instruction node, adalah perintah pengolahan dalam dokumen XML. Node ini ditandai awali dengan karakter <? Dan diakhiri dengan ?>. Tapi perlu diingat bahwa header standard XML <?xml version=”1.0” encoding=”iso-8859-1”?> bukanlah processing instruction node. Header standard bukanlah bagian dari hirarki pohon dokumen XML.  NameSpace Node, node ini mewakili deklarasi namespace Document Type Definition (DTD) Sesuai namanya DTD berfungsi untuk mendefinisikan tipe documen XML. Pada saat mempelajari salah satu bahasa pemrograman atau scripting, diperkenalkan deklarasi variable, deklarasi fungsi dan deklarasi tipe data. Serupa dengan itu, DTD mendefinisikan struktur dokumen XML dengan daftar element yang digunakan. DTD memungkinkan format yang unik untuk setiap file xml. DTD akan sangat berguna 123 Andino Maseleno
  • 125. Bab 7 – Aplikasi XML dengan J2ME untuk membuat aplikasi dalam Visual Basic, ASP atau bahasa pemrograman lain yang mendukung XML, yaitu untuk memastikan bahwa data yang diterima aplikasi itu adalah data yang valid. Atau bermanfaat juga digunakan bila satu organisasi menyepakati penggunaan satu DTD untuk tukar menukar data dan informasi. Unsur-unsur yang dideklarasikan dalam DTD adalah semua unsur yang membentuk suatu dokumen XML yaitu  Element, satu blok data yang diawali tag pembuka dan tag penutup.  Attribute, informasi pendukung element yang disertakan pada tag pembuka  Entity, karakter pengganti untuk sekumpulan informasi yang didefinisikan XML dan J2ME Penggunaan TinyXML untuk melakukan parsing dokumen XML adalah sebagai berikut: 1. Buatlah objek XMLParser semacam ini: XMLParser xp = new XMLParser(); 2. Ada dua operasi yang dapat dilakukan oleh TinyXML, yakni memparse dokumen XML atau DTD (Document Type Definition) dari sebuah XML. Untuk parsing XML dipanggil fungsi : public void parseXML (XMLResponder obj) throws ParseException; Untuk parsing DTD dipanggil fungsi: public void parseDTD(XMLResponder obj) throws ParseException; 3. Buatlah kelas yang mengimplementasikan XMLResponder untuk proses parsing XML. XMLResponder merupakan Java Interface. Kelas yang mengimplementasikan interface XMLResponder harus mengimplementasikan fungsi-fungsi berikut:  public java.io.InputStream getDocumentStream() throws ParseException Fungsi ini akan dipanggil pertama kali ketika dilakukan parsing dokumen XML/DTD. Fungsi ini menentukan stream data yang akan di-parsing.  public InputStream resolveDTDEntity(String name, String pubID, String sysID) throws ParseException Fungsi ini akan dipanggil untuk memproses eksternal DTD. Umumnya fungsi ini diimplementasikan dengan memanggil fungsi resolveExternalEntity di bawah ini.  public InputStream resolveExternalEntity(String name, String pubID, String sysID) throws ParseException 124 Andino Maseleno
  • 126. Bab 7 – Aplikasi XML dengan J2ME Fungsi ini akan dipanggil untuk memproses eksternal DTD  public void recordDocStart() Fungsi ini akan dipanggil setelah getDocumentStream() di atas untuk menunjukkan bahwa stream data dokumen XML yang akan diparsing berhasil dibuka.  public void recordDocEnd() Fungsi ini akan dipanggil setelah selesai melakukan parsing dokumen XML dan menunjukkan bahwa stream data berhasil ditutup kembali.  public void recordDoctypeDeclaration(String name, String pubID, String sysID) throws ParseException Fungsi ini akan dipanggil ketika parser selesai membaca informasi dari DTD yang ada. Parameter dari fungsi ini adalah: name : Nama dari dokumen type definition (DTD) pubID : Public ID dari DTD yang mungkin null sysID : System ID dari DTD yang mungkin null jika external DTD tidak terdefinisi.  public void recordElementDeclaration(String name, String content) throws ParseException{} Fungsi ini akan dipanggil ketika parser membaca deklarasi elemen dalam DTD. Parameter dalam fungsi ini: name : Nama dari tag elemen content : Definisi untuk menentukan elemen dan data apa saja yang bisa ada dalam tag elemen ini. Definisi ini biasanya berupa regular expression.  public void recordNotationDeclaration(String name, String pubID, string sysID) throws ParseException Fungsi ini akan dipanggil ketika parser membaca notationdi dalam DTD. Parameter yang ada di sini adalah : name : Nama dari notation pubID : Public ID dari notation yang mungkin null sysID : System ID dari notation yang mungkin null jika tidak terdefinisi. Nilainya umumnya berupa nama file.  public void recordEntityDeclaration(String name, String value, String pubID, String sysID, String notation) throws ParseException Fungsi ini akan dipanggil ketika parser membaca deklarasi general dari entiti. 125 Andino Maseleno
  • 127. Bab 7 – Aplikasi XML dengan J2ME Parameter yang ada disini adalah : name : Nama dari entiti value : Nilai dari entiti pubID : public ID dari value entiti sysID : System ID dari value entiti notation : Spesifikasi notasi yang berasosiasi dengan entiti ini, dan dapat bernilai null  public void recordAttlistDeclaration(String element, String attr, boolean notation, String type, String defmod, String def) throws ParseException Fungsi ini akan dipanggil ketika parser membaca definisi atribut pada atribut list di dalam DTD. Aplikasi dapat menyimpan definisi-definisi atribut ini untuk kemudian disimpan sebagai nilai default dari suatu elemen. Parameter yang ada di sini adalah: element : Element dimana atribut akan digunakan attr : Nama atribut yang didefinisikan dari DTD notation : Jika Anda merupakan notation atribut type : Tipe dari nilai atribut defmod : Deskripsi nature dari nilai default atribut, dimana ada kemungkinan nilainya “FIXED”, “REQUIRED”, “IMPLIED”, atau “DEFAULT”. def : Nilai default atribut, bisa bernilai null  public void recordElementStart(String name, Hashtable attr) throws ParseException Fungsi ini akan dipanggil ketika parser membaca suatu tag pembuka elemen dalam dokumen XML. Anda bisa memperoleh informasi nama tag elemen XML dan atributnya dengan memanfaatkan parameter yang ada dari fungsi ini, yakni : name : Nama tag elemen dalam XML attr : Daftar atribut tag elemen XML  public void recordElementEnd(String name) throws ParseException Fungsi ini akan dipanggil ketika parser membaca suatu tag penutup elemen dalam dokumen XML. Anda bisa memperoleh informasi nama tag elemen XML, yakni: name : Nama tag penutup elemen dalam XML  public void recordPI(String name, String pValue) throws ParseException Fungsi ini akan dipanggil ketika parser membaca suatu processing instruction (PI) dalam dokumen XML. Parameter dalam fungsi ini adalah: name : Nama PI 126 Andino Maseleno
  • 128. Bab 7 – Aplikasi XML dengan J2ME pValue : Nilai PI  public void recordCharData(String charData) Fungsi ini akan dipanggil untuk membaca data dari elemen XML. Data yang dibaca akan disimpan pada parameter charData dari fungsi ini.  public void recordComment(String comment) Fungsi ini akan dipanggil untuk membaca komentar dari elemen XML. Komentar yang dibaca akan disimpan pada parameter comment dari fungsi ini. Berikut adalah contoh aplikasi parser XML sederhana: import java.io.*; import java.util.*; import gd.xml.*; class objXMLResponder implements XMLResponder { private String filename = null; private String prefix = “ “; private String curElement = “ “; objXMLResponder(String f) { filename = f; } public java.io.InputStream getDocumentStream() throws ParseException { try { return new FileInputStream(filename); } catch (FileNotFoundException e) { throw new ParseException(“File not Found”); } } public InputStream resolveDTDEntity {String name, String pubID, String sysID) throws ParseException { return resolveExternalEntity(name, pubID, sysID); } public InputStream resolveExternalEntity(String name, String pubID, String sysID) throws ParseException { if (sysID != null) { File f = new File((new File(filename)).getParent(), sysID); try { return new FileInputStream(f); } catch (FileNotFoundException e) { 127 Andino Maseleno
  • 129. Bab 7 – Aplikasi XML dengan J2ME throw new ParseException(“file not found (“+f+”)”); } } else {return null;} } public void recordDocStart() { System.out.println(“Parsing activity started”); } public void recordDocEnd() { System.out.println(“Parsing activity finished”); } public void recordElementStart(String name, Hashtable attr) throws ParseException { curElement = name; System.out.println(prefix+”Element : “ + name); if (attr != null) { Enumeration e = attr.keys(); System.out.print(prefix); String conj = “ “; while (e.hasMoreElements()) { Object k = e.nextElement(); System.out.print(conj+k+” = “+attr.get(k)); Conj = “,”; } System.out.println(“ ”); } prefix = prefix+” “; } public void recordElementEnd(String name) throws ParseException { prefix = prefix.substring(2); } public void recordPI(String name, String pValue) { System.out.println(prefix +”*”name+”PI: “+pValue); } public void recordCharData(String charData) { System.out.println(prefix+ “Data elemen” + curElement+ “-> “ +charData); } public void recordComment(String comment) { System.out.println(prefix+”* Komentar : “ + comment); } public void recordDoctypeDeclaration(String name, String pubID, String sysID) 128 Andino Maseleno
  • 130. Bab 7 – Aplikasi XML dengan J2ME throws ParseException { System.out.print(prefix+”!DOCTYPE: “+name); if (pubID != null) System.out.print(“ pubID = “+pubID); if (sysID != null) System.out.print(“ sysID = “+sysID); System.out.println(“ “); prefix = “ “; } public void recordElementDeclaration(String name, String content) throws ParseException {} public void recordNotationDeclaration(String name, String pubID, String sysID) throws ParseException {} public void recordEntityDeclaration(String name, String value, String pubID, String sysID, String notation) throws ParseException{ System.out.print(prefix+”!ENTITY: “+name); if (value != null) System.out.print(“value = ” ”+value+”” “); if (pubID != null) System.out.print(“pubID = “ +pubID); if (sysID != null) System.out.print(“sysID = “ +sysID); if (notation != null) System.out.print(“notation = “+notation); System.out.println(“”); } public void recordAttlistDeclaration(String element, String attr, boolean notation, String type, String defmod, String def) {} } class parsingXML { public static void main(String args[]) { if (args.length != 1) : System.err.println(“Penggunaan : “); System.err.println(“Java parsingXM1 <fileXML> “); System.exit(-1); } try { XMLParser p = new XMLParser(); objXMLResponder q = new objXMLResponder (args[0]); p.parseXML(q); } catch (parseException e){} } 129 Andino Maseleno
  • 131. Bab 7 – Aplikasi XML dengan J2ME } MIDP client untuk akses informasi e-mail user dari website yang dikembalikan dalam format XML import javax.microedition.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.io.*; import java.util.*; import gd.xml.*; public class readXML extends MIDlet implements CommandListener { private Display display; private Command openCmd = new Command(“Info”, Command.OK, 1); private Command exitCmd = new Command(“Keluar”, Command.EXIT, 2); private Command backCmd = new Command(“Kembali”, Command.EXIT, 2); private Form f1, f2; private TextField t1, t2; private String URL = new String(http://127.0.0.1/infouser.xml); public readXML(){} public void startApp() { display = Display.getDisplay(this); f1 = new Form(“Informasi E-mail”); t1 = new TextField(“Nama User”, “Andino Maseleno”, 1024, TextField.ANY); f1.append(t1); f1.addCommand(openCmd); f1.addCommand(exitCmd); f1.setCommandListener(this); display.setCurrent(f1); } public void inform() { HttpConnection c = null; InputStream is = null; f2 = new Form(“User Information”); t2 = new TextField(“”, null, 1024, TextField.ANY); byte[] data = new byte[1024]; try { c = (HttpConnection)Connector.open(URL); is = c.openInputStream(); XMLParser p = new XMLParser(); 130 Andino Maseleno
  • 132. Bab 7 – Aplikasi XML dengan J2ME objXMLResponder oXML = new objXMLResponder(is); if (c.getResponseCode() == HttpConnection.HTTP_OK) { p.parseXML(oXML); } else { f2.setTitle(“Respon Web Server”); t2.setString(“Not OK HTTP” + c.getResponseCode() + “ “ + c.getResponseMessage()); f2.append(t2); } catch (IOException e) { t2.setString(“Error I/O : “ + e.toString()); e.printStackTrace(); } catch (ParseException e) { t2.setString(“Error Parse XML : “ + e.toString()); e.printStackTrace(); } finally { try { if (is != null) { is.close();} if (c != null) {c.close();} } catch (IOException e) { f2.addCommand(backCmd); f2.setCommandListener(this); display.setCurrent(f2); } } //Kelas dibawah merupakan kelas yang mengimplementasikan proses-proses saat melakukan //parsing XML class objXMLResponder implements XMLResponder { private String curElement = “ “; private int Depth = 0; private java.io.InputStream s; private boolean processNow = false; private boolean foundUser = false; private StringBuffer detailsUser = new StringBuffer(); //Konstruktor objXMLResponder(InputStream f){ s = f; } public InputStream getDocumentStream() throws ParseException { return s; } 131 Andino Maseleno
  • 133. Bab 7 – Aplikasi XML dengan J2ME public InputStream resolveDTDEntity(String name, String pubID, String sysID) throws ParseException { return resolveExternalEntity(name, pubID, sysID); } public InputStream resolveExternalEntity(String name, String pubID, String sysID) throws ParseException { return null; } public void recordDocStart(){} public void recordDocEnd() { if (!foundUser) { t2.setString(“User “ + t1.getString() + “ tidak ditemukan”); } else { t2.setString(“User “ + t1.getString() + “ ditemukan. Details : “ + detailUser.toString()); } System.gc(); } public void recordElementStart(String name, Hashtable attr) throws ParseException { Depth++; if (attr != null) { Enumeration e = attr.keys); while (e.hasMoreElements()) { String k = e.nextElement().toString(); if (k.trim().equals(“id”) && Depth == 2) { if (t1.getString().trim().equals (attr.get(k).toString().trim())) { processNow = true; foundUser = true; } else { processNow = false; } } } } curElement = name; System.gc(); } public void RecordElementEnd(String name) throws ParseException { 132 Andino Maseleno
  • 134. Bab 7 – Aplikasi XML dengan J2ME Depth++; } public void recordPI(String name, String pValue) {} public void recordCharData(String charData) { if (processNow) { if (curElement.trim().equals(“firstname”)) { detailsUser.append(“ (*) First Name = “ + charData); } else if (curElement.trim().equals(“lastname”)) { detailsUser.append(“ (*) Last Name = “ +charData); } else if (curElement.trim().equals(“age”)) { detailsUser.append(“ (*) Age = “ +charData+ “ tahun”); } else if (curElement.trim().equals(“country”)) { detailsUser.append(“ (*) Negara = “ +charData); } else if (curElement.trim().equals(“email”)) { detailsUser.append(“ (*) Email = “ +charData); } } } public void recordComment(String comment) {} public void recordDoctypeDeclration(String name, String pubID, String sysID) throws ParseException{} public void recordNotationDeclaration(String name, String pubID, String sysID) throws ParseException{} public void recordEntityDeclaration(String name, String value, String pubID, String sysID, String notation) throws ParseException{} public void recordAttlistDeclaration(String element, String attr, boolean notation, String type, String defmod, String def){} }//end of class public void quit() {destroyApp(true);} public void back() {display.setCurrent(f1);} public void commandAction(Command c, Displayable d) { if (c == exitCmd) { quit(); } else if (c == openCmd) { Inform(); } else if (c == backCmd) { } } public void pauseApp() {} public void destroyApp(boolean unconditional) {notifyDestroyed(){ 133 Andino Maseleno
  • 135. Bab 7 – Aplikasi XML dengan J2ME } } 134 Andino Maseleno