Transcript
Page 1: Andino Maseleno - Modul J2ME

JAVA 2 MICRO EDITION Andino Maseleno Diterbitkan pertama kali tahun 2003

Page 2: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

1

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.

Page 3: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

2

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

Page 4: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

3

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

Compiler

Java Interpreter

Computer

*.java

*.class

Native Code

Executed

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

Page 5: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

4

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.

Page 6: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

5

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)

Page 7: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

6

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

Page 8: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

7

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

Page 9: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

8

//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));

}

}

Page 10: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

9

//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 >

op2

Menghasilkan true jika op1 lebih besar dari

op2

Page 11: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

10

>= op1 >=

op2

Menghasilkan true jika op1 lebih besar atau

sama dengan dari op2

< op1 <

op2

Menghasilkan true jika op1 lebih kecil dari

op2

<= op1 <=

op2

Menghasilkan true jika op1 lebih kecil atau

sama dengan dari op2

== op1 ==

op2 Menghasilkan true jika op1 sama dengan op2

!= op1 !=

op2

Menghasilkan true jika op1 tidak sama dengan

op2

Contoh program

Page 12: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

11

/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 &&

op2

Menghasilkan true jika op1 dan op2, keduanya

bernilai boolean true

Page 13: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

12

|| op1 ||

op2 Menghasilkan true jika op1 atau op2, salah satunya bernilai boolean

true

! ! op Menghasilkan true jika op bernilai boolean

false

& op1 &

op2

Bitwise AND, menghasilkan true jika op1 dan

op2 bernilai true

| op1 |

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

bernilai true

^ op1 ^

op2 Menghasilkan true jika salah satu diantara op1 atau op2 bernilai

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

Page 14: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

13

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

Page 15: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

14

//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

Page 16: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

15

>>= 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 :

Page 17: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

16

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”);

}

}

}

Page 18: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

17

//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

}

}

Page 19: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

18

//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!!");

}

}

Page 20: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

19

//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;

}

}

}

Page 21: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

20

//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.

Page 22: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

21

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

Page 23: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

22

//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(“”);

}

}

Page 24: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

23

//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);

}

}

}

Page 25: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

24

//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);

}

}

}

Page 26: Andino Maseleno - Modul J2ME

Bab 1 – Pemrograman Java

Andino Maseleno

25

//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);

}

}

}

Page 27: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

26

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

Page 28: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

27

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

Page 29: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

28

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

Processor 16 Bit

JVM yang digunakan dikenal dengan nama

Kilobyte virtual machine (KVM)

Mengimplementasikan seluruh fitur pada J2SE

Processor 32 Bit

JVM yang digunakan dikenal dengan nama

connected virtual machine (CVM)

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

Page 30: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

29

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:

Page 31: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

30

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

Page 32: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

31

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

NegativeArraySizeException

Page 33: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

32

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:

Page 34: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

33

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:

Page 35: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

34

Gambar 2.4 Emulator DefaultGrayPhone

Emulator DefaultColorPhone tampak seperti gambar 2.5 dibawah ini:

Page 36: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

35

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,

Page 37: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

36

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

Page 38: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

37

new( )

destroyApp( )

pauseApp( )

startApp( )

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.

Destroyed

Active

Paused

Page 39: Andino Maseleno - Modul J2ME

Bab 2 – Java 2 Micro Edition

Andino Maseleno

38

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.

Page 40: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

39

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

Page 41: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

40

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(){

Page 42: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

41

}

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) {}

}

Page 43: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

42

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);

Page 44: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

43

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 :

Page 45: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

44

[email protected]

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;

Page 46: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

45

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

Page 47: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

46

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);

Page 48: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

47

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)

Page 49: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

48

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)

Page 50: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

49

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

Page 51: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

50

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

Page 52: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

51

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()

Page 53: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

52

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");

Page 54: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

53

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;

Page 55: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

54

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.

Page 56: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

55

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

Page 57: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

56

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

[email protected]

TextField.NUMERIC

Artinya, hanya bisa memasukkan teks berupa angka saja.

TextField.PHONENUMBER

Page 58: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

57

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:

Page 59: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

58

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() {

Page 60: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

59

}

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

Page 61: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

60

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);

Page 62: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

61

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 {

Page 63: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

62

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() {

Page 64: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

63

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() {

}

Page 65: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

64

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:

Page 66: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

65

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

Page 67: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

66

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() {

}

Page 68: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

67

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).

Page 69: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

68

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-

Page 70: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

69

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);

}

Page 71: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

70

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().

Page 72: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

71

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

Page 73: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

72

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) {

}

}

Page 74: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

73

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);

}

Page 75: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

74

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 {

Page 76: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

75

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;

Page 77: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

76

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() {

Page 78: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

77

}

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();

Page 79: Andino Maseleno - Modul J2ME

Bab 3 – Pemrograman GUI

Andino Maseleno

78

display.setCurrent(canvas);

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

}

Page 80: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

79

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)

Page 81: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

80

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;

Page 82: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

81

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";

}

Page 83: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

82

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

Page 84: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

83

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);

Page 85: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

84

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) {

Page 86: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

85

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.

Page 87: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

86

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

Page 88: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

87

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.

Page 89: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

88

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();

Page 90: Andino Maseleno - Modul J2ME

Bab 4 –Manajemen Event

Andino Maseleno

89

display.setCurrent(canvas);

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

}

}

Page 91: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

90

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.

Page 92: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

91

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

Page 93: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

92

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);

}

Page 94: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

93

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

Page 95: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

94

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());

Page 96: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

95

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 {

Page 97: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

96

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

Page 98: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

97

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);

Page 99: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

98

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);

Page 100: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

99

} 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();

Page 101: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

100

}

}

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;

Page 102: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

101

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();

Page 103: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

102

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) {

Page 104: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

103

} 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) {

Page 105: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

104

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;

Page 106: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

105

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()) {

Page 107: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

106

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();

Page 108: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

107

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) {

Page 109: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

108

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:

Page 110: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

109

//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) {

Page 111: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

110

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.*;

Page 112: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

111

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) {

Page 113: Andino Maseleno - Modul J2ME

Bab 5 – Pemrograman Database

Andino Maseleno

112

String lbl = c.getLabel();

if (lbl.equals(“Keluar”)) {

keluar();

} else if (lbl.equals(“Hapus”)) {

hapusDb();

}

}

public void pauseApp() {

}

public void destroyApp(boolean unconditional) {

notifyDestroyed();

}

}

Page 114: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

113

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

Page 115: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

114

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";

Page 116: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

115

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);

Page 117: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

116

}

}

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");

Page 118: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

117

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.*;

Page 119: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

118

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));

Page 120: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

119

// 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()

{

Page 121: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

120

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";

Page 122: Andino Maseleno - Modul J2ME

Bab 6 – Aplikasi J2ME dengan PHP

Andino Maseleno

121

$handle = fopen ($filename, "rb");

$contents = fread ($handle, filesize ($filename));

fclose ($handle);

header("Content-type: image/gif");

header("Content-length: ".(string)(filesize($filename)));

echo $contents

?>

Page 123: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

122

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

Page 124: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

123

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

Page 125: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

124

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

Page 126: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

125

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.

Page 127: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

126

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

Page 128: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

127

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) {

Page 129: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

128

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)

Page 130: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

129

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){}

}

Page 131: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

130

}

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();

Page 132: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

131

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;

}

Page 133: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

132

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 {

Page 134: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

133

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(){

Page 135: Andino Maseleno - Modul J2ME

Bab 7 – Aplikasi XML dengan J2ME

Andino Maseleno

134

}

}


Top Related