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) { } public void commandAction(Command cmd, Displayable disp) { if (cmd == cmdExit) { 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: cmdExit = new Command(“Keluar”, Command.SCREEN, 2);
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 =
new Command("Normal", Command.SCREEN, 2); cmdDisplayDate = new Command("Display Date", Command.SCREEN, 2); dateFormat = DATE_FORMAT_USA;
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
} 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); } } } class TextBoxListener2 implements CommandListener {
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 private private private private private
Display display; Command cmdExit; Command cmdPilih; Command cmdOK; Form form1; 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); String[] tempType = {"Celsius", "Farenheit"}; 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 private Command cmExit; // A Command to exit the MIDlet
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; private int selectAllIndex; private ChoiceGroup cgPrefs;
// View the choice selected // Index of the "Select All" option // 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 Stuff"); frmMain.append(txfSize); 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 import import import import
java.util.*; javax.microedition.midlet.*; javax.microedition.lcdui.*; java.util.Timer; 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", "Please choose another date and time.", null, null);
al.setTimeout(Alert.FOREVER); al.setType(AlertType.ERROR); display.setCurrent(al); } else { tmSnooze = new Timer(); ttSnooze = new SnoozeTimer();
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
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) { System.out.println("Unable to read png image.");
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: System.out.println("Floor Lamp selected");
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
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); }
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 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 import import import
javax.microedition.rms.*; java.io.*; javax.microedition.midlet.*; 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 import import import
javax.microedition.rms.*; java.io.*; javax.microedition.midlet.*; 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);
}catch(RecordStoreNotOpenException e){ // do nothing }catch(RecordStoreException e){ // do nothing }
73 74 75 76 77 78 79 80 81 82 83 84
} 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){ } }
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
// 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 import import import
javax.microedition.rms.*; java.io.*; javax.microedition.midlet.*; 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){ tck.setString("Ada kesalahan RecordStore");
display.setCurrent(f2);
71 72 73 74 75 76 77 78 79 80 81 82 83 84
} } 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){ } }
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
// 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.java 1 2 3
/* * Nama File: gantiDataRMS.java * Deskripsi: Mengganti data pada RecordStore pada MIDlet
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(); bais =
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){ tck.setString("Ada kesalahan I/O");
display.setCurrent(f2); }catch(RecordStoreNotOpenException e){ }catch(RecordStoreException e){ tck.setString("Ada kesalahan RecordStore"); display.setCurrent(f2); }
128 129 130 131 132 133 134 135 136 137 138 139 140 141
}
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){ } }
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
// 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 import import import
javax.microedition.rms.*; java.io.*; javax.microedition.midlet.*; 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; private Command closeCmd =
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
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 }
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(); }
63 64 65 66 67 68 69 70 71 72 73 74 75
closeDatabaseRMS(){
}
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 import import import
javax.microedition.rms.*; java.io.*; javax.microedition.midlet.*; 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); }
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
} // 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("Hapus")){ hapusDb(); } } public void pauseApp() { // Do Nothing } public void destroyApp(boolean unconditional){ notifyDestroyed(); } }
Untuk proses pada WTK, tambahkan pada Setting Æ MIDlets semua nama class yang terkait pada Manajemen RMS ini. Beri nama MIDlet dengan nama Database.
Kompilasi dan jalankan. Kemudian cobalah anda menambahkan data / menghapus RMS yang telah anda buat. Perhatikan, bahwa disini tiap class dibuat secara berbeda, tetapi mengambil file data yang sama. Pada Emulator file database disimpan pada direktori [ Direktori WTK ]/appdb berekstensi *.db
Selamat mencoba !!!!