Pendahuluan ( First Session).
Baca terlebih dahulu halaman ini :
Pemahaman sebelumnya :
1. Aturan Pemrograman Java Standar.
2. Instalasi Toolkit Standard J2ME (Recomended) yaitu :
a. Engine Java 2, J2SDK 1.4.1
b. Wireless Tool Kit 1.401 (WTK2.0)
c. Editor Kit untuk J2ME Coding standard ( Notepad )
d. Editor Kit untuk J2ME Coding Advance ( Forte4Java / JCreator )
3. Instalasi Emulator Toolkit Spesifik yaitu :
a. Nokia Developer Suite for J2ME (NDS_J2ME) 2.0 or higher.
(Recomended)
b. Siemen Mobile Tool Kit (SMTK).
c. Motorola SDK 3.1 or higher for J2ME.
d. PalmOS Emulator 3.5 or higher
4. Toolkit untuk Transfer ke Mobile Phone
a. Oxygen Phone Manager.
Aturan penulisan!!!
1. Untuk penulisan kode dituliskan dengan menggunakan huruf yang berbeda.
2. Untuk baris kode yang tidak cukup, maka dituliskan dengan menambahkan tab
pada baris kode yang merupakan sambungan di atasnya.
3. Untuk tiap baris kode, diberi penomoran baris untuk memudahkan pengecekan
baris.
4. Pada bagian coding jika terdapat tanda dengan keterangan dalam kurung siku
dengan huruf tebal italic seperti berikut ini [...] berarti coding tersebut
bersifat bebas, bisa diganti sesuai dengan yang diinstruksikan di dalam kurung
siku itu.
5. Pada coding, ada baris yang diberi huruf tebal. Berarti baris ini adalah
merupakan bagian yang utama yang diterangkan pada program.
Aturan kompilasi program dengan WTK !!!
1. Pertama kali carilah pada Start Æ Program Æ J2ME Wireless Tool Kit
1.0.4_01Æ KToolbar.
2. Kemudian setelah itu, akan muncul tampilan seperti berikut ini.
Untuk membuat proyek MIDlet baru, tekan tombol New Project .
3. Masukkan nama Proyek dan nama dari MIDlet yang baru yang ingin dibuat.
Hendaknya, nama Proyek dan nama MIDlet adalah nama yang mempunyai
saling keterkaitan dan mudah diingat juga melambangkan informasi MIDlet
itu sendiri. Ingat nama MIDlet adalah sesuai dengan nama source program
MIDlet anda. Setelah itu tekan Create Project.
4. Setelah Project dibuat, maka langsung akan membuka dialog Setting untuk
project baru.
Disini propertinya bisa anda ganti sesuai dengan keinginan ada. Ini adalah
properti dari MIDlet yang akan ditampilkan nanti sebagai informasi dari
MIDlet yang anda buat. Informasi ini mencakup nama, versi, lisensi,
konfigurasi juga termasuk informasi nama MIDlet dan ukurannya. Setelah
disetting, tekan tombol OK di bawahnya untuk menyimpan setting yang
diberikan.
5. Pada display terdapat perubahan tampilan seperti berikut ini :
Disini dikatakan bahwa anda harus meletakkan source MIDlet pada direktor
yang telah dibuat oleh WTK, juga file untuk aplikasi lainnya seperti icon, juga
library file lain yang diperlukan untuk program.
6. Setelah selesai dicopykan, untuk mengkompilasi / compile source MIDlet jadi
MIDlet program, dari dialog utama, tekan tombol Build. Saat setelah ditekan,
maka akan terlihat dialog kecil untuk menyatakan proses kompilasi program
MIDlet tersebut.
Setelah selesai, maka akan keluar konfirmasi pada dialog menyatakan proses
berhasil atau gagal. Jika gagal, maka disitu akan terlihat pada bagian mana
terjadinya kesalahan / gagalnya proses kompilasi terjadi akibat apa.
7. Untuk menjalankannya, maka bisa dipilih device apa saja yang dapat dipakai.
Kemudian tekan tombol Run. Disini coba dipilih DefaultGrayPhone.
8. Tampilan pada emulator handphone akan tampak seperti berikut ini.
9. Tampilan pada emulator ini akan “serupa” dengan pada piranti sesungguhnya.
10. Tidak semua aplikasi yang jalan di Emulator dapat berjalan sama seperti
pada piranti. Ini juga tergantung pada spesifikasi dari mesin Java Mobile di
piranti tersebut apakah mendukung.
Modul 1 MIDlet (First Session)
Simple Hello World.
Untuk latihan kita yang pertama adalah dengan mengetikkan sebuah program midlet
sederhana untuk menampilkan tulisan Hello World ke dalam emulator daripada
Nokia ataupun emulator J2ME standard.
File : HelloMIDlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;public class HelloMIDlet extends MIDlet {
private Display display;
public HelloMIDlet() {
display = Display.getDisplay(this); }
public void startApp() {
TextBox textBox = new TextBox("Hello World", "Test string", 256, TextField.ANY);
display.setCurrent(textBox); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
}
Sama pada pelajaran dasar pengetikan coding midlet, yang dipelajari pertama adalah
menampilkan kata-kata Hello World ke dalam applet maupun ke dalam program Java.
Sama seperti aturan pada pemrograman Java, disini ada beberapa class default yang
harus diimport dari luar agar program dapat jalan, yaitu pada baris 1 dan 2 :
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
Disini untuk inisialisasi sebuah midlet pada piranti, digunakan baris 1, sedangkan
untuk menampilkan sebuah midlet ke layar display piranti, maka dibutuhkan baris 2.
Untuk pemrograman lainnya, memang ada memiliki kesamaan dengan pemrograman
Java. Untuk pendefinisian awal class, sama seperti Java, nama yang terdapat pada
baris 4 :
public class HelloMIDlet extends MIDlet {
berarti, source midlet ini juga bernama HelloMIDlet.java, yang juga merupakan
bagian class dari MIDlet. Ada pengkhususan untuk coding midlet adalah penggunaan
void khusus pada coding, yaitu seperti tampak pada baris 12, 17 dan 20 :
public void startApp() { }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
Jika diartikan void ini adalah berarti program yang dijalankan pada event-event
tertentu, contoh untuk startApp() berarti dijalankan pada saat program dieksekusi,
pauseApp() dijalankan saat program mengalami berhenti sebentar / mengalami pause,
sedangkan pada destroyApp() dijalankan saat program ditutup / exit.
Pada baris 6 dan 9 ini digunakan untuk inisialisasi display ke piranti, juga kebanyakan
digunakan sebagai pengenal obyek display pada midlet.
Pada bagian berikutnya, akan dijelaskan tentang penggunaan Command yang sering
dipakai pada midlet.
Latihan :
Buatlah coding midlet seperti berikut ini, dan diload di emulator :
File : Helloku.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;public class Helloku extends MIDlet {
private Display display;
public Helloku() {
display = Display.getDisplay(this); }
public void startApp() {
TextBox t = new TextBox("Namaku", "[...isi dengan nama anda...] ", 256, TextField.ANY);
display.setCurrent(textBox); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
Modul 2 MIDlet.
Command pada MIDlet
Perlunya Command disini adalah untuk menambahkan interaksi antara pengguna
dengan MIDlet. Interaksi ini bisa termasuk tombol pada piranti / berupa menu pilihan
pada MIDlet. Berikut ini adalah contoh penambahan interaksi pada midlet Hello.
File : Hello2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;public class Hello2 extends MIDlet implements CommandListner {
private Display display; private Command cmdExit;
public Hello2() {
display = Display.getDisplay(this);
cmdExit = new Command(“Keluar”, Command.SCREEN, 2); }
public void startApp() {
TextBox textBox = new TextBox("Hello World", "Test string", 256, TextField.ANY);
t.addCommand(cmdExit); t.setCommandListener(this);
display.setCurrent(t); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
if (cmd == cmdExit) {
public void commandAction(Command cmd, Displayable disp) { destroyApp(false);
notifyDestroyed(); }
}
}
Pada program diatas ditambahkan CommandListener untuk interface keluar dari
aplikasi. Sekarang compile dan jalankan pada WTK anda dan lihat hasilnya. Maka
akan tampak ada penambahan tombol Keluar pada samping kanan bawah. Memang
pada beberapa emulator / piranti penambahan Command ini tidak selalu tampak pada
di kanan bawah, terkadang harus kita akses dulu ke Menu / Option, baru setelah itu
ada tampak pilihan Keluar.
Sekarang kita tinjau penambahan pada coding:
Command ini adalah sebuah class, jadi penambahannya harus diregister terlebih
dahulu obyek yang akan menjadi Command. Lihat pada baris ke 7 :
private Command cmdExit;
Kemudian pada main class, baru kita tambahkan properti lain untuk Command
tersebut, lihat pada baris ke 11:
Command ini tujuannya diberikan kepada obyek, sehingga obyek dapat berinteraksi
dengan pengguna. Cara pemberian Command ini dilihat pada baris 16 dan 17 :
t.addCommand(cmdExit); t.setCommandListener(this);
Sedangkan set perintah yang diberikan kepada Command untuk keluar dari aplikasi
MIDlet, diberikan dalam kelas tersendiri sebagai aksi dari Command, dilihat pada
baris 28 sampai dengan 33 :
public void commandAction(Command cmd, Displayable disp) { if (cmd == cmdExit) { destroyApp(false); notifyDestroyed(); } }
Latihan :
Cobalah contoh pembuatan tanggal berikut ini
File : DateExample.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Calendar;public class DateExample extends javax.microedition.midlet.MIDlet {
private Command cmdSetDateType; private Command cmdDisplayDate; private Command cmdExit;
private Command cmdSetDateTypeUSA; private Command cmdSetDateTypeNormal;
private TextBox textBox1; private TextBox textBox2;
private CommandListener listener1; private CommandListener listener2;
private Display display;
private static final String TEXT1 = "TextBox l\nUse Menu";
private static final String TEXT2 = "TextBox 2\nUse Menu";
private static final String SLASH = "/";
private static final int DATE_FORMAT_USA = 1 ; private static final int DATE_FORMAT_NORMAL = 2;
private int dateFormat = DATE_FORMAT_NORMAL;
public DateExample() {
display = Display.getDisplay(this); cmdSetDateType =
new Command("See Date Type",Command.SCREEN,2); cmdExit =
new Command("Exit",Command.EXIT,1); cmdSetDateTypeUSA =
new Command("USA", Command.SCREEN, 2); cmdSetDateTypeNormal =
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
new Command("Normal", Command.SCREEN, 2); cmdDisplayDate =
new Command("Display Date", Command.SCREEN, 2); dateFormat = DATE_FORMAT_USA;
}
public void startApp() {
textBox1 = new TextBox("Date MIDlet", null, 256, 0); textBox1.addCommand(cmdSetDateType);
textBox1.addCommand(cmdDisplayDate); textBox1.addCommand(cmdExit);
listener1 = (CommandListener)new TextBoxListener1(); textBox1.setCommandListener(listener1);
textBox2 = new TextBox("Date", null, 256, 0) ; textBox2.addCommand(cmdSetDateTypeUSA);
textBox2.addCommand(cmdSetDateTypeNormal);
listener2 = (CommandListener)new TextBoxListener2() ; textBox2.setCommandListener(listener2);
textBox1.setString(TEXT1); display.setCurrent(textBox1); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
private void setActiveTextBox(TextBox tb) { display.setCurrent(tb);
}
class TextBoxListener1 implements CommandListener {
public void commandAction(Command cmd, Displayable disp) { System.out.println("in TextBoxListener1"); if (cmd == cmdExit) { destroyApp(false); notifyDestroyed(); } else if (cmd == cmdSetDateType) { textBox2.setString(TEXT2); setActiveTextBox(textBox2); } else {
Calendar cal = Calendar.getInstance(); StringBuffer sb = new StringBuffer(); if (dateFormat == DATE_FORMAT_USA) { sb.append(Integer.toString(cal.get(Calendar.MONTH))) .append(SLASH) .append(Integer.toString(cal.get(Calendar.DAY_OF_MONTH))); } else { sb.append(Integer.toString(cal.get(Calendar.DAY_OF_MONTH))) .append(SLASH) .append(Integer.toString(cal.get(Calendar.MONTH))); } sb.append(SLASH) .append(Integer.toString(cal.get(Calendar.YEAR))); textBox1.setString(sb.toString() + "\n" + TEXT1); } } }
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
public void commandAction(Command cmd, Displayable disp) { System.out.println("in TextBoxListener2"); if (cmd == cmdExit) { destroyApp(false); notifyDestroyed(); } else { if (cmd == cmdSetDateTypeUSA) { dateFormat = DATE_FORMAT_USA; } else { dateFormat = DATE_FORMAT_NORMAL; } textBox1.setString(TEXT1); setActiveTextBox(textBox1); } } } }
Pada latihan di atas coba anda perhatikan penggunaan perintah command, serta
penulisannya seperti pada contoh baris 35 dan 38 :
cmdExit = new Command("Exit", Command.EXIT, 1);
cmdDisplayDate = new Command("Display Date", Command.SCREEN, 2);
Pada MIDlet hasil, anda lihat, perintah tersebut memberikan efek apa pada MIDlet,
apakah ada perubahan? Bagaimana juga penempatannya?
Modul 3 MIDlet(Second Session)
Interaksi User dengan MIDP API.
Berikut ini ada contoh untuk lebih lanjut pengembangan dengan TextBox :
File : TextBoxExample2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 /** Demo TextBox2 dengan modifikasi dari Instant Wireless Java with J2ME * By chiwoq@piksi
*/
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class TextBoxExample2 extends MIDlet implements CommandListener {
private TextBox t;
private Command cmdCompare; private Command cmdExit; private Display display;
private String msg = "Hari ini pelajaran tentang API";
public TextBoxExample2() {
display = Display.getDisplay(this);
cmdCompare = new Command("Bandingkan", Command. SCREEN, 2); cmdExit = new Command ("Keluar", Command.SCREEN , 2);
}
public void startApp() {
t = new TextBox("TextBoxExample2", msg, 256, 0); t.addCommand(cmdCompare); t.addCommand(cmdExit); t.setCommandListener(this); display.setCurrent(t); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command cmd, Displayable disp) { if (cmd == cmdExit) { destroyApp(false); notifyDestroyed() ; } else if (cmd==cmdCompare) { t.setString((msg.compareTo(t.getString()) == 0) ? "SAMA" : "BEDA"); t.removeCommand(cmdCompare); } } }
Disini dapat kita lihat suatu aplikasi untuk membandingkan antara teks yang ada
dengan teks yang telah diedit. Disini memanfaatkan TextBox untuk meletakkan teks
dan melakukan komparasi dengan menggunakan Command.
Berikut ini kita akan mengenal Form yang digunakan dalam MIDlet. Form adalah
layar yang mengandung beberapa obyek benda (image, text, textbox, field date, gauge,
choice groups). Untuk Form disini terdiri dari 2 constructor, yaitu untuk properti form
itu sendiri, dan untuk menambahkan komponen penyusun form. Berikut ini adalah
contoh untuk komponen penyusun form .
Suatu Textfield adalah kotak tempat mengisikan teks yang dapat diedit. Seperti pada
TextBox, juga untuk mengisikan teks. Perbedaannya, bahwa disini TextField adalah
merupakan TextBox dengan adanya label di depannya. Fungsi pembatasan jumlah
karakter tetap dimiliki oleh TextField. Langsung saja kita lihat contoh berikut ini:
File : TempConvMid.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 /**This example was taken from Instant Wireless with J2ME by paul_tremblett *Modified by chiwoq@piksi
*/
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class TempConvMid extends MIDlet implements CommandListener {
private Display display; private Command cmdExit;
private Form form1;
private TextField tempField;
public void startApp() {
display = Display.getDisplay(this) ;
cmdExit = new Command ("Keluar", Command.SCREEN, 1);
form1 = new Form("Temp");
tempField = new TextField("Teks: ", null, 10, TextField.ANY); form1.addCommand(cmdExit);
form1.setCommandListener(this); form1.append(tempField);
display.setCurrent(form1);
}
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction (Command cmd, Displayable d) { String displayString = null;
if (cmd == cmdExit) { destroyApp(false); notifyDestroyed(); } } }
Pada MIDlet ini, terdapat form yaitu bernama “Temp”. Form ini berisikan komponen
berupa TextField berlabel : “Teks :” Ini adalah contoh sederhana penggunaan form
dan komponennya. Berikut adalah contoh lagi komponen form.
File : TempConv2Mid.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 /**This example was taken from Instant Wireless with J2ME by paul_tremblett *Modified by chiwoq@piksi
*/
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class TempConv2Mid extends MIDlet implements CommandListener {
private Display display; private Command cmdExit; private Command cmdPilih; private Command cmdOK; private Form form1; private Form form2;
private TextField tempField;
private ChoiceGroup tempChoice;
private StringItem convertedTemp;
public void startApp() { display = Display.getDisplay(this);
cmdPilih = new Command("Pilih" ,Command.SCREEN, 1); cmdExit = new Command ("Keluar", Command.SCREEN, 1); cmdOK = new Command("OK", Command.SCREEN, 1);
form1 = new Form("Konversi");
tempField = new TextField("Suhu:", null, 10, TextField.ANY) ; form1.addCommand(cmdPilih);
form1.addCommand(cmdExit); form1.setCommandListener(this); form1.append(tempField);
ype = {"Celsius", "Farenheit"}; String[] tempT
tempChoice =
new ChoiceGroup("Tipe", Choice.EXCLUSIVE, tempType, null); form1.append(tempChoice);
form2 = new Form("Hasil");
convertedTemp = new StringItem(null, null); form2.append(convertedTemp);
form2.addCommand(cmdOK);
form2.setCommandListener(this);
display.setCurrent(form1); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command cmd, Displayable d) { String displayString = null;
if (cmd == cmdExit) { destroyApp(false); notifyDestroyed(); } else if (cmd == cmdPilih) { String s = tempField.getString(); displayString = convertTemp(s); convertedTemp.setText(displayString); display.setCurrent(form2); } else if (cmd == cmdOK) {
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 tempField.setString(null); display.setCurrent(form1); } }
private String convertTemp(String s) { char c = s.charAt(s.length() - 1);
StringBuffer tsb = new StringBuffer() ;
switch (tempChoice.getSelectedIndex ()) { case 0 : tsb.append(cToF(s)) ; tsb.append('C'); break ; case 1: tsb.append(fToC(s)); tsb.append ('F'); break; default: tsb.append ("**Kesalahan**"); } return tsb.toString(); }
private String cToF(String c) { String f = "Suhu =" + c;
return f;
}
private String fToC(String f) { String c = "Suhu =" + f;
return c;
} }
Pada contoh kali ini, ditampilkan beberapa hal baru disamping komponen dari Form,
disini juga dikenalkan penggunaan StringBuffer, untuk tipe variable yang berkaitan
dengan streaming teks (lihat baris 74). Streaming teks ini biasanya terjadi saat
pengiriman data melalui protokol HTTP. Sedangkan hal-hal lainnya telah terdapat
pada dasar pemrograman Java / Java Applet.
Latihan :
Berikut ini ada beberapa contoh sederhana untuk
- Cekbox lebih dari satu.(MultipleCekbox)Æ
MultipleChoiceGroup.java
- Form dengan TextField, Gauge(kontrol Level), dan Cekbox Æ
FormScroll.java
- Simulasi Jam Æ Snooze.java
File : MultipleChoiceGroup.java
1 2 3 4 5 6 7 8 9 10 11 12 /** Untuk hasilnya dilihat pada WTK Window Message. */
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class MultipleChoiceGroup extends MIDlet implements ItemStateListener, CommandListener
{
private Display display; // Reference to display object private Form fmMain; // The main form
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
private Command cmView; // View the choice selected
private int selectAllIndex; // Index of the "Select All" option
private ChoiceGroup cgPrefs; // Choice Group of preferences
private int choiceGroupIndex; // Index of choice group on form
public MultipleChoiceGroup() {
display = Display.getDisplay(this);
cgPrefs = new ChoiceGroup("Preferences", Choice.MULTIPLE);
cgPrefs.append("Auto Indent", null); cgPrefs.append("Replace Tabs", null); cgPrefs.append("Wrap Text", null);
selectAllIndex = cgPrefs.append("Select All", null);
cmExit = new Command("Exit", Command.EXIT, 1); cmView = new Command("View", Command.SCREEN,2);
fmMain = new Form("");
choiceGroupIndex = fmMain.append(cgPrefs); fmMain.addCommand(cmExit); fmMain.addCommand(cmView); fmMain.setCommandListener(this); fmMain.setItemStateListener(this); }
public void startApp() { display.setCurrent(fmMain); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable s) { if (c == cmView) {
boolean selected[] = new boolean[cgPrefs.size()]; cgPrefs.getSelectedFlags(selected);
for (int i = 0; i < cgPrefs.size(); i++)
System.out.println(cgPrefs.getString(i) + (selected[i] ? ": selected" : ": not selected"));
} else if (c == cmExit) { destroyApp(false); notifyDestroyed(); } }
public void itemStateChanged(Item item) { if (item == cgPrefs) {
if (cgPrefs.isSelected(selectAllIndex)) { for (int i = 0; i < cgPrefs.size() - 1; i++) cgPrefs.setSelectedIndex(i, true); cgPrefs.setSelectedIndex(selectAllIndex, false); } } } }
File : FormScroll.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;public class FormScroll extends MIDlet implements CommandListener {
private Display display; // Reference to display object private Form frmMain; // The main form
private Command cmdExit; // Command to exit
private TextField txfSize; // Product size private ChoiceGroup chgEmail; // Choice group private Gauge gauVolume; // Volume
public FormScroll() {
display = Display.getDisplay(this);
// Create TextField
txfSize = new TextField("Size", "Large", 5, TextField.ANY);
// Create an exclusive (radio) choice group, and append entries
chgEmail = new ChoiceGroup("Email Options", Choice.EXCLUSIVE); chgEmail.append("Read", null);
chgEmail.append("Forward", null); chgEmail.append("Delete", null);
// Create the gauge
gauVolume = new Gauge("Sound Level", true, 30, 4);
cmdExit = new Command("Exit", Command.EXIT, 1);
// Create the form frmMain = new Form("Form
frmMain.append(txfSize); Stuff"); frmMain.append(chgEmail); frmMain.append(gauVolume); frmMain.addCommand(cmdExit); // Capture events frmMain.setCommandListener(this); }
// Called by application manager to start the MIDlet. public void startApp()
{
display.setCurrent(frmMain); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void commandAction(Command c, Displayable s) { if (c == cmdExit) { destroyApp(false); notifyDestroyed(); } } }
File : Snooze.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 import java.util.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import java.util.Timer; import java.util.TimerTask;public class Snooze extends MIDlet implements ItemStateListener, CommandListener {
private Display display; // Reference to display object private Form fmMain; // The main form
private Command cmSnooze; // Start the timer
private Command cmReset; // Reset to current date/time private Command cmExit; // Exit the MIDlet
private DateField dfSnoozeTime; // How long to snooze
private int dateIndex; // Index of the DateField on the Form private Date currentTime; // Current time...changes when pressing reset
private Timer tmSnooze; // The timer - keeps track of system time
private SnoozeTimer ttSnooze; // Called by the timer
private boolean dateOK = false; // Was the user input valid?
public Snooze(){
display = Display.getDisplay(this);
fmMain = new Form("When to sound the alarm:");
currentTime = new Date();
dfSnoozeTime = new DateField("", DateField.DATE_TIME); dfSnoozeTime.setDate(currentTime);
cmSnooze = new Command("Snooze", Command.SCREEN, 1); cmReset = new Command("Reset", Command.SCREEN, 1); cmExit = new Command("Exit", Command.EXIT, 1); dateIndex = fmMain.append(dfSnoozeTime); fmMain.addCommand(cmSnooze); fmMain.addCommand(cmReset); fmMain.addCommand(cmExit); fmMain.setCommandListener(this); fmMain.setItemStateListener(this); }
public void startApp (){ display.setCurrent(fmMain); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void itemStateChanged(Item item) { if (item == dfSnoozeTime) { if (dfSnoozeTime.getDate().getTime() < currentTime.getTime()) dateOK = false; else dateOK = true; } }
public void commandAction(Command c, Displayable s) { if (c == cmSnooze) {
if (dateOK == false) {
Alert al = new Alert("Unable to set alarm",
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 al.setTimeout(Alert.FOREVER); al.setType(AlertType.ERROR); display.setCurrent(al); } else {
tmSnooze = new Timer(); ttSnooze = new SnoozeTimer();
long amount = dfSnoozeTime.getDate().getTime() – currentTime.getTime(); tmSnooze.schedule(ttSnooze,amount); fmMain.removeCommand(cmSnooze); fmMain.removeCommand(cmReset); fmMain.delete(dateIndex); fmMain.setTitle("Snoozing..."); } } else if (c == cmReset) {
dfSnoozeTime.setDate(currentTime = new Date()); } else if (c == cmExit) {
destroyApp(false); notifyDestroyed();
} }
private class SnoozeTimer extends TimerTask { public final void run() {
Alert al = new Alert("Time to wake up!"); al.setTimeout(Alert.FOREVER); al.setType(AlertType.ALARM); AlertType.ERROR.playSound(display); display.setCurrent(al); cancel(); } } }
Modul 4 MIDlet(Third Session)
Interface dan Pemberitahuan Pengguna Advance.
Pada Sesi ini akan kita bahas tentang penggunaan Alert dan Ticker yang terdapat pada
MIDlet.
Terkadang saat pengguna menjalankan suatu program, dapat saja pengguna salah
memasukkan bilangan ataupun huruf / salah dalam melakukan pilihan. Terkadang
kesalahan tersebut dapat membuat program tidak berjalan sebagaimana mestinya.
Oleh karena itu perlu adanya pemberitahuan informasi / warning kepada pengguna
saat menjalankan program.
Berikut ini akan kita bahas mengenai Alert terlebih dulu. Kita lihat contoh Alert
berikut ini :
File : ModalAlert.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;public class ModalAlert extends MIDlet implements CommandListener {
private Display display; // Reference to Display object private Form fmMain; // Main form
private Alert alTest; // Alert to show text and image
private Command cmExit; // Command to exit the MIDlet
public ModalAlert() {
display = Display.getDisplay(this);
cmExit = new Command("Exit", Command.SCREEN, 1); fmMain = new Form("Welcome");
fmMain.append("Text string inside the Form"); fmMain.addCommand(cmExit);
fmMain.setCommandListener(this); }
public void startApp() {
showAlert();
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
public void showAlert() {
try {
Image im = Image.createImage("/../res/coffee.png"); alTest = new Alert("New Alert", "Time for more Java", im, AlertType.INFO);
alTest.setTimeout(Alert.FOREVER);
}
catch(Exception e) {
49 50 51 52 53 54 55 56 57 58 59 60 61 62 } display.setCurrent(alTest, fmMain); }
public void commandAction(Command c, Displayable s) { if (c == cmExit) { destroyApp(true); notifyDestroyed(); } } }
Hasilnya akan anda lihat seperti berikut ini :
Pada MIDlet ini ada beberapa hal yang dipelajari, yaitu tentang meloading gambar
berekstesi png dan memberikan Alert saat event tertentu. Seperti kita lihat pada baris
39 sampai baris 43. Disini diberikan Alert yang berupa gambar dan pesan teks. Saat
pengaktifannya adalah pada saat loading aplikasi (baris 24). Waktu untuk suatu Alert
dapat diset sesuai keinginan. Seperti pada aplikasi di atas, diset dengan waktu tak
terhingga (baris 43).
Alert yang ditampilkan disini adalah berupa gambar, selain itu juga ada Alert yang
berupa suara yang dihasilkan dari perangkat genggam. Hal ini akan kita pelajari lebih
lanjut pada pertemuan lain.
Mengenai loading suatu gambar, disini gambar yang digunakan adalah coffee.png
dengan ukuran 39 x 41 pixel dan 96 dpi, 24 bit gambar.
Peletakkan gambar disitu dituliskan pada alamat “/../res/coffee.png”, berarti berada
pada alamat [direktori Aplikasi WTK ]/ModalAlert/res. Ini perlu diingat bahwa
bentuk penulisan untuk alamat pada MIDlet adalah seperti berikut ini. Jika berbeda,
maka gambar tidak akan ditemukan oleh MIDlet.
Piranti genggam untuk versi agak lama masih hanya dapat memuat gambar png.
Sedangkan untuk yang terbaru (kebanyakan sudah support MMS) bahkan sudah dapat
memuat gambar JPG. Ini tergantung dari vendor yang membuat menyertakan
kemampuan ini atau tidak.
Selain dengan Alert, informasi juga dapat diberikan dalam bentuk tulisan yang
muncul saat aplikasi sedang berjalan. Bentuk seperti ini sama seperti pada HTML
dimana kita melihat adanya tulisan berjalan di layar (marquee). Pada MIDlet disebut
sebagai Ticker. Mari kita lihat bentuk Ticker dalam contoh program berikut ini :
File :
SharedTicker.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 import javax.microedition.midlet.*; import javax.microedition.lcdui.*;public class SharedTicker extends MIDlet implements CommandListener { private Display display; // Reference to Display object
private List lsProducts; // Main productlist
private Alert alHelp; // Alert to show text and image private Ticker tkSale; // Ticker of what's on sale
private Command cmExit; // Command to exit the MIDlet
public SharedTicker() {
display = Display.getDisplay(this);
cmExit = new Command("Exit", Command.SCREEN, 1);
tkSale = new Ticker("Current Sale: Torchiere Lamp only $29.00");
lsProducts = new List("Products", Choice.IMPLICIT); lsProducts.append("Floor Lamp", null);
lsProducts.append("Chandelier", null); lsProducts.append("Help", null); lsProducts.addCommand(cmExit); lsProducts.setCommandListener(this); lsProducts.setTicker(tkSale); }
public void startApp() {
display.setCurrent(lsProducts); }
public void pauseApp() { }
public void destroyApp(boolean unconditional) { }
public void showAlert() { try {
Image im = Image.createImage("/../res/help.png"); alHelp = new Alert("Help Information",
"Over 300 unique lighting products!", im, null);
alHelp.setTimeout(5000); alHelp.setTicker(tkSale);
}
catch(Exception e) {
System.out.println("Unable to read png image."); }
display.setCurrent(alHelp, lsProducts);
}
public void commandAction(Command c, Displayable s) {
if (c == List.SELECT_COMMAND) {
switch (lsProducts.getSelectedIndex()) { case 0:
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 break; case 1: System.out.println("Chandelier selected"); break; case 2: showAlert(); break; } } else if (c == cmExit) { destroyApp(true); notifyDestroyed(); } } }
Hasilnya tampak seperti berikut ini :
Disini tampak pada display atas terdapat tulisan berjalan yang berisi informasi.
Aplikasi tetap berjalan, dimana kita masih tetap bisa memilih pilihan yang berada di
bawahnya. Untuk mengaktifkan Ticker ini dilihat pada baris ke 24. Selain itu disini
juga diperlihatkan bahwa Ticker juga dapat digabungkan dengan suatu alert. Dimana
Alert disini adalah diaktifkan saat memilih Help. (lihat baris 39 s/d 43).
Fungsi Ticker kebanyakan digunakan sebagai tempat memberikan informasi produk /
iklan , karena sifatnya yang tidak mengganggu daripada keseluruhan aplikasi. Ticker
hanya mengambil tempat di atas layar dan bergerak secara kontinu.
Modul 5 MIDlet (Fourth Session)
Record Store Manager (RMS).
Pada pokok bahasan kali ini bersifat agak panjang dan menyeluruh. Disini suatu
MIDlet akan dibawa pada tahapan lebih lanjut, dimana suatu MIDlet juga dapat
menyimpan informasi data. Data yang disimpan tidak bersifat sementara, tetapi akan
tetap tersimpan meskipun aplikasi ditutup atau piranti dimatikan. Disini informasi
disimpan dalam bentuk suatu file pada tempat dimana aplikasi RMS dijalankan. File
ini sifatnya tetap ada dan memakan memori dari piranti. Aplikasi ini bisa digunakan
untuk mungkin penyimpanan data yang mempunyai kemampuan simpan sebesar
memori yang ada di piranti genggam tersebut. Bahkan ada kemungkinan data ini
dapat digunakan oleh aplikasi lain yang dapat membaca file data tersebut.
Berikut ini adalah beberapa langkah untuk membuat suatu Manajemen RMS :
1. Buat MIDlet untuk membuat RMS baru.
2. MIDlet untuk memberikan informasi RMS yang ada.
3. MIDlet untuk memasukkan data baru ke RMS.
4. MIDlet untuk menampilkan data yang dimasukkan ke RMS.
5. MIDlet untuk mengganti data RMS yang ada.
6. MIDlet untuk menghapus data pada RMS yang ada.
7. MIDlet untuk menutup RMS.
8. MIDlet untuk menghapus RMS.
Kedelapan langkah ini harus dibuat terlebih dahulu baru kemudian digabungkan
menjadi satu aplikasi, sehingga dapat berjalan sebagaimana Manajemen database
RMS berjalan.
Catatan : disini tiap MIDlet dapat berdiri sebagai class sendiri, tapi sebaiknya diketik
semua terlebih dahulu baru kemudian dikompilasi. Jadi satu JAR.
1. Buat MIDlet untuk membuat RMS baru.
File : newDatabaseRMS.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 /** Deskripsi: Membuat RecordStore pada MIDlet *
*/
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(){ }
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
public void startApp() {
display = Display.getDisplay(this); f = new Form("Pemrograman RMS");
t = new TextField("Nama Record Store",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{
// Buat Database Baru
myDb = RecordStore.openRecordStore(t.getString(),true); tck.setString("Database " + t.getString() + " berhasil dibuat"); display.setCurrent(f); }catch(RecordStoreException e){ // Ada kesalahan
// Saat ini tidak ditangani
tck.setString("Ada kesalahan pembuatan database"); display.setCurrent(f);
}
}
// Fungsi untuk keluar public void keluar(){ this.destroyApp(true);
}
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
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() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
}
2. MIDlet untuk memberikan informasi RMS yang ada.
File : informasiRMS.java
1 2 3 4 5 6 7 8 9 10 11 /** Deskripsi: Menampilkan daftar database/RecordStore yang ada * untuk bisa dihapus
* */ import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
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);
}
// Fungsi untuk keluar
public void keluar(){ this.destroyApp(true);
}
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
public void commandAction(Command c, Displayable d){ String lbl = c.getLabel();
if(lbl.equals("Keluar")){ keluar();
}
}
public void pauseApp() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
}
3. MIDlet untuk memasukkan data baru ke RMS.
File : tambahDataRMS.java
1 2 3 4 5 /** Deskripsi: Menambah data pada RecordStore pada MIDlet *
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 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 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 tambahData(){
f2 = new Form("Tambah data pada " + t.getString()); 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);
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 }catch(RecordStoreNotOpenException e){ // do nothing }catch(RecordStoreException e){ // do nothing } }
public void bukaDb(){ try{
// Buka database yang sudah ada
myDb = RecordStore.openRecordStore(t.getString(),false); tck.setString("Database " + t.getString() + " berhasil dibuka"); tambahData(); }catch(RecordStoreNotFoundException e){ // Ada kesalahan
// Saat ini tidak ditangani
tck.setString("Tidak ditemukan database yang dimaksud");
display.setCurrent(f);
}catch(RecordStoreException e){
}
}
// Fungsi untuk keluar public void keluar(){ // Tutup database dahulu try{
myDb.closeRecordStore();
this.destroyApp(true);
}catch(RecordStoreNotOpenException e){
System.out.println("Gagal tutup Record Store");
}catch(RecordStoreException e){ // do nothing }catch(NullPointerException e){ this.destroyApp(true); } }
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
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() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
}
4. MIDlet untuk menampilkan data yang dimasukkan ke RMS.
File :
1 2 3 4 5 /** Deskripsi: Menampilkan data pada RecordStore pada MIDlet *
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 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); 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;
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(); dt.append(in,null); } display.setCurrent(f2); }catch(IOException e){ }catch(RecordStoreNotOpenException e){ // do nothing }catch(RecordStoreException e){
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 display.setCurrent(f2); } }
public void kembali(){ tck.setString(""); display.setCurrent(f);
}
public void bukaDb(){ try{
// Buka database yang sudah ada
myDb = RecordStore.openRecordStore(t.getString(),false); tck.setString("Database " + t.getString() + " berhasil dibuka"); tampilkan(); }catch(RecordStoreNotFoundException e){ // Ada kesalahan
// Saat ini tidak ditangani tck.setString(
"Tidak ditemukan database yang dimaksud"); display.setCurrent(f);
}catch(RecordStoreException e){
}
}
// Fungsi untuk keluar public void keluar(){ // Tutup database dahulu try{
myDb.closeRecordStore();
this.destroyApp(true);
}catch(RecordStoreNotOpenException e){
System.out.println("Gagal tutup Record Store");
}catch(RecordStoreException e){ // do nothing }catch(NullPointerException e){ this.destroyApp(true); } }
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
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() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
}
5. MIDlet untuk mengganti data RMS yang ada.
File :
gantiDataRMS.java1 2 3
/*
* Nama File: gantiDataRMS.java
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 * */
// jangan lupa import paket ini 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;
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()){ int recId = enum.nextRecordId();
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 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(); 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){
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 display.setCurrent(f2); }catch(RecordStoreNotOpenException e){ }catch(RecordStoreException e){
tck.setString("Ada kesalahan RecordStore"); display.setCurrent(f2);
}
}
public void bukaDb(){ try{
// Buka database yang sudah ada
myDb = RecordStore.openRecordStore(t.getString(),false); tck.setString("Database " + t.getString() + " berhasil dibuka"); tampilkan(); }catch(RecordStoreNotFoundException e){ // Ada kesalahan
// Saat ini tidak ditangani tck.setString(
"Tidak ditemukan database yang dimaksud"); display.setCurrent(f);
}catch(RecordStoreException e){
}
}
// Fungsi untuk keluar public void keluar(){ // Tutup database dahulu try{
myDb.closeRecordStore();
this.destroyApp(true);
}catch(RecordStoreNotOpenException e){
System.out.println("Gagal tutup Record Store");
}catch(RecordStoreException e){ // do nothing }catch(NullPointerException e){ this.destroyApp(true); } }
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
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() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
6. MIDlet untuk menghapus data pada RMS yang ada.
File :
hapusDataRMS.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 /** Nama File: hapusDataRMS.java
* Deskripsi: Menghapus data pada RecordStore pada MIDlet * */ 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;
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()){
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
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 hapusData()
{
try{
// Ambil informasi data yang dipilih untuk dihapus
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){
}catch(RecordStoreException e){
tck.setString("Ada kesalahan RecordStore"); display.setCurrent(f2);
}
}
public void bukaDb(){ try{
// Buka database yang sudah ada
myDb = RecordStore.openRecordStore(t.getString(),false); tck.setString("Database " + t.getString() + " berhasil dibuka");
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 tampilkan(); }catch(RecordStoreNotFoundException e){ // Ada kesalahan
// Saat ini tidak ditangani tck.setString( "Tidak ditemukan database yang dimaksud"); display.setCurrent(f);
}catch(RecordStoreException e){
}
}
// Fungsi untuk keluar public void keluar(){ // Tutup database dahulu try{
myDb.closeRecordStore();
this.destroyApp(true);
}catch(RecordStoreNotOpenException e){
System.out.println("Gagal tutup Record Store");
}catch(RecordStoreException e){ // do nothing }catch(NullPointerException e){ this.destroyApp(true); } }
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
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("Hapus")){ hapusData(); } }
public void pauseApp() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
}
7. MIDlet untuk menutup RMS.
File :
closeDatabaseRMS.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 /** Nama File: closeDatabaseRMS.java
* Deskripsi: Menutup RecordStore pada MIDlet *
*/
import javax.microedition.rms.*;
import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
public class closeDatabaseRMS extends MIDlet implements CommandListener
{
private Display display;
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
new Command("Tutup DB",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 closeDatabaseRMS(){ }
public void startApp() {
display = Display.getDisplay(this);
f = new Form("Pemrograman RMS");
t = new TextField("Nama Record Store",null,32, TextField.ANY); tck = new Ticker(""); f.append(t); f.addCommand(closeCmd); f.addCommand(exitCmd); f.setCommandListener(this); f.setTicker(tck); display.setCurrent(f); }
public void buatDb(){ try{
// Buka database yang sudah ada
myDb = RecordStore.openRecordStore(t.getString(),false); myDb.closeRecordStore(); tck.setString("Database " + t.getString() + " tidak ada"); display.setCurrent(f); }catch(RecordStoreException e){ // Ada kesalahan
// Saat ini tidak ditangani
tck.setString("Ada kesalahan pembuatan database"); display.setCurrent(f);
}
}
// Fungsi untuk keluar public void keluar(){ this.destroyApp(true);
}
// Ini adalah fungsi pada interface CommandListener // yang harus diimplementasikan
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() { // Do Nothing
}
public void destroyApp(boolean unconditional){ notifyDestroyed();
}
8. MIDlet untuk menghapus RMS.
File :
hapusDatabaseRMS.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 /** Nama File: hapusDatabaseRMS.java
* Deskripsi: Menampilkan daftar database/RecordStore yang ada * untuk bisa dihapus
* */ import javax.microedition.rms.*; import java.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*;
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); }
// Fungsi untuk hapus database public void hapusDb(){
try{
// Ambil informasi database yang dipilih untuk dihapus String dbName = dt.getString(dt.getSelectedIndex()); dt.delete(dt.getSelectedIndex());
RecordStore.deleteRecordStore(dbName);
tck.setString("Database " + dbName + " telah dihapus"); display.setCurrent(f);
}catch(RecordStoreNotFoundException e){ }catch(RecordStoreException e){
tck.setString("Ada kesalahan pada Record Store"); display.setCurrent(f);