Anda di halaman 1dari 109

Politeknik Elektronika Negeri Surabaya

Praktikum

Overview
1 Arsitektur J2ME

1.1. Tujuan:
Setelah selesai praktikum ini, kita dapat menjalankan aplikasi platform Java 2, dan dapat
menjalankan aplikasi J2ME wireless toolkit.

1.2. Latihan: Menjalankan Aplikasi Wireless Toolkit


Pada latihan ini kita dapat menyelesaikan langkah-langkah sbb:
• Menjalankan Aplikasi J2ME Wireless Toolkit
• Membuka contoh-contoh project, dan membuat project baru.
Tujuan dari latihan ini adalah mengenal lebih jauh dengan aplikasi J2ME Wireless Toolkit
environment, dan kemudian anda dapat membuka contoh-contoh project yang anda pilih.
Persiapan
Tidak ada persiapan dari latihan ini.
Langkah — Menjalankan Aplikasi J2ME Wireless Toolkit
Ikuti step ini:
1. Buka window terminal dan ketikkan perintah sebagai berikut :
cd\wtk22\bin <ENTER>
Perintah ini, akan membawa anda ke Home directory
2. Untuk memulai J2ME wireless Toolkit, ketikkan perintah sebagai berikut :
ktoolbar <ENTER>
Maka selanjutnya, aplikasi J2ME Wireless Toolkit akan dijalankan.
3. Kemudian buka contoh-contoh project yang kamu pilih dan buatlah settingan yang pas
mengenai toolkit tersebut. Pilih Open Project->Demos->Build->Run

Riyanto Sigit J2ME - 1


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

Membangun dan
2 Menjalankan Aplikasi MIDP

2.1. Tujuan:
Setelah selesai praktikum ini, kita dapat:
• Menulis dan membangun aplikasi (MIDlet) mobile information device profile (MIDP)
• Memeriksa sebuah device apakah dapat berjalan pada sebuah MIDlet

2.2. Latihan 1: Menulis dan membangun sebuah MIDlet


Pada latihan ini kita membuat class extend class abstrak MIDlet.
Tujuan latihan ini mengembangkan aplikasi utama class untuk suatu game berjudul
StarShipBattle 2004 dan mengendalikan jalannya aplikasi game StarShipBattle 2004 (Life
Cycle)
Kita mengembangkan aplikasi dalam satu rangkaian latihan dimana latihan tersebut dapat
menambah feature dan fungsi dari game. Pada latihan ini kita membuat class utama
StarShipBattle.java.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Membuat class dimana class tersebut merupakan Extend dari MIDlet class
Copy file pada lokasi direktori ..\apps\Lab2_Exercise1\src dan ikuti step ini:
1. Mengimplementasikan StarShipBattle constructor.
Gunakan method System.out.println(String s) untuk mengeluarkan pesan bahwa aplikasi
sedang berjalan.
2. Mengimplementasikan method berikut untuk memberi fungsi aplikasi start, stop, dan

pause :
a. starApp() – Gunakan System.out.println (String S) untuk mengeluarkan nama
method yang dipanggil.

Riyanto Sigit J2ME - 2


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

b. pauseApp() – Gunakan System.out.println (String S) untuk mengeluarkan nama


method yang dipanggil.
c. destroyApp() – Gunakan System.out.println (String S) untuk mengeluarkan nama
method yang dipanggil.

2.3. Latihan 2: Memeriksa sebuah device apakah dapat berjalan pada


sebuah MIDlet
Pada langkah ini, kita modifikasi klas StarShipBattle.java dari latihan no.1 untuk memastikan
game berjalan dengan baik. Kita harus memeriksa terlebih dahulu apakah aplikasi support
dengan versi MIDP dan J2ME konfigurasi platform. Anda meminta property default dari device
yang menyediakan setting Microedition-Profile dan Microedition-Configuration dari Java
Application Descriptor (JAD). Lalu kita bandingkan properties dengan menetapkan nomor
versinya :
• Jika nomor versi cocok, kirimkan output ke console yang indikasinya cocok dengan
nomor.
• Jika setting tidak cocok, kirimkan output ke console dan keluar dari aplikasi.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Ubah file StarShipBattle.java
Copy file pada lokasi direktori ..\apps\Lab2_Exercise2\src dan ikuti langkah berikut ini:
1. Tetapkan private properties dalam file class StarShipBattle
• profileVersion = “MIDP-2.0”
• configVersion = “CLDC-1.0”
2. Ubah StarShipBattle constructor untuk mendapatkan Atribut Microedition-Profile dan
Microedition-Configuration dari file JAD.
3. Dalam constructor, bandingkan setting dengan atribut yang terdapat pada langkah 1.
• Jika settingnya sama, lalu keluarkan informasi ke console
• Jika settingnya tidak sama, lalu matikan aplikasi. Panggil destroyAPP() yang
diikuti oleh notifiedDestroy() untuk mematikan aplikasi dengan sempurna.

Riyanto Sigit J2ME - 3


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

2.4. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.
Latihan 1—Membuat class dimana class tersebut merupakan Extend dari MIDlet class
Program 2-1 adalah contoh membuat class dimana class tersebut merupakan Extend dari MIDlet
class

import javax.microedition.midlet.*;

public class StarShipBattle extends MIDlet{

public StarShipBattle(){
System.out.println("Loading the application...");
}

public void startApp(){


System.out.println("in the startApp()");
}

public void pauseApp(){


System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}

Riyanto Sigit J2ME - 4


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Latihan 2— Memeriksa sebuah device apakah dapat berjalan pada sebuah MIDlet
Program 2-2 adalah contoh Memeriksa sebuah device apakah dapat berjalan pada sebuah MIDlet
import javax.microedition.midlet.*;

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
destroyApp(true);
notifyDestroyed();
}
}

public void startApp(){


System.out.println("in the startApp()");
}

public void pauseApp(){


System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}
}

Riyanto Sigit J2ME - 5


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

Membuat High-Level
3 User Interface

3.1. Tujuan:
Setelah selesai praktikum ini, kita dapat:
• Menampilkan pesan pada MIDlet Screen
• Mengimplementasikan input user interface
• Menangani input user lewat Item state changes
• Menguji data form menggunakan command object
• Mengimplementasikan sistem menu

3.2. Latihan 1: Menampilkan pesan pada MIDlet Screen


Pada latihan ini kita mengembangkan menu utama pada game.
Tujuan dari latihan ini untuk mulai pengembangan Starshipbattle 2004 game. Menu utama yang
dikembangkan terdiri dari tiga aneka pilihan yaitu :

• Start Game
• Set Options
• End Game
Pada latihan berikutnya bisa menambahkan fungsi untuk masing-masing pilihan menu. Tiap item
menu yang ditunjukkan kepada user disimpan dalam String[] array.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Mengembangkan menu utama pada game
Pada langkah ini kita mengembangkan menu utama untuk game StarShip Battle 2004. Kita buat
sebuah class baru MainMenu dan ubah class StarShipBattle.
Copy file pada lokasi direktori ..\apps\Lab2_Exercise2\src dan ikuti langkah berikut ini:

Riyanto Sigit J2ME - 6


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

1. Tetapkan klas baru yang disebut klas MainMenu yang berisi unsur-unsur untuk menu
layar. Menu utama harus berisi properties dan atribut berikut :
• Properties :
• String[] menuList – Tunjukkan masing-masing menu item dan menyimpan teks
string berikut :
Start Game
Set Options
End Game
• List menu – adalah daftar screen object yang ditempatkan pada display untuk
user.
• Display deviceDisplay – adalah display object yang digunakan tempat atribut
menuList pada display.
• Constructor – MainMenu(Display d)
Ini adalah default constructor yang digunakan untuk inisial properties pada class
MainMenu. Display object yang dilewati sebagai parameter yang disimpan di
mainDisplay property ketika kita me-List object, set tipe ke Choice.IMPLICIT.
• Method – showMenu()
Metode ini mengimplementasikan fungsi yang diperlukan untuk tempat atribut
menuList pada peralatan display.
2. Untuk mengubah StarShipBattle class, ikuti langkah-langkah berikut :
a. Import paket javax.microedition.lcdui
b. Panggil showMenu() method dari dalam startApp() untuk instantiate dan display
MainMenu object

3.3. Latihan 2: Mengimplementasikan input user interface


Pada latihan ini kita mengembangkan sebuah user input screen.
Tujuan dari latihan ini untuk mengembangkan user input screen yang membolehkan para user
untuk memasukkan nama dan nicknamenya. Aplikasi harus memajang form pada user untuk
entri data ketika user memilih set options dari layar menu utama. Di latihan berikutnya
menambahkan fungsi untuk menyimpan dan mendapatkan informasi.

Riyanto Sigit J2ME - 7


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Mengembangkan sebuah user input screen
Pada langkah ini kita menetapkan sebuah class baru yang disebut class UserOptions.
Copy file pada lokasi direktori ..\apps\Lab3_Exercise1\src dan ikuti langkah berikut ini:
1. Tetapkan class UserOptions dengan mengikuti properties, constructor dan method :
• Properties :
• Form inputForm – mengatur input component
• TextField name – mengijinkan user untuk memasukkan nama lengkap mereka
menggunakan berbagai karakter.
• TextField alias – mengijinkan user untuk memasukkan nama alias
menggunakan berbagai karakter.
• Diplay deviceDisplay – memelihara referensi untuk mendisplay peralatan
untuk mendukung kemampuan untuk display object inputForm user.
• Constructor – UserOptions(Display d)
Inisial contructor dan membuat object inputForm. Display object yang dilewati
untuk contructor disimpan dalam deviceDisplay property.
• Method – showUserOpt()
Method di set pada object inputForm sebagai display object sekarang.
2. Membuat perubahan pada StarShipBattle class berikut :
a. Berikan komentar kode dalam method startApp()yang diinisialisasi dan displays
MainMenu
b. Deklarasikan dan inisialisasi object UserOptions.
c. Panggil method showUserOpt().

3.4. Latihan 3: Menangani input user lewat Item state changes


Pada latihan ini kita mengimplementasikan interface ItemStateListener.
Tujuan dari latihan ini adalah untuk mengimplementasikan ItemStateListener interface.
Interface ItemStateListener berpengaruh pada form UserOptions yang dibuat pada latihan
sebelumnya untuk memberitahu perubahan-perubahan pada user. Pemberitahuan ini dikenalkan
dalam form Alert object pada display.

Riyanto Sigit J2ME - 8


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Mengimplementasikan interface ItemStateListener
Pada langkah ini kita menetapkan sebuah class baru yang disebu class UserOptions.
Setelah mengkopi file dilokasi direktori ..\apps\Lab3_Exercise2\src ubah class UserOption untuk
mengimplementasikan interface ItemStateListener dengan mengikuti langkah berikut ini:
1. Definisikan dengan mengikuti empat properties baru dalam klas UserOptions :
• String nameAlertText – string dari text yang dipertunjukkan pada user ketika
nilai nama object TextField berubah
• String aliasAlertText – string dari text yang diperkenalkan pada user ketika nilai
alias object TextFiled berubah.
• Image okImage – Image object yang diperkenalkan pada user di object Alert.
• Alert updateAlert – Alert object yang ditunjukkan ketika informasi di inputForm
berubah.
2. Ubah UserOptions(Diplay d) constructor sebagai berikut :
a. Tambahkan fungsi untuk menjalankan file okImage. Image disimpan di file
labdir\res\dukeok8.png
b. Tambahkan fungsi untuk membuat instance updateAlert yang mempunyai properties :
• Title : Data Changed
• AlertText : null
• Image : okImage
• Alert Type : AlertType.CONFIRMATION
c. Set updateAlert timeout menjadi Alert.FOREVER
d. Register inputForms ItemStateListener untuk the UserOptions class
3. Definisikan dengan mengikuti empat properties baru dalam klas UserOptions :
• String nameAlertText – string dari text yang dipertunjukkan pada user ketika nilai
nama object TextField berubah
• String aliasAlertText – string dari text yang diperkenalkan pada user ketika nilai alias
object TextFiled berubah.
• Image okImage – Image object yang diperkenalkan pada user di object Alert.

Riyanto Sigit J2ME - 9


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• Alert updateAlert – Alert object yang ditunjukkan ketika informasi di inputForm


berubah.

3.5. Latihan 4: Menguji data form menggunakan command object


Pada latihan ini kita membuat command object dan menempatkan form UserInput pada klas
UserOptions. Kita juga dapat mengimplementasikan interface command listener untuk
menghubungkan kejadian yang disebabkan ketika user invoke command.
Dalam latihan ini interface ItemStateListener memberitahukan user ketika data berubah pada
form userOptions. Dengan implmentasi ini user diberitahu perubahan setiap kali key ditekan.
Implementasi ini tidak praktis dan kemungkinan besar menganggu para user ketika mereka
mengubah informasi pada form userInput.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Mengubah class UserOption
Pada langkah ini kita memodifikasi class UserOptions.
Copy file pada lokasi direktori ..\apps\Lab3_Exercise3\src. Ubah implementasi interface untuk
interface CommandListener dan ikuti step ini:
1. Tambahkan properties berikut :
a. Tambahkan perintah saveData property.
Propertis ini menghadirkan perintah memilih user ketika mengisikan data lengkap pada
form.
b. Tambahkan String saveAlertText propery dan set nilai string menjadi “Data Save”.
2. Di UserOptions(Display d) contructor, In the UserOptions(Display d) contructor,
laksanakan step ini :
a. instantiate adalah hal dari perintah saveData menggunakan properties berikut :
• Label: Save
• Command Type : Command OK
• Priority : 1
b. Tambahkan perintah objek saveDataAdd untuk objek inputForm.
c. Daftarkan UserOptions class sebagai perintah listener untuk objek inputForm.
d. Berikan komentar untuk program yang memanggil setItemStateLsitener() method.

Riyanto Sigit J2ME - 10


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

3. Tambahkan method commandAction(Command c, Displayable d) pada UserOptions class,


dan ikuti langkah berikut :
a. Uji perintah yang dilewati dan jika sama dengan perintah saveData lalu set teks
updateAlert menjadi saveAlertText.
b. Panggil method showAlertUpdate()pada display alert.
4. Berikan komentar pada method itemStateChanged(Item i).

3.6. Latihan 5: Mengimplementasikan menu sistem.


Pada latihan ini, lengkapi langkah berikut :
• Implementasikan menu system menggunakan List screen dan Command objek.
• Implementasikan menu system menggerakkan antar screen.
Tujuan dari latihan ini untuk mengimplementasikan fungsi yang dibutuhkan untuk melengkapi
menu system game StarShipBattle 2004. Kita juga dapat mengubah userOptions klas untuk
mengijinkan user kembali ke menu utama.
Untuk melengkapi latihan ini ubah klas mainMenu untuk :
• Display objek Alert ketika user memilih menu Start pada game.
• Display UserInput screen ketika user memilih menu Set option.
• Exit aplikasi ketika user memilih menu Exit pada game
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
langkah 1 – Mengimplementasikan sistem menu menggunakan List Screen dan Command
object.
Copy file pada lokasi direktori ..\apps\Lab3_Exercise4\src dan ikuti step ini:
1. Ubahlah klas MainMenu untuk mengimplementasikan CommandListener interface
2. Hilangkan menuList[] array property
3. Tambahkan properties berikut :
• Command startGame
• Command setOptions
• Command exitGame
• Alert loadingGameAlert

Riyanto Sigit J2ME - 11


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• Gauge loadingGameGauge
• UserOptions optionForm
• StarShipBattle ssb
4. Di MainMenu contructor, laksanakan perintah berikut :
a. Hilangkan menuList array
b. Mengubah menuList instantiation hanya lewat Title dan Type
c. Instantiate pada tiga Command properties dengan menyediakan Titles, Command
types and Priorities
d. Tambahkan Command properties untuk menu property
e. Instantiate loadingGameGauge property demean mengikuti parameter berikut :
• Title : null
• Interactive : false
• Max Value: Gauge.INDEFINITE
• Initial Value: Gauge.CONITONOUS_RUNNING
f. set preferred size dari loadingGameGuage property to -1,-1
g. Instantiate loadingAlert dengan mengikuti parameter berikut :
• Title : Loading Game
• Alert Text : Loading StarShipBattle 2004, Please Standby….
h. Set menu command listener untuk MainMenu object
i. Beri tanda StarShipBattle parameter yang dilewati variable ssb
j. Instantiate objek UserOptions.
5. Tambahkan actionCommand(Command c, Displayable d). Metode ini seharusnya menguji
command object antara masing-masing menu dan mengambil jalan yang tepat dari action
sebagai berikut :
• Start Game – Generate alert dan beritahukan user bahwa game sedang loading.
• LoadingGameGauge object ditunjukkan sebagai bagian dari alert.
• Set Options – Triggers mengubah untuk display UserOptions screen
• Exit Game – Mintakan matikan game yang baik dengan memanggil shutdown()
method pada StarShipBattle object.
6. Buat perubahan sebagai berikut untuk starApp() method pada StarShipBattle class:
a. Memperoleh referensi untuk device display

Riyanto Sigit J2ME - 12


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

b. Instantiate MainMenu object


c. Panggil showMenu() method pada MainMenu object.
7. Tambahkan shutdown() method
Mengimplementasikan metode ini sebaiknya matikan aplikasi dengan permintaan.

Langkah 2 – Mengimplementasikan sistem menu untuk menggerakkan antara screen.


Ubahlah UserOptions class untuk mengijinkan user kembali ke menu utama. Klas ini di
implementasikan begitu setelah Alert Object memberitahukan perubahan pada user, maka
aplikasi kembali pada menu utama. Untuk melengkapi fungsi ini, UserOptions class harus
mempunyai referensi untuk MainMenu class. Buat perubahan UserOption class sebagai berikut :
1. Tambahkan property sebagai berikut :
Displayable mainMenu
2. Tambahkan metode sebagai berikut :
Public void registerMenu(Displayable mm)
Implementasi pada metode ini seharusnya mengambil parameter MainMenu dan
memberikannya untuk mainMenu property dinyatakan pada Step 1.
3. Di showUpdateAlert() method, ubah parameter ke dua menjadi setCurrent() method
untuk mainMenu property
4. Pada MainMenu class contructor, setelah kita membuat userOptions object, panggillah
registerMenu() method menggunakan ini sebagai parameter.

Riyanto Sigit J2ME - 13


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

3.7. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.
Latihan 1— Memperlihatkan pesan pada MIDlet Screen
Program 3-1 adalah contoh file MainMenu.java

import javax.microedition.lcdui.*;

public class MainMenu{

private String[] menuList = { "Start Game", "Set Options", "End Game" };


private List menu;
private Display deviceDisplay;

public MainMenu(Display d){


deviceDisplay = d;
menu = new List("Game Menu", Choice.IMPLICIT, menuList, null);
}

public void showMenu(){


deviceDisplay.setCurrent(menu);
}

Riyanto Sigit J2ME - 14


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 3-2 adalah contoh file StarShipBattle.java.

import javax.microedition.midlet.*;

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
destroyApp(true);
notifyDestroyed();
}
}

public void startApp(){


System.out.println("in the startApp()");
}

public void pauseApp(){


System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}
}

Riyanto Sigit J2ME - 15


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Latihan 2— Mengimplementasikan user input interface


Program 3-3 adalah contoh file UserOptions.java

import javax.microedition.lcdui.*;

public class UserOptions{

private Form inputForm;

private TextField name;


private TextField nickname;

private Display deviceDisplay;

public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


nickname = new TextField("Nickname", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(nickname);

deviceDisplay = d;
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}
}

Riyanto Sigit J2ME - 16


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 3-4 adalah contoh file StarShipBattle.java

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

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
destroyApp(true);
notifyDestroyed();
}
}

public void startApp(){


System.out.println("in the startApp()");

Display d = Display.getDisplay(this);
//MainMenu mm = new MainMenu(d);
//mm.showMenu();
UserOptions uo = new UserOptions(d);
uo.showUserOpt();
}

public void pauseApp(){


System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}
}

Riyanto Sigit J2ME - 17


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Langkah 3— Memasukkan user input melalui user item


Program 3-5 adalah contoh file UserOption.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements ItemStateListener{

private Form inputForm;


private TextField name;
private TextField alias;
private Display deviceDisplay;

private String nameAlertText = "Your name has changed.";


private String aliasAlertText = "Your alias has changed.";

private Image okImage;


private Alert updateAlert;

public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

updateAlert = new Alert("Data Changed", null, okImage,AlertType.CONFIRMATION);


updateAlert.setTimeout(Alert.FOREVER);
inputForm.setItemStateListener(this);
}

Riyanto Sigit J2ME - 18


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void itemStateChanged(Item i){


if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

private void showAlertUpdate(){


deviceDisplay.setCurrent(updateAlert, inputForm);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Riyanto Sigit J2ME - 19


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Langkah 4— Menguji data form menggunakan command object


Program 3-6 adalah contoh file UserOption.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements CommandListener{

private Form inputForm;

private TextField name;


private TextField alias;

private Display deviceDisplay;

private String nameAlertText = "Your name has changed.";


private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";

private Image okImage;


private Alert updateAlert;

private Command saveData;


public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

Riyanto Sigit J2ME - 20


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

updateAlert = new Alert("Data Changed", null, okImage,AlertType.CONFIRMATION);


updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);

saveData = new Command("Save", Command.OK, 1);


inputForm.addCommand(saveData);
inputForm.setCommandListener(this);

}
public void commandAction(Command c, Displayable d){

if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

/*
public void itemStateChanged(Item i){
if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

}
*/
private void showAlertUpdate(){
deviceDisplay.setCurrent(updateAlert, inputForm);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Riyanto Sigit J2ME - 21


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Latihan 5— Mengimplementasikan sistem menu


Program 3-7 adalah contoh file MainMenu.java.

import javax.microedition.lcdui.*;
import java.io.IOException;

public class MainMenu implements CommandListener{


private List menu;
private Display deviceDisplay;

private Command startGame;


private Command setOptions;
private Command exitGame;

private Gauge loadingGameGauge;


private Alert loadingAlert;

private StarShipBattle ssb;


private UserOptions userOptions;
public MainMenu(StarShipBattle mid, Display d){
deviceDisplay = d;

menu = new List("Game Menu", Choice.IMPLICIT);


startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);

menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(exitGame);

loadingGameGauge = new Gauge(null,


false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);

loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,


Please standby...", null, AlertType.INFO);

menu.setCommandListener(this);

ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);

Riyanto Sigit J2ME - 22


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void commandAction(Command c, Displayable d){

if(c == startGame){

startGame();

}else if(c == setOptions){

setOptions();

}else if(c == exitGame){

exitGame();

}
}

public void startGame(){


loadingAlert.setImage(null);
loadingAlert.setIndicator(loadingGameGauge);
deviceDisplay.setCurrent(loadingAlert, menu);
}

public void setOptions(){


userOptions.showUserOpt();
}

public void exitGame(){


ssb.shutDown();
}

public void showMenu(){

deviceDisplay.setCurrent(menu);
}

Riyanto Sigit J2ME - 23


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 3-8 adalah contoh file UserOptions.java.

import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements CommandListener{

private Form inputForm;

private TextField name;


private TextField alias;

private Display deviceDisplay;

private String nameAlertText = "Your name has changed.";


private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";

private Image okImage;


private Alert updateAlert;
private Displayable mainMenu;

private Command saveData;


public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

updateAlert = new Alert("Data Changed", null,


okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);

Riyanto Sigit J2ME - 24


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

saveData = new Command("Save", Command.OK, 1);


inputForm.addCommand(saveData);
inputForm.setCommandListener(this);

}
public void registerMenu(Displayable mm){
mainMenu = mm;
}

public void commandAction(Command c, Displayable d){

if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

/*
public void itemStateChanged(Item i){
if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

}
*/
private void showAlertUpdate(){
deviceDisplay.setCurrent(updateAlert, mainMenu);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Riyanto Sigit J2ME - 25


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 3-9 adalah contoh file StarShipBattle.java.

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

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}

public void startApp(){


System.out.println("in the startApp()");

Display d = Display.getDisplay(this);
MainMenu mm = new MainMenu(this, d);
mm.showMenu();
}

public void pauseApp(){


System.out.println("in the pauseApp()...");
}
public void destroyApp(boolean unc){
System.out.println("in the destroyApp()... ");
}

public void shutDown(){


destroyApp(false);
notifyDestroyed();
}
}

Riyanto Sigit J2ME - 26


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

Membuat Low-Level
4 User Interface

4.1. Tujuan:
Setelah selesai praktikum ini, kita dapat:
• Membuat dan mengimplementasikan splash screen menggunakan Canvas Class
• Mengimplementasikan skip option dalam splash screen

4.3. Latihan 1: Membuat dan Mengimplementasikan Splash Screen


Menggunakan class Canvas
Pada latihan ini kita membuat class baru SplashScreen.
Tujuan dari latihan ini untuk membuat splash screen untuk game StarShip Battle 2004. Membuat
subclass dari Canvas class, mengimplementasikan metode paint() dan menampilkan canvas ke
user.

Class yang dibuat pada beban latihan ini menyediakan image splash screen dan
menghadirkannya di display. Di latihan berikutnya, fungsi dari class meluas untuk
memungkinkan user melewati splash screen.
Persiapan
Untuk menyiapkan latihan ini lakukan setting komputer pada lokasi direktori: labdir = ________
Image yang digunakan pada latihan ini terletak pada lokasi labdir\lab4_exercise\res directory
Langkah — Membuat Class Splash Screen Baru
Copy file pada lokasi direktori labdir\Lab3_Exercise5\src dan ikuti step ini:
1. Buat class baru yang dipanggil SplashScreen class.
2. Tetapkan dua properties:
• Image splashImage
• MainMenu mainMenu
3. Tetapkan default constructor
Riyanto Sigit J2ME - 27
Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Di metode ini memanggil loadSplashImage() yang menetapkan langkah berikutnya .


4. Tetapkan metode berikut :
• loadSplashImage() – metode ini di load titlepage.png file dan menyimpan image
di variable splashImage.
• paint(Graphics g) – Di metode ini, Implementasikan fungsi untuk memberishkan
layar dan memindahkan splashImage pada screen.
5. Buat perubahan berikut di startApp() method pada StarShipBattle class:
a. Pindahkan panggilan pada metode menu utama showMenu()
b. Umumkan dan instantiate adalah dari SpalshScreen
c. Panggil setCurrent metode yang lewat SpalshScreen sebagai parameter

4.3. Latihan 2: Implementasi Skip Option pada Splash Screen


Pada latihan ini kita memperluas class SplashScreen.
Tujuan dari latihan ini untuk menambahkan fungsi yang memungkinkan user untuk skip splash
screen.

Persiapan
Untuk menyiapkan latihan ini lakukan setting komputer pada lokasi direktori: labdir = ________
Copy file pada lokasi direktori labdir\Lab4_Exercise1\src dan ikuti step ini:
1. Tambahkan metode berikut pada SplashScreen class yang dibuat pada latihan
sebelumnya.
• registerMenu(MainMenu m) – Metode ini menyimpan parameter yang dilewati pada
mainMenu property. Parameter MainMenu menyediakan class SplashScreen demean
Display object yang user lihat ketika sembarang key ditekan.
• keyPressed(int keyCode) – Metode ini memungkinkan user untuk menggerakkan
splash screen diluar dan masuk pada menu utama.
2. Di dalam metode startApp() dari StarShipBattle class, panggil metode registerMenu() di
dalam SplashScreen class dan lewati MainMenu object.

Riyanto Sigit J2ME - 28


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

4.4. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.
Latihan 1— Membuat Class Splash Screen Baru
Program 4-1 adalah contoh SplashScreen.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class SplashScreen extends Canvas{

private Image splashImage;


private MainMenu mainMenu;

public SplashScreen(){
loadSplashScreen();
}

public void loadSplashScreen(){


try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}

public void paint(Graphics g){

g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}

Riyanto Sigit J2ME - 29


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 4-2 adalah contoh StarShipBattle.java


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

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}

public void startApp(){


System.out.println("in the startApp()");

Display d = Display.getDisplay(this);
MainMenu mm = new MainMenu(this, d);
SplashScreen ss = new SplashScreen();
d.setCurrent(ss);
}
public void pauseApp(){
System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}

public void shutDown(){


destroyApp(false);
notifyDestroyed();
}
}

Riyanto Sigit J2ME - 30


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 4-3 adalah contoh MainMenu.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class MainMenu implements CommandListener{


private List menu;
private Display deviceDisplay;

private Command startGame;


private Command setOptions;
private Command exitGame;

private Gauge loadingGameGauge;


private Alert loadingAlert;

private StarShipBattle ssb;


private UserOptions userOptions;

public MainMenu(StarShipBattle mid, Display d){


deviceDisplay = d;

menu = new List("Game Menu", Choice.IMPLICIT);


startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);

menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(exitGame);

loadingGameGauge = new Gauge(null,


false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);

loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,


Please standby...", null, AlertType.INFO);

menu.setCommandListener(this);

ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);

Riyanto Sigit J2ME - 31


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void commandAction(Command c, Displayable d){

if(c == startGame){

startGame();

}else if(c == setOptions){

setOptions();

}else if(c == exitGame){

exitGame();

}
}

public void startGame(){


loadingAlert.setImage(null);
loadingAlert.setIndicator(loadingGameGauge);
deviceDisplay.setCurrent(loadingAlert, menu);
}

public void setOptions(){


userOptions.showUserOpt();
}

public void exitGame(){


ssb.shutDown();
}

public void showMenu(){

deviceDisplay.setCurrent(menu);
}

Riyanto Sigit J2ME - 32


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 4-4 adalah contoh UserOptions.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements CommandListener{

private Form inputForm;

private TextField name;


private TextField alias;

private Display deviceDisplay;

private String nameAlertText = "Your name has changed.";


private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";

private Image okImage;


private Alert updateAlert;
private Displayable mainMenu;

private Command saveData;


public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

Riyanto Sigit J2ME - 33


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya
updateAlert = new Alert("Data Changed", null,
okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);

saveData = new Command("Save", Command.OK, 1);


inputForm.addCommand(saveData);
inputForm.setCommandListener(this);

}
public void registerMenu(Displayable mm){
mainMenu = mm;
}

public void commandAction(Command c, Displayable d){

if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

/*
public void itemStateChanged(Item i){
if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

}
*/
private void showAlertUpdate(){
deviceDisplay.setCurrent(updateAlert, mainMenu);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Riyanto Sigit J2ME - 34


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Latihan 2— Implementasi Skip Option pada Splash Screen


Program 4-5 adalah contoh file SplashScreen.java.
import javax.microedition.lcdui.*;
import java.io.IOException;

public class SplashScreen extends Canvas{

private Image splashImage;


private MainMenu mainMenu;

public SplashScreen(){
loadSplashScreen();
}

public void loadSplashScreen(){


try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}

public void paint(Graphics g){

g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}

public void registerMenu(MainMenu mm){


mainMenu = mm;
}

public void keyPressed(int keyCode){


mainMenu.showMenu();

Riyanto Sigit J2ME - 35


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 4-6 adalah contoh file StarShipBattle.java.


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

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}

public void startApp(){


System.out.println("in the startApp()");

Display d = Display.getDisplay(this);
MainMenu mm = new MainMenu(this, d);
SplashScreen ss = new SplashScreen();
ss.registerMenu(mm);
d.setCurrent(ss);
}
public void pauseApp(){
System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}
public void shutDown(){
destroyApp(false);
notifyDestroyed();
}
}

Riyanto Sigit J2ME - 36


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 4-7 adalah contoh file MainMenu.java.

import javax.microedition.lcdui.*;
import java.io.IOException;

public class MainMenu implements CommandListener{


private List menu;
private Display deviceDisplay;

private Command startGame;


private Command setOptions;
private Command exitGame;

private Gauge loadingGameGauge;


private Alert loadingAlert;

private StarShipBattle ssb;


private UserOptions userOptions;

public MainMenu(StarShipBattle mid, Display d){


deviceDisplay = d;

menu = new List("Game Menu", Choice.IMPLICIT);


startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);

menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(exitGame);

loadingGameGauge = new Gauge(null,


false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);

loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,


Please standby...", null, AlertType.INFO);

menu.setCommandListener(this);

ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);

Riyanto Sigit J2ME - 37


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void commandAction(Command c, Displayable d){

if(c == startGame){

startGame();

}else if(c == setOptions){

setOptions();

}else if(c == exitGame){

exitGame();

}
}

public void startGame(){


loadingAlert.setImage(null);
loadingAlert.setIndicator(loadingGameGauge);
deviceDisplay.setCurrent(loadingAlert, menu);
}

public void setOptions(){


userOptions.showUserOpt();
}

public void exitGame(){


ssb.shutDown();
}

public void showMenu(){

deviceDisplay.setCurrent(menu);
}

Riyanto Sigit J2ME - 38


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 4-8 adalah contoh file UserOptions.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements CommandListener{

private Form inputForm;

private TextField name;


private TextField alias;

private Display deviceDisplay;

private String nameAlertText = "Your name has changed.";


private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";

private Image okImage;


private Alert updateAlert;
private Displayable mainMenu;

private Command saveData;


public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

Riyanto Sigit J2ME - 39


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

updateAlert = new Alert("Data Changed", null,


okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);

saveData = new Command("Save", Command.OK, 1);


inputForm.addCommand(saveData);
inputForm.setCommandListener(this);

}
public void registerMenu(Displayable mm){
mainMenu = mm;
}

public void commandAction(Command c, Displayable d){

if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

/*
public void itemStateChanged(Item i){
if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

}
*/
private void showAlertUpdate(){
deviceDisplay.setCurrent(updateAlert, mainMenu);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Riyanto Sigit J2ME - 40


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

Pengembangan High dan


5 Low Level User Interface

5.1. Tujuan:
Setelah selesai praktikum ini, kita dapat:
• Membuat form dan menambahkan CustomItem, Textbox dan Gauge object untuk
download game
• Membuat game StarShipBattle 2004.

5.2. Latihan 1: Membuat form dan menambah CustomItem, Textbox dan


Gauge object untuk download game
Adapun tujuan-tujuan dari latihan ini yaitu:

1. Untuk membuat CustomItem object yang memajang kata rahasia pada user
2. Untuk membuat class yang menempatkan kata rahasia pada form
Membuat form yang menghadiahi user demean SecretWordItem class adalah simple CustomItem
yang sebelumnya digunakan user dengan password rahasia. User harus mengetik password ke
dalam field text dan jika sukses, user diperbolehkan menggerakkan menu utama aplikasi.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah 1 - Membuat CustomItem Object yang didisplay dalam SecretWord untuk user
Copy file pada lokasi direktori dari labdir\Lab4_Exercise2\src ke labdir\Lab5_Exercise1\src dan
ikuti step ini:
1. Deklarasikan class baru, disebut SecretWordItem class, yang meluas pada CustomItem
class yang didefiniskan di dalam javax.microedition.lcdui package.
2. Deklarasikan String secretWord property
Properti ini sebelumnya adalah word yang di display untuk user.
3. Deklarasikan metode berikut:

Riyanto Sigit J2ME - 41


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• int getMinContentWidth() – Kembali ke lebar minimum width didalam isi objek area
CustomItem.
• int getMinContentHeight() – Kembali ke tinggi minimum didalam isi objek
CustomItem.
• int getPrefContentHeight(int height) – Kembali ke objek CustomItem berisi tinggi
minimum.
• int getPrefContentWidth(int width) – Kembali ke objek CustomItem berisi lebar
minimum.
• void paint(graphics g,int w,int h) – Melukis secretWord property pada layar didalam
lukisan segiempat.
• boolean checkWord(String word) – Bandingkan parameter word dengan secretWord
property
Jika words cocok, bernilai nilai true sebaliknya false.
Langkah 2 – Membuat class yang menempatkan Secret WordOnaForm
Setelah membuat objek CustomItem yang memajang secret word untuk user, maka harus
membuat class lain yang menempatkan secret word pada form dan juga menyediakan fungsi
yang memungkinkan user untuk memasukkan word dan mengujinya. Lengkapi step berikut :
1. Desain form yang mempunyai TextField pada SecretWordItem dan command object.
Ketika user menekan command object, bandingkan form string ke text yang memasukkan
user dengan string ke text display oleh SecretWordItem object. Jika text string cocok, lalu
dilanjutkan ke menu screen.
• Modifikasi klas SplashScreen sehingga yang mendaftarkan adalah LoginForm objek dan
MainMenu objek
• Modifikasi SplashScreen objek sehingga yang didisplay ke LoginForm objek ketika key
ditekan.
• Modifikasi metode StarShipBattle startApp() sedemikian sehingga yang membuat
LoginForm objek dan membuat yang ada untuk SplashScreen objek.

Riyanto Sigit J2ME - 42


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

5.3. Latihan 2: Membuat Game StarShipBattle 2004


Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Copy file pada lokasi direktori labdir\Lab5_Exercise1\src ke labdir\Lab5_Exercise2\src dan ikuti
step ini:
• Definisikan class baru , disebut Battle, yang subclass dari GameCanvas class dan
implementasi Runnable interface.
• Definisikan properties yang mengikuti Battle class berikut:
- TiledLayer backgrnd – objek sebelum latar belakang image untuk game.
- LayerManager lmgr – objek ini adalah objek yang mengatur display image.
- Sprite ship – objek sebelum hero ship
- Sprite enemy – objek sebelum enemy ship
- Display deviceDisplay – objek berisi referensi untuk device display
- Screen mainMenu – objek sebelum referensi untuk mengikuti user kembali ke Menu
System.
- Boolean running – variable konrtrol digunakan untuk mengatur game processing
Thread

• Definisi mengikuti metode di dalam Battle class:


- public Battle(Display d, Screen m) – Ini adalah default constructor. Ketika objek
Battle dibuat, kamu harus menginisialisasi semua grafik.
- Public void initSprites – Lengkapi metode dengan tindakan berikut:
• Loads the enemy dan hero images
• Sets ships position didalam lapangan bermain.
• Definisikan segi empat pada enemy ship
- void stop() – metode ini disebut kejadian yang mengancam game membutuhkan
untuk diberhentikan oleh setting variable berjalan ke false.
- void start() – Lengkapi metode berikut ini:
a. Set running variable ke true
b. Buat ancaman baru
c. Starts the game loop
- void run() – Ini adalah game looping yang harus selesai pada logika berikut :

Riyanto Sigit J2ME - 43


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

a. Periksa variable kendali dan apabila benar, lanjutkan eksekusi pada loop.
Sebaliknya game over dan proses game berhenti.
b. Queri keystates. Jika user menekan tombol petunjuk kiri atau kanan lalu kapal
juga bergerak ke kiri atau kanan.
c. Otomatis bergerak ke kapal musuh sepanjang layar lima pixels screen five pixels
d. Lihat kemungkinan benturan antar kapal.
e. Lukis kapal pada display.
Isyarat: Pertimbangkan penempatan yang strategis [sebut/panggil/hubungi] kepada
[itu] tidur metoda.
Isyarat: Pertimbangkan penempatan strategi panggilan pada sleep method.
metoda ini digunakan oleh pengulangan/jerat game untuk mengkonversi kapal [itu]
untuk dibinasakan gambaran dan kemudian tidur untuk satu [yang] kedua. Setelah
benang/ulir start lagi, gambaran dipugar dan digantikan pada startup posisi mereka.
- void destroyShips() – Metode ini digunakan oleh loop game yang dikeonversikan
pada kapal untuk mengganti image dan lalu tertidur beberapa detik. Setelah ancaman
start lagi, image dimusnahkandan diganti demean starup posisi mereka.
• Di dalam klas MainMenu, definisi property yang sebelum kejadian pada klas Battle.
• Ubah constructor pada MainMenu untuk membuat kejadian klas Battle dan
menyimpannya di dalam property yang sudah ditetapkan pada step 4.
• Ubah startGame pada MainMenu untuk memanggil Battle.start() dan menempatkan klas
Battle pada device display.

Riyanto Sigit J2ME - 44


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

5.4. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.
Latihan 1— Membuat form dan menambahkan CustomItem, Textbox dan Gauge object
untuk download game
Program 5-1 adalah contoh SecretWordItem.java
import javax.microedition.lcdui.*;

public class SecretWordItem extends CustomItem{

private String secretWord = "Cubs";

public SecretWordItem(){
super("PassCode Prompt");
}

public int getMinContentWidth(){ return 100; }

public int getMinContentHeight(){ return 20; }

public int getPrefContentWidth(int width){


return getMinContentWidth();
}

public int getPrefContentHeight(int height){


return getMinContentHeight();
}

public void paint(Graphics g, int w, int h){

g.setColor(0,0,255);
g.fillRect(0,0, w -1, h-1);

g.setColor(255,255,255);
g.drawString(secretWord, 50,0, g.TOP|g.HCENTER);

Riyanto Sigit J2ME - 45


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public boolean checkWord(String word){

boolean result = false;

if (secretWord.equals(word)){
result = true;
}

return result;
}

Program 5-2 adalah contoh SplashScreen.java


import javax.microedition.lcdui.*;
import java.io.IOException;

public class SplashScreen extends Canvas{

private Image splashImage;


private LoginForm login;

public SplashScreen(){
loadSplashScreen();
}

public void loadSplashScreen(){


try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}

public void paint(Graphics g){

g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}

public void registerLogin(LoginForm lf){


login = lf;
}

Riyanto Sigit J2ME - 46


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void keyPressed(int keyCode){


login.showLoginForm();

Program 5-3 adalah contoh LoginForm.java


import javax.microedition.lcdui.*;

public class LoginForm implements CommandListener{

private SecretWordItem swi;


private Form loginForm;
private TextField userEntry;

private Display deviceDisplay;


private MainMenu mainMenu;

private Command enter;

public LoginForm(Display d ){
deviceDisplay = d;

loginForm = new Form("Login");


swi = new SecretWordItem();
userEntry = new TextField("Password", null, 25, TextField.ANY);
enter = new Command("Enter", Command.OK, 1);

loginForm.append(swi);
loginForm.append(userEntry);
loginForm.addCommand(enter);
loginForm.setCommandListener(this);
}
public void registerMenu(MainMenu menu){
mainMenu = menu;
}

public void showLoginForm(){


deviceDisplay.setCurrent(loginForm);
}

Riyanto Sigit J2ME - 47


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void showMenu(){


mainMenu.showMenu();
}

public void commandAction(Command c, Displayable d){


if (swi.checkWord(userEntry.getString())){
showMenu();
}else{
Alert err = new Alert("Invalid Password!", "Invalid Password\n Please try
again", null, AlertType.ERROR);
err.setTimeout(Alert.FOREVER);
deviceDisplay.setCurrent(err, loginForm);
}
}
}

Program 5-4 adalah contoh MainMenu.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class MainMenu implements CommandListener{


private List menu;
private Display deviceDisplay;

private Command startGame;


private Command setOptions;
private Command exitGame;

private Gauge loadingGameGauge;


private Alert loadingAlert;

private StarShipBattle ssb;


private UserOptions userOptions; }
public void registerMenu(MainMenu menu){
mainMenu = menu;
}

public void showLoginForm(){


deviceDisplay.setCurrent(loginForm);
}

Riyanto Sigit J2ME - 48


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public MainMenu(StarShipBattle mid, Display d){


deviceDisplay = d;

menu = new List("Game Menu", Choice.IMPLICIT);


startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);

menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(exitGame);

loadingGameGauge = new Gauge(null,


false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);

loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,


Please standby...", null, AlertType.INFO);

menu.setCommandListener(this);

ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);

}
public void commandAction(Command c, Displayable d){

if(c == startGame){

startGame();

}else if(c == setOptions){

setOptions();

}else if(c == exitGame){

exitGame();

}
}

Riyanto Sigit J2ME - 49


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void startGame(){


loadingAlert.setImage(null);
loadingAlert.setIndicator(loadingGameGauge);
deviceDisplay.setCurrent(loadingAlert, menu);
}

public void setOptions(){


userOptions.showUserOpt();
}

public void exitGame(){


ssb.shutDown();
}

public void showMenu(){

deviceDisplay.setCurrent(menu);
}

Program 5-5 adalah contoh StarShipBattle.java


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

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}
Riyanto Sigit J2ME - 50
Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void startApp(){


System.out.println("in the startApp()");

Display d = Display.getDisplay(this);
LoginForm lf = new LoginForm(d);
MainMenu mm = new MainMenu(this, d);
SplashScreen ss = new SplashScreen();
lf.registerMenu(mm);
ss.registerLogin(lf);
d.setCurrent(ss);
}

public void pauseApp(){


System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}

public void shutDown(){


destroyApp(false);
notifyDestroyed();
}
}

Program 5-6 adalah contoh UserOptions.java


import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements CommandListener{

private Form inputForm;

private TextField name;


private TextField alias;

private Display deviceDisplay;


private String nameAlertText = "Your name has changed.";
private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";

Riyanto Sigit J2ME - 51


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private Image okImage;


private Alert updateAlert;
private Displayable mainMenu;

private Command saveData;

public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

updateAlert = new Alert("Data Changed", null,


okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);

saveData = new Command("Save", Command.OK, 1);


inputForm.addCommand(saveData);
inputForm.setCommandListener(this);

}
public void registerMenu(Displayable mm){
mainMenu = mm;
}

public void commandAction(Command c, Displayable d){

if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

Riyanto Sigit J2ME - 52


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

/*
public void itemStateChanged(Item i){
if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

}
*/
private void showAlertUpdate(){
deviceDisplay.setCurrent(updateAlert, mainMenu);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Riyanto Sigit J2ME - 53


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Latihan 2— Membuat Game StarShipBattle 2004


Program 5-7 adalah contoh file Battle.java.
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;

import java.io.*;

public class Battle extends GameCanvas implements Runnable{

private TiledLayer backgrnd;


private LayerManager lmgr;
private Sprite ship;
private Sprite enemy;

private Display deviceDisplay;


private MainMenu menu;

private boolean running = false;


public Battle(Display s, MainMenu m){
super(true);
deviceDisplay = s;
menu = m;

lmgr = new LayerManager();


try{
Image bkImage = Image.createImage("/background.png");

backgrnd = new TiledLayer(7,8,bkImage,20,20);


backgrnd.setPosition(20,12);

int map[] = { 1,2,3,4,1,2,3,


2,4,3,1,4,3,1,
4,3,2,1,1,2,4,
2,3,4,1,2,3,1,
3,4,1,2,3,1,4,
2,4,3,1,4,3,1,
4,1,2,3,1,3,4,
2,3,1,4,2,2,1 };
for (int i =0; i < map.length; i++){
int col = i%7;
int row = (i-col) /7;
backgrnd.setCell(col,row,map[i]);
}

Riyanto Sigit J2ME - 54


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

}catch(IOException ioe){
System.out.println("ERR:Loading Image");
}

initSprites();
lmgr.append(backgrnd);
lmgr.insert(ship,0);
lmgr.insert(enemy,0);
Graphics g = getGraphics();
lmgr.paint(g,0,0);
flushGraphics();

}
public void initSprites(){

try{
Image shipImage = Image.createImage("/starshipline.png");
ship = new Sprite(shipImage, 30,30);
ship.setFrame(1);
ship.setPosition(70,130);

Image enemyImage = Image.createImage("/alienb.png");

enemy = new Sprite(enemyImage,30,30);


enemy.setFrame(1);
enemy.setPosition(70,15);

}catch(IOException ioe){
System.out.println("ERR: Generating Sprite");
}
}
public void stop(){
running = false;

public void start(){


System.out.println("Starting the game thread");
running = true;
Thread t = new Thread(this);
t.start();

Riyanto Sigit J2ME - 55


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void run(){


System.out.println("In the game loop");
Graphics g = getGraphics();
int ks = 0;
int currentX = 0;
lmgr.paint(g,0,0);
flushGraphics();

while (running){
ks = getKeyStates();
currentX = ship.getX();
ship.setFrame(1);
if ((ks & LEFT_PRESSED) != 0){
if((currentX-5) >20){
ship.setFrame(0);
ship.move(-5,0);
}
}else if((ks & RIGHT_PRESSED) !=0){
if((currentX+5) <130){
ship.setFrame(2);
ship.move(5,0);
}
}else if((ks & GAME_A_PRESSED) != 0){
stop();
}

if((enemy.getY()+ 5) <140){
enemy.move(0,5);
if(enemy.collidesWith(ship,true)){
destroyShips();
}
}else{
enemy.setPosition(70,15);
}
lmgr.paint(g,0,0);

flushGraphics();

try{
Thread.sleep(100);
}catch(InterruptedException ie){}

Riyanto Sigit J2ME - 56


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

System.out.println("Leaving the game loop");

menu.showMenu();
}
private void destroyShips(){
Graphics g = getGraphics();
enemy.setFrame(3);
ship.setFrame(4);
lmgr.paint(g, 0,0);
flushGraphics();
try{
Thread.sleep(1000);
}catch(InterruptedException ie){}
enemy.setFrame(1);
enemy.setPosition(70,15);
}
}

Program 5-8 adalah contoh file MainMenu.java.


import javax.microedition.lcdui.*;
import java.io.IOException;

public class MainMenu implements CommandListener{


private List menu;
private Display deviceDisplay;

private Command startGame;


private Command setOptions;
private Command exitGame;

private Gauge loadingGameGauge;


private Alert loadingAlert;

private StarShipBattle ssb;


private UserOptions userOptions;

private Battle gameEngine;

Riyanto Sigit J2ME - 57


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public MainMenu(StarShipBattle mid, Display d){


deviceDisplay = d;

menu = new List("Game Menu", Choice.IMPLICIT);


startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);

menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(exitGame);

loadingGameGauge = new Gauge(null,


false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);

loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,


Please standby...", null, AlertType.INFO);

menu.setCommandListener(this);

ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);

gameEngine = new Battle(d, this);

}
public void commandAction(Command c, Displayable d){

if(c == startGame){

startGame();

}else if(c == setOptions){

setOptions();

}else if(c == exitGame){

exitGame();

}
}
Riyanto Sigit J2ME - 58
Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void startGame(){


gameEngine.start();
deviceDisplay.setCurrent(gameEngine);
}

public void setOptions(){


userOptions.showUserOpt();
}

public void exitGame(){


ssb.shutDown();
}

public void showMenu(){

deviceDisplay.setCurrent(menu);
}

Program 5-9 adalah contoh file StarShipBattle.java.

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

public class StarShipBattle extends MIDlet{

private final String profileVersion = "MIDP-2.0";


private final String configVersion = "CLDC-1.0";

public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");

if((pv.equals(profileVersion)) && (cv.equals(configVersion))){


System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}
Riyanto Sigit J2ME - 59
Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void startApp(){


System.out.println("in the startApp()");

Display d = Display.getDisplay(this);
LoginForm lf = new LoginForm(d);
MainMenu mm = new MainMenu(this, d);
SplashScreen ss = new SplashScreen();
lf.registerMenu(mm);
ss.registerLogin(lf);
d.setCurrent(ss);
}
public void pauseApp(){
System.out.println("in the pauseApp()...");
}

public void destroyApp(boolean unc){


System.out.println("in the destroyApp()... ");
}

public void shutDown(){


destroyApp(false);
notifyDestroyed();
}
}

Program 5-10 adalah contoh file UserOptions.java.

import javax.microedition.lcdui.*;
import java.io.IOException;

public class UserOptions implements CommandListener{

private Form inputForm;

private TextField name;


private TextField alias;

private Display deviceDisplay;

private String nameAlertText = "Your name has changed.";


private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";

Riyanto Sigit J2ME - 60


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private Image okImage;


private Alert updateAlert;
private Displayable mainMenu;

private Command saveData;


public UserOptions(Display d){

name = new TextField("UserName", null, 25, TextField.ANY);


alias = new TextField("alias", null, 25, TextField.ANY);

inputForm = new Form("User Information");


inputForm.append(name);
inputForm.append(alias);

deviceDisplay = d;

try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}

updateAlert = new Alert("Data Changed", null,


okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);

saveData = new Command("Save", Command.OK, 1);


inputForm.addCommand(saveData);
inputForm.setCommandListener(this);

}
public void registerMenu(Displayable mm){
mainMenu = mm;
}

public void commandAction(Command c, Displayable d){

if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

Riyanto Sigit J2ME - 61


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

/*
public void itemStateChanged(Item i){
if( i == name){
updateAlert.setString(nameAlertText);
}else{
updateAlert.setString(aliasAlertText);
}
showAlertUpdate();

}
*/
private void showAlertUpdate(){
deviceDisplay.setCurrent(updateAlert, mainMenu);
}

public void showUserOpt(){


deviceDisplay.setCurrent(inputForm);
}

Program 5-11 adalah contoh file SplashScreen.java

import javax.microedition.lcdui.*;
import java.io.IOException;

public class SplashScreen extends Canvas{

private Image splashImage;


private LoginForm login;

public SplashScreen(){
loadSplashScreen();
}

public void loadSplashScreen(){


try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}

Riyanto Sigit J2ME - 62


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void paint(Graphics g){

g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}

public void registerLogin(LoginForm lf){


login = lf;
}

public void keyPressed(int keyCode){


login.showLoginForm();

Program 5-12 adalah contoh file LoginForm.java


import javax.microedition.lcdui.*;

public class LoginForm implements CommandListener{

private SecretWordItem swi;


private Form loginForm;
private TextField userEntry;

private Display deviceDisplay;


private MainMenu mainMenu;

private Command enter;

public LoginForm(Display d ){
deviceDisplay = d;

loginForm = new Form("Login");


swi = new SecretWordItem();
userEntry = new TextField("Password", null, 25, TextField.ANY);
enter = new Command("Enter", Command.OK, 1);

loginForm.append(swi);
loginForm.append(userEntry);
loginForm.addCommand(enter);
loginForm.setCommandListener(this);
}
Riyanto Sigit J2ME - 63
Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void registerMenu(MainMenu menu){


mainMenu = menu;
}

public void showLoginForm(){


deviceDisplay.setCurrent(loginForm);
}

public void showMenu(){


mainMenu.showMenu();
}

public void commandAction(Command c, Displayable d){


if (swi.checkWord(userEntry.getString())){
showMenu();
}else{
Alert err = new Alert("Invalid Password!", "Invalid Password\n
Please try again", null, AlertType.ERROR);
err.setTimeout(Alert.FOREVER);
deviceDisplay.setCurrent(err, loginForm);
}
}
}

Riyanto Sigit J2ME - 64


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

Menggunakan Data
6 pada Peralatan

6.1. Tujuan:
• Setelah selesai praktikum ini, kita dapat mengimplementasikan option Screen, Save dan
mengubah data di obyek RecordStore.

6.2. Latihan:
Mengimplementasikan option Screen, Save dan mengubah data di obyek RecordStore.
Pada latihan ini kita dapat menyelesaikan langkah-langkah sbb:
• Mengimplementasikan option Screen
• Save dan mengubah data di obyek RecordStore
Tujuan dari latihan ini adalah untuk menambah fungsi dan mengubah data pada option Screen
dari obyek RecordStore. Pada latihan ini diasumsikan membuat:
• Obyek RecordStore tidak pernah berisi satu record.
• Record dilewatkan obyek melalui array seperti byte[].
• Obyek RecordStore dibuka untuk obyek yang digunakan.
• Obyek RecordStore harus ditutup ketika menghapus obyek.

Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah 1—Implementasi Option Screen
Copy file pada lokasi direktori ..\apps\Lab5_Exercise2\src dan ikuti step ini:
1. Membuat sebuah class OptionRS.
2. Mendefinisikan tiga property:

Riyanto Sigit J2ME - 65


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• String storeName – Merepresentasikan nama yang digunakan untuk membuka obyek


RecordStore.
• RecordStore optionStore – Sebuah referen dari RecordStore yang menyimpan
informasi.
• byte[] currentOption – Memelihara duplikat dari option yang ada pada sekumpulan
options RecordStore.
3. Mendefinisikan Constructor
Mengimplementasikan contructor untuk membuka obyek RocordStore dan mengisi
properti optionStore.
4. Mendefinisikan methods
• byte[] readOption() – Mengecek currentOption apakah bernilai null jika curentOption
bernilai null maka implementasikan perbaikan option dari optionStore kemudian
mengembalikan nilai currentOption.
• void writeOption(byte[] option) – Mengecek jumlah record di properti optionStore.
Jika jumlah record tidak sama dengan satu maka record baru ditambah. Jika record
sama dengan satu maka record diupdate dimana nilai 1 dilewatkan ketika dipanggil.
• boolean recordExists() – mengembalikan true jika satu record ada dan false jika
record tidak ada.
• void close() – Menutup property optionStore setelah selesai digunakan.

Langkah 2—Menyimpan dan Memperbaiki Data Obyek RecordStore


Pada langkah ini, kita modifikasi class UserOption untuk menggunakan obyek optionRS untuk
menyimpan dan memperbaiki data.
1. Tambahkan properti OptionsRS optionStore untuk klas userOption:
Properti ini akan memelihara sebuah referen untuk obyek OptionRS yang akan digunakan
untuk memperbaiki dan menyimpan data.
2. Tambahkan methods untuk class UserOptions
• void initializeOptions() – Membuat instant dari obyek OptionRS dan set property
optionStore. Setelah action lengkap, methods dicek untuk melihat keberadaan record,
jika tidak set default dan simpan dalam obyek optionStore.

Riyanto Sigit J2ME - 66


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• Void saveOption() – Konversi dan tambahkan nilai penyimpanan dalam nama dan
obyek TextField dari String untuk sebuah array byte[]. Setelah nilai dikonversi, array
byte[] dilewatkan parameter pada methods writeOption() oleh property optionStore.
• Void retrieveOption() – Memperbaiki sebuah array byte[] yang berisi nilai untuk
nama dan nilai Textfield yang digunakan methods retrieveOptions() yang diberikan
oleh property optionStore.. Array byte[] dikonversi untuk dua String dan tiap nilai
dimasukkan ke obyek TextField.
3. Tambah methods initializeOptions() dari default konstruktor.
4. Tambah method saveOption dari metods ShowAllertUpdate()
5. Tambah methods retrieveOption dari methods showUserOpt().

6.3. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.
Program 6-1 adalah contoh file OptionRS.java.

import javax.microedition.rms.*;
import java.io.*;

public class OptionsRS{

private String storeName = "StarShipOptions";

private RecordStore optionStore;


private byte[] currentOption;

public OptionsRS(){
try{
optionStore = RecordStore.openRecordStore(storeName,true);
}catch(Exception ioe){
System.out.println("ERR: Opening RecordStore");
}
}

Riyanto Sigit J2ME - 67


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public byte[] readOption(){


try{
if(currentOption == null){
currentOption = optionStore.getRecord(1);
}
}catch(Exception e){
System.out.println("ERR: reading options");
}
return currentOption;
}

public void writeOption(byte[] option){


try{
if(recordExists()){
optionStore.setRecord(1, option,0,option.length);
}else{
optionStore.addRecord(option,0, option.length);
}
}catch(Exception e){
System.out.println("ERR: saving options");
}
currentOption = option;
}

public boolean recordExists(){


boolean response = true;
try{
if (optionStore.getNumRecords() !=1 ){
return false;
}
}catch(RecordStoreException rse){
System.out.println("ERR:OPTIONRS:unable to read the number of
records");
response = false;
}
return response;
}

public void close(){


try{
optionStore.closeRecordStore();
}catch(Exception e){
System.out.println("ERR: Closing RecordStore");
}
Riyanto Sigit
} J2ME - 68
Wiratmoko
} Yuwono
Politeknik Elektronika Negeri Surabaya

Program 6-2 adalah contoh file UserOptions.java.


import javax.microedition.lcdui.*;
import java.io.*;
public class UserOptions implements CommandListener{
private Form inputForm;
private TextField name;
private TextField alias;
private Display deviceDisplay;
private String nameAlertText = "Your name has changed.";
private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";
private Image okImage;
private Alert updateAlert;
private Displayable mainMenu;
private Command saveData;
private OptionsRS optionStore;
public UserOptions(Display d){
name = new TextField("UserName", null, 25, TextField.ANY);
alias = new TextField("alias", null, 25, TextField.ANY);
inputForm = new Form("User Information");
inputForm.append(name);
inputForm.append(alias);
deviceDisplay = d;
try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}
updateAlert = new Alert("Data Changed", null,
okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
saveData = new Command("Save", Command.OK, 1);
inputForm.addCommand(saveData);
inputForm.setCommandListener(this);
initializeOptions( );
}
private void initializeOptions( ){
optionStore = new OptionsRS( );
if(!optionStore.recordExists()){
name.setString("Joe Smith");
alias.setString("BattleMaster");
saveOptions();
}
}

Riyanto Sigit J2ME - 69


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private void retrieveOptions(){


try{
ByteArrayInputStream bOptions = new
ByteArrayInputStream(optionStore.readOption());
DataInputStream dOptions = new DataInputStream(bOptions);
name.setString(dOptions.readUTF());
alias.setString(dOptions.readUTF());
dOptions.close();
bOptions.close();
}catch(IOException ioe){
System.out.println("ERR:USEROPTIONS: problem retrieving data");
}
}
private void saveOptions(){
try{
ByteArrayOutputStream bOptions = new ByteArrayOutputStream();
DataOutputStream dOptions = new DataOutputStream(bOptions);
dOptions.writeUTF(name.getString());
dOptions.writeUTF(alias.getString());
optionStore.writeOption(bOptions.toByteArray());
dOptions.close();
bOptions.close();
}catch(IOException ioe){
System.out.println("ERR:USEROPTIONS: problem saving data");
}
}
public void registerMenu(Displayable mm){
mainMenu = mm;
}
public void commandAction(Command c, Displayable d){
if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}
private void showAlertUpdate(){
saveOptions();
deviceDisplay.setCurrent(updateAlert, mainMenu);
}
public void showUserOpt(){
retrieveOptions();
deviceDisplay.setCurrent(inputForm);
}
}

Riyanto Sigit J2ME - 70


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 6-3 adalah contoh file MainMenu.java.


import javax.microedition.lcdui.*;
import java.io.IOException;
public class MainMenu implements CommandListener{
private List menu;
private Display deviceDisplay;
private Command startGame;
private Command setOptions;
private Command exitGame;
private Gauge loadingGameGauge;
private Alert loadingAlert;
private StarShipBattle ssb;
private UserOptions userOptions;
private Battle gameEngine;
public MainMenu(StarShipBattle mid, Display d){
deviceDisplay = d;
menu = new List("Game Menu", Choice.IMPLICIT);
startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);
menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(exitGame);
loadingGameGauge = new Gauge(null,
false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);
loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,
Please standby...", null, AlertType.INFO);
menu.setCommandListener(this);
ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);
gameEngine = new Battle(d, this);
}
public void commandAction(Command c, Displayable d){
if(c == startGame){
startGame();
}else if(c == setOptions){
setOptions();
}else if(c == exitGame){
exitGame();
}
}

Riyanto Sigit J2ME - 71


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void startGame(){


gameEngine.start();
deviceDisplay.setCurrent(gameEngine);
}
public void setOptions(){
userOptions.showUserOpt();
}
public void exitGame(){
ssb.shutDown();
}
public void showMenu(){
deviceDisplay.setCurrent(menu);
}
}

Program 6-4 adalah contoh file SplashScreen.java.

import javax.microedition.lcdui.*;
import java.io.IOException;
public class SplashScreen extends Canvas{
private Image splashImage;
private LoginForm login;
public SplashScreen(){
loadSplashScreen();
}
public void loadSplashScreen(){
try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}
public void paint(Graphics g){
g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}
public void registerLogin(LoginForm lf){
login = lf;
}
public void keyPressed(int keyCode){
login.showLoginForm();
}
}

Riyanto Sigit J2ME - 72


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

Mengakses Data dan


7 Servis Jaringan

7.1. Tujuan:
• Setelah selesai praktikum ini, kita dapat menggunakan interface HttpConection dan
membaca teks pada aplikasi help screen.

7.2. Latihan: Menggunakan interface HttpConection dan membaca teks pada


aplikasi help screen.
Pada latihan ini kita dapat menyelesaikan langkah-langkah sbb:
• Membuat struktur sistem class HelpDL
• Menambah fungsi untuk download dan menyediakan informasi help
Tujuan dari latihan ini adalah untuk menambah fungsi help pada aplikasi. Sebuah webserver
mempunyai file help.text kemudian kita dapat membaca dari Universal Resource Locator (URL):
http://[insxructors machine]help.txt.
Pada latihan ini kita membuat sebuah class baru yang disebut class HelpDL. Class HelpDL berisi
obyek TextBox yang dapat menampilkan teks help dari website. Ini artinya class HelpDL dapat
terhubung dengan webserver, membaca teks help, dan menyisipan teks kedalam komponen
TextBox. Kita juga menambahkan option help pada screen menu dan update interface
CommandListener untuk mengakomodasi user dari menu item help.

Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah 1— Membuat struktur sistem HelpDL
Pada langkah ini, kita membuat initial struktur dari sistem HelpDL. Kita set class untuk
menampilkan obyek TextBox pada user dan mengimplementasikan fungsi return pada menu
utama. Copy file pada lokasi direktori ..\apps\Lab6_Exercise1\src dan ikuti step ini:

Riyanto Sigit J2ME - 73


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

1. Mendefinisikan sebuah class baru HelpDL

2. Mendefinisikan property:

• Display deviceDisplay – Menerima sebuah referen pada tampilan untuk navigasi


kembali pada system menu.
• Displayable mainMenu – Menerima sebuah referen untuk system menu.
• TextBox help – Menerima sebuah referen pada obyek TextBox dalam data Help
Screen dibaca.
• Command back – Menerima sebuah referen untuk fungsi kembali dari Help Screen.
3. Mendefinisikan konstructor HelpDL (Display dd)
Hanya class konstruktor yang ada. Ketika dibuat obyek Display harus menjamin navigasi
kembali pada system menu dan harus disediakan dalam property deviceDisplay.
4. Mendefinisikan methods
• void registerPrev(Displayable prev) – Digunakan untuk register screen ketika system
navigasi kembali.
• void showPrev() – Dipanggil ketika user kembali dari screen TextBox.
• void showHelpScreen() – digunakan untuk membuat scrren help tampak.
• void commandAction(Command c, Displayable d) – Digunakan untuk memanggil
method sendiri untuk kembali ke menu utama
5. Memodifikasi class MainMenu untuk menambah option screen help dan user navigasi
diantara menu dan system help.

Langkah 2 — Menambah fungsi untuk download dan menyediakan informasi help


Pada langkah ini kita menambah fungsi untuk download informasi help dan menyediakan
peralatan local. Untuk menjalankan kita tidak mengunci emulator dan proses download harus
dalam thread.
1. Modifikasi class HelpDL untuk implementasi interface Runnable
2. Tambah method pada class HelpDL
• void downloadHelp() – Menghubungkan, download, dan assign teks pada obyek help
TextBox.
• void run() – Didefinisikan oleh interface Runnable, ketika dijalankan method ini harus
memanggil method downloadHelp().

Riyanto Sigit J2ME - 74


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

3. Modifikasi method showHelpScreen() ketika dipanggil, membuat dan menjalankan


thread baru. Kode harus dijalankan ketika didefinisikan method run().

7.3. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.
Program 7-1 adalah contoh file HelpDL.java.

import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class HelpDL implements CommandListener,Runnable{
private Display deviceDisplay;
private Displayable mainMenu;
private TextBox help;
private Command back;
public HelpDL(Display dd){
deviceDisplay = dd;
help = new TextBox("StarShip Battle Help", null, 100, TextField.ANY );
back = new Command("Return", Command.BACK, 1);
help.addCommand(back);
help.setCommandListener(this);

}
public void registerPrev(Displayable prev){
mainMenu = prev;
}
private void showPrev(){
deviceDisplay.setCurrent(mainMenu);
}
public void showHelpScreen(){
Thread download = new Thread(this);
download.start();
deviceDisplay.setCurrent(help);
}
public void commandAction(Command c, Displayable d){
showPrev();
}
public void run(){
downloadHelp();
}

Riyanto Sigit J2ME - 75


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private void downloadHelp(){


try{
HttpConnection conn =
(HttpConnection)Connector.open("http://localhost:8080/help.txt");
int size = (int)(conn.getLength());
StringBuffer tmp = new StringBuffer(size);
InputStreamReader input = new
InputStreamReader(conn.openInputStream());
char[] buffer = new char[25];
while((input.read(buffer,0,buffer.length)) != -1){
tmp.append(buffer);
buffer = new char[25];
}
input.close();
conn.close();
String helpText = tmp.toString();
help.setMaxSize(helpText.length());
help.setString(helpText);
}catch(Exception e){
System.out.println("ERR: getting HelpScreen");
e.printStackTrace();
help.setString("Help System is unavailable, please try again later.");
}
}
}

Program 7-2 adalah contoh file MainMenu.java.


import javax.microedition.lcdui.*;
import java.io.IOException;
public class MainMenu implements CommandListener{
private List menu;
private Display deviceDisplay;
private Command startGame;
private Command setOptions;
private Command exitGame;
private Command helpScreen;
private Gauge loadingGameGauge;
private Alert loadingAlert;
private StarShipBattle ssb;
private UserOptions userOptions;
private Battle gameEngine;
private HelpDL helpSystem;

Riyanto Sigit J2ME - 76


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public MainMenu(StarShipBattle mid, Display d){


deviceDisplay = d;
menu = new List("Game Menu", Choice.IMPLICIT);
startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
helpScreen = new Command("Help", Command.HELP, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);
menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(helpScreen);
menu.addCommand(exitGame);
loadingGameGauge = new Gauge(null,
false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);
loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,
Please standby...", null, AlertType.INFO);
menu.setCommandListener(this);
ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);
gameEngine = new Battle(d, this);
helpSystem = new HelpDL(d);
helpSystem.registerPrev(menu);
}
public void commandAction(Command c, Displayable d){
if(c contoh
Program 6-3 adalah == startGame){
file MainMenu.java.
startGame();
}else if(c == setOptions){
setOptions();
}else if (c == helpScreen){
showHelp();
}else if(c == exitGame){
exitGame();
}
}
public void startGame(){
gameEngine.start();
deviceDisplay.setCurrent(gameEngine);
}
public void setOptions(){
userOptions.showUserOpt();
}
public void exitGame(){
ssb.shutDown();
}

Riyanto Sigit J2ME - 77


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void showMenu(){


deviceDisplay.setCurrent(menu);
}
public void showHelp(){
helpSystem.showHelpScreen();
}
}

Program 7-3 adalah contoh file StarShipBattle.java.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class StarShipBattle extends MIDlet{
private final String profileVersion = "MIDP-2.0";
private final String configVersion = "CLDC-1.0";
public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");
if((pv.equals(profileVersion)) && (cv.equals(configVersion))){
System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}
public void startApp(){
System.out.println("in the startApp()");
Display d = Display.getDisplay(this);
LoginForm lf = new LoginForm(d);
MainMenu mm = new MainMenu(this, d);
SplashScreen ss = new SplashScreen();
lf.registerMenu(mm);
ss.registerLogin(lf);
d.setCurrent(ss);
}
public void pauseApp(){
System.out.println("in the pauseApp()...");
}
public void destroyApp(boolean unc){
System.out.println("in the destroyApp()... ");
}
public void shutDown(){
destroyApp(false);
notifyDestroyed();
}
}
Riyanto Sigit J2ME - 78
Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 7-4 adalah contoh file UserOption.java.

import javax.microedition.lcdui.*;
import java.io.*;
public class UserOptions implements CommandListener{
private Form inputForm;
private TextField name;
private TextField alias;
private Display deviceDisplay;
private String nameAlertText = "Your name has changed.";
private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";
private Image okImage;
private Alert updateAlert;
private Displayable mainMenu;
private Command saveData;
private OptionsRS optionStore;
public UserOptions(Display d){
name = new TextField("UserName", null, 25, TextField.ANY);
alias = new TextField("alias", null, 25, TextField.ANY);
inputForm = new Form("User Information");
inputForm.append(name);
inputForm.append(alias);
deviceDisplay = d;
try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}
updateAlert = new Alert("Data Changed", null,
okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);
saveData = new Command("Save", Command.OK, 1);
inputForm.addCommand(saveData);
inputForm.setCommandListener(this);
initializeOptions( );
}
private void initializeOptions( ){
optionStore = new OptionsRS( );
if(!optionStore.recordExists()){
name.setString("Joe Smith");
alias.setString("BattleMaster");
saveOptions();
}
}

Riyanto Sigit J2ME - 79


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private void retrieveOptions(){


try{
ByteArrayInputStream bOptions = new
ByteArrayInputStream(optionStore.readOption());
DataInputStream dOptions = new DataInputStream(bOptions);
name.setString(dOptions.readUTF());
alias.setString(dOptions.readUTF());
dOptions.close();
bOptions.close();
}catch(IOException ioe){
System.out.println("ERR:USEROPTIONS: problem retrieving data");
}
}
private void saveOptions(){
try{
ByteArrayOutputStream bOptions = new ByteArrayOutputStream();
DataOutputStream dOptions = new DataOutputStream(bOptions);
dOptions.writeUTF(name.getString());
dOptions.writeUTF(alias.getString());
optionStore.writeOption(bOptions.toByteArray());
dOptions.close();
bOptions.close();
}catch(IOException ioe){
System.out.println("ERR:USEROPTIONS: problem saving data");
}
}
public void registerMenu(Displayable mm){
mainMenu = mm;
}
public void commandAction(Command c, Displayable d){
if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}
private void showAlertUpdate(){
saveOptions();
deviceDisplay.setCurrent(updateAlert, mainMenu);
}
public void showUserOpt(){
retrieveOptions();
deviceDisplay.setCurrent(inputForm);
}
}

Riyanto Sigit J2ME - 80


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 7-5 adalah contoh file SplashScreen.java.

import javax.microedition.lcdui.*;
import java.io.IOException;
public class SplashScreen extends Canvas{
private Image splashImage;
private LoginForm login;
public SplashScreen(){
loadSplashScreen();
}
public void loadSplashScreen(){
try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}
public void paint(Graphics g){
g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}
public void registerLogin(LoginForm lf){
login = lf;
}
public void keyPressed(int keyCode){
login.showLoginForm();
}
}

Program 7-6 adalah contoh file OptionRS.java

import javax.microedition.rms.*;
import java.io.*;
public class OptionsRS{
private String storeName = "StarShipOptions";
private RecordStore optionStore;
private byte[] currentOption;
public OptionsRS(){
try{
optionStore = RecordStore.openRecordStore(storeName,true);
}catch(Exception ioe){
System.out.println("ERR: Opening RecordStore");
}
}

Riyanto Sigit J2ME - 81


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public byte[] readOption(){


try{
if(currentOption == null){
currentOption = optionStore.getRecord(1);
}
}catch(Exception e){
System.out.println("ERR: reading options");
}
return currentOption;
}
public void writeOption(byte[] option){
try{
if(recordExists()){
optionStore.setRecord(1, option,0,option.length);
}else{
optionStore.addRecord(option,0, option.length);
}
}catch(Exception e){
System.out.println("ERR: saving options");
}
currentOption = option;
}
public boolean recordExists(){
boolean response = true;
try{
if (optionStore.getNumRecords() !=1 ){
return false;
}
}catch(RecordStoreException rse){
System.out.println("ERR:OPTIONRS:unable to read the number of
records");
response = false;
}
return response;
}
public void close(){
try{
optionStore.closeRecordStore();
}catch(Exception e){
System.out.println("ERR: Closing RecordStore");
}
}
}

Riyanto Sigit J2ME - 82


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

8 Kontrol Media

8.1. Tujuan:
• Setelah selesai praktikum ini, kita dapat menambah suara pada game StarShipBattle.

8.2. Latihan: Menambah suara pada game StarShipBattle.


Pada latihan ini kita dapat menambah properti Player exploder pada class Battle.
Tujuan dari latihan ini untuk menambah suara meletus pada game. Letusan dapat dibunyikan
ketika kapal musuh menabrak kapal pahlawan.

Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah 1 — Menambah property Player exploder pada class Battle
Copy program dari direktori ..\apps\Lab7_Exercise1\src ke direktori ..\apps\Lab8_Exercise1\src
dan ikuti step ini:

1. Tambahkan property Player exploder pada class Battle.

2. Pada konstruktor class Battle tambahkan kode untuk membaca file /explos.wav pada

InputStream. Gunakan method getResourceAsStream().


3. Buat sebuah obyek Player menggunakan InputStream pada step 2 dan assign hasilnya

pada property exploder.


4. Pada method Battle.destroShips() tambahkan kode untuk membunyikan suara letusan

ketika kapal tabrakan.

8.3. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Bandingkan jawaban anda dengan contoh program.

Riyanto Sigit J2ME - 83


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 8-1 adalah contoh file Battle.java.

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.media.*;
import java.io.*;
public class Battle extends GameCanvas implements Runnable{
private TiledLayer backgrnd;
private LayerManager lmgr;
private Sprite ship;
private Sprite enemy;
private Player exploder;
private Display deviceDisplay;
private MainMenu menu;
private boolean running = false;
public Battle(Display s, MainMenu m){
super(true);
deviceDisplay = s;
menu = m;
lmgr = new LayerManager();
try{
Image bkImage = Image.createImage("/background.png");
backgrnd = new TiledLayer(7,8,bkImage,20,20);
backgrnd.setPosition(20,12);
int map[] = { 1,2,3,4,1,2,3,
2,4,3,1,4,3,1,
4,3,2,1,1,2,4,
2,3,4,1,2,3,1,
3,4,1,2,3,1,4,
2,4,3,1,4,3,1,
4,1,2,3,1,3,4,
2,3,1,4,2,2,1 };
for (int i =0; i < map.length; i++){
int col = i%7;
int row = (i-col) /7;
backgrnd.setCell(col,row,map[i]);
}
InputStream sound = getClass().getResourceAsStream("/explos.wav");
String type = "audio/x-wav";
exploder = Manager.createPlayer(sound,type);
}catch(IOException ioe){
System.out.println("ERR:Loading Image");
}catch(MediaException me){
System.out.println("ERR:Initializing game sounds");
}

Riyanto Sigit J2ME - 84


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

initSprites();
lmgr.append(backgrnd);
lmgr.insert(ship,0);
lmgr.insert(enemy,0);
Graphics g = getGraphics();
lmgr.paint(g,0,0);
flushGraphics();
}
public void initSprites(){
try{
Image shipImage = Image.createImage("/starshipline.png");
ship = new Sprite(shipImage, 30,30);
ship.setFrame(1);
ship.setPosition(70,130);
Image enemyImage = Image.createImage("/alienb.png");
enemy = new Sprite(enemyImage,30,30);
enemy.setFrame(1);
enemy.setPosition(70,15);
}catch(IOException ioe){
System.out.println("ERR: Generating Sprite");
}
}
public void stop(){
running = false;
}
public void start(){
System.out.println("Starting the game thread");
running = true;
Thread t = new Thread(this);
t.start();
}
public void run(){
System.out.println("In the game loop");
Graphics g = getGraphics();
int ks = 0;
int currentX = 0;
lmgr.paint(g,0,0);
flushGraphics();
while (running){
ks = getKeyStates();
currentX = ship.getX();
ship.setFrame(1);
if ((ks & LEFT_PRESSED) != 0){
if((currentX-5) >20){
ship.setFrame(0);
ship.move(-5,0);
}

Riyanto Sigit J2ME - 85


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

}else if((ks & GAME_A_PRESSED) != 0){


stop();
}
if((enemy.getY()+ 5) <140){
enemy.move(0,5);
if(enemy.collidesWith(ship,true)){
destroyShips();
}
}else{
enemy.setPosition(70,15);
}
lmgr.paint(g,0,0);
flushGraphics();
try{
Thread.sleep(100);
}catch(InterruptedException ie){}
}
System.out.println("Leaving the game loop");
menu.showMenu();
}
private void destroyShips(){
Graphics g = getGraphics();
try{
exploder.start();
//Manager.playTone(65,1000,60);
}catch(MediaException
Program 6-3 adalah me){
contoh file MainMenu.java.
System.out.println("ERR: Sound will not play!");
}
enemy.setFrame(3);
ship.setFrame(4);
lmgr.paint(g, 0,0);
flushGraphics();
try{
Thread.sleep(1500);
}catch(InterruptedException ie){}
enemy.setFrame(1);
enemy.setPosition(70,15);
}
}

Riyanto Sigit J2ME - 86


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 8-2 adalah contoh file StarShipBattle.java.

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class StarShipBattle extends MIDlet{
private final String profileVersion = "MIDP-2.0";
private final String configVersion = "CLDC-1.0";
public StarShipBattle(){
String pv = getAppProperty("MicroEdition-Profile");
String cv = getAppProperty("MicroEdition-Configuration");
if((pv.equals(profileVersion)) && (cv.equals(configVersion))){
System.out.println("Versions ok, proceed as needed");
System.out.println("Loading the application...");
}else{
System.out.println("Versions incorrect...unable to proceed");
System.out.println("Unloading the application...");
shutDown();
}
}
public void startApp(){
System.out.println("in the startApp()");
Display d = Display.getDisplay(this);
LoginForm lf = new LoginForm(d);
MainMenu mm = new MainMenu(this, d);
SplashScreen ss = new SplashScreen();
lf.registerMenu(mm);
ss.registerLogin(lf);
d.setCurrent(ss);
}
public void pauseApp(){
System.out.println("in the pauseApp()...");
}
public void destroyApp(boolean unc){
System.out.println("in the destroyApp()... ");
}
public void shutDown(){
destroyApp(false);
notifyDestroyed();
}
}
Program 7-4 adalah contoh file UserOption.java.

Riyanto Sigit J2ME - 87


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Program 8-3 adalah contoh file SplashScreen.java.

import javax.microedition.lcdui.*;
import java.io.IOException;
public class SplashScreen extends Canvas{
private Image splashImage;
private LoginForm login;
public SplashScreen(){
loadSplashScreen();
}
public void loadSplashScreen(){
try{
splashImage = Image.createImage("/titlepage.png");
}catch(IOException ioe){
System.out.println("ERR:SplashScreen: Unable to load image");
}
}
public void paint(Graphics g){
g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(splashImage, 0,0, Graphics.TOP | Graphics.LEFT);
}
public void registerLogin(LoginForm lf){
login = lf;
}
public void keyPressed(int keyCode){
login.showLoginForm();
}
}

Program 8-4 adalah contoh file LoginForm.java.


import javax.microedition.lcdui.*;
public class LoginForm implements CommandListener{
private SecretWordItem swi;
private Form loginForm;
private TextField userEntry;
private Display deviceDisplay;
private MainMenu mainMenu;
private Command enter;
public LoginForm(Display d ){
deviceDisplay = d;
loginForm = new Form("Login");
swi = new SecretWordItem();
userEntry = new TextField("Password", null, 25, TextField.ANY);
enter = new Command("Enter", Command.OK, 1);
loginForm.append(swi);

Riyanto Sigit J2ME - 88


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

loginForm.append(userEntry);
loginForm.addCommand(enter);
loginForm.setCommandListener(this);
}
public void registerMenu(MainMenu menu){
mainMenu = menu;
}
public void showLoginForm(){
deviceDisplay.setCurrent(loginForm);
}
public void showMenu(){
mainMenu.showMenu();
}
public void commandAction(Command c, Displayable d){
if (swi.checkWord(userEntry.getString())){
showMenu();
}else{
Alert err = new Alert("Invalid Password!", "Invalid Password\n Please
try again", null, AlertType.ERROR);
err.setTimeout(Alert.FOREVER);
deviceDisplay.setCurrent(err, loginForm);
}
}
}

Program 8-5 adalah contoh file MainMenu.java


import javax.microedition.lcdui.*;
import java.io.IOException;
public class MainMenu implements CommandListener{
private List menu;
private Display deviceDisplay;
private Command startGame;
private Command setOptions;
private Command helpScreen;
private Command exitGame;
private Gauge loadingGameGauge;
private Alert loadingAlert;
private StarShipBattle ssb;
private UserOptions userOptions;
private HelpDL helpSystem;
private Battle gameEngine;

Riyanto Sigit J2ME - 89


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public MainMenu(StarShipBattle mid, Display d){


deviceDisplay = d;
menu = new List("Game Menu", Choice.IMPLICIT);
startGame = new Command("Start Game", Command.OK, 1);
setOptions = new Command("Set Options", Command.OK, 1);
helpScreen = new Command("Help", Command.HELP, 1);
exitGame = new Command("Exit Application", Command.EXIT, 1);
menu.addCommand(startGame);
menu.addCommand(setOptions);
menu.addCommand(helpScreen);
menu.addCommand(exitGame);
loadingGameGauge = new Gauge(null,
false,Gauge.INDEFINITE,Gauge.CONTINUOUS_RUNNING);
loadingGameGauge.setPreferredSize(-1,-1);
loadingAlert = new Alert("Loading Game", "Loading StarShip Battle 2004,
Please standby...", null, AlertType.INFO);
menu.setCommandListener(this);
ssb = mid;
userOptions = new UserOptions(d);
userOptions.registerMenu(menu);
helpSystem = new HelpDL(d);
helpSystem.registerPrev(menu);
gameEngine = new Battle(d, this);
}
public void commandAction(Command c, Displayable d){
if(c == startGame){
startGame();
}else if(c == setOptions){
setOptions();
}else if (c == helpScreen){
showHelp();
}else if(c == exitGame){
exitGame();
}
}
public void startGame(){
gameEngine.start();
deviceDisplay.setCurrent(gameEngine);
}
public void setOptions(){
userOptions.showUserOpt();
}
public void exitGame(){
ssb.shutDown();
}

Riyanto Sigit J2ME - 90


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public void showMenu(){


deviceDisplay.setCurrent(menu);
}
public void showHelp(){
helpSystem.showHelpScreen();
}
}

Program 8-6 adalah contoh file UserOption.java.


import javax.microedition.lcdui.*;
import java.io.*;
public class UserOptions implements CommandListener{
private Form inputForm;
private TextField name;
private TextField alias;
private Display deviceDisplay;
private String nameAlertText = "Your name has changed.";
private String aliasAlertText = "Your alias has changed.";
private String saveAlertText = "Data Saved!";
private Image okImage;
private Alert updateAlert;
private Displayable mainMenu;
private Command saveData;
private OptionsRS optionStore;
public UserOptions(Display d){
name = new TextField("UserName", null, 25, TextField.ANY);
alias = new TextField("alias", null, 25, TextField.ANY);
inputForm = new Form("User Information");
inputForm.append(name);
inputForm.append(alias);
deviceDisplay = d;
try{
okImage = Image.createImage("/dukeok8.png");
}catch(IOException io){
System.out.println("ERR:UserOptions:Unable to load image");
}
updateAlert = new Alert("Data Changed", null,
okImage,AlertType.CONFIRMATION);
updateAlert.setTimeout(Alert.FOREVER);
//inputForm.setItemStateListener(this);
saveData = new Command("Save", Command.OK, 1);
inputForm.addCommand(saveData);
inputForm.setCommandListener(this);
initializeOptions( );
}

Riyanto Sigit J2ME - 91


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private void initializeOptions( ){


optionStore = new OptionsRS( );
if(!optionStore.recordExists()){
name.setString("Joe Smith");
alias.setString("BattleMaster");
saveOptions();
}
}
private void retrieveOptions(){
try{
ByteArrayInputStream bOptions = new
ByteArrayInputStream(optionStore.readOption());
DataInputStream dOptions = new DataInputStream(bOptions);
name.setString(dOptions.readUTF());
alias.setString(dOptions.readUTF());
dOptions.close();
bOptions.close();
}catch(IOException ioe){
System.out.println("ERR:USEROPTIONS: problem retrieving data");
}
}
private void saveOptions(){
try{
ByteArrayOutputStream bOptions = new ByteArrayOutputStream();
DataOutputStream dOptions = new DataOutputStream(bOptions);
dOptions.writeUTF(name.getString());
dOptions.writeUTF(alias.getString());
optionStore.writeOption(bOptions.toByteArray());
dOptions.close();
bOptions.close();
}catch(IOException ioe){
System.out.println("ERR:USEROPTIONS: problem saving data");
}
}
public void registerMenu(Displayable mm){
mainMenu = mm;
}
public void commandAction(Command c, Displayable d){
if (c == saveData){
updateAlert.setString(saveAlertText);
showAlertUpdate();
}
}

Riyanto Sigit J2ME - 92


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

private void showAlertUpdate(){


saveOptions();
deviceDisplay.setCurrent(updateAlert, mainMenu);
}
public void showUserOpt(){
retrieveOptions();
deviceDisplay.setCurrent(inputForm);
}
}

Program 8-7 adalah contoh file OptionRS.java.


import javax.microedition.rms.*;
import java.io.*;
public class OptionsRS{
private String storeName = "StarShipOptions";
private RecordStore optionStore;
private byte[] currentOption;
public OptionsRS(){
try{
optionStore = RecordStore.openRecordStore(storeName,true);
}catch(Exception ioe){
System.out.println("ERR: Opening RecordStore");
}
}
public byte[] readOption(){
try{
if(currentOption == null){
currentOption = optionStore.getRecord(1);
}
}catch(Exception e){
System.out.println("ERR: reading options");
}
return currentOption;
}
public void writeOption(byte[] option){
try{
if(recordExists()){
optionStore.setRecord(1, option,0,option.length);
}else{
optionStore.addRecord(option,0, option.length);
}
}catch(Exception e){
System.out.println("ERR: saving options");
}

Riyanto Sigit J2ME - 93


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

currentOption = option;
}
public boolean recordExists(){
boolean response = true;
try{
if (optionStore.getNumRecords() !=1 ){
return false;
}
}catch(RecordStoreException rse){
System.out.println("ERR:OPTIONRS:unable to read the number of
records");
response = false;
}
return response;
}
public void close(){
try{
optionStore.closeRecordStore();
}catch(Exception e){
System.out.println("ERR: Closing RecordStore");
}
}
}

Program 8-8 adalah contoh file SecretWordItem.java

import javax.microedition.lcdui.*;
public class SecretWordItem extends CustomItem{
private String secretWord = "Cubs";
public SecretWordItem(){
super("PassCode Prompt");
}
public int getMinContentWidth(){ return 100; }
public int getMinContentHeight(){ return 20; }
public int getPrefContentWidth(int width){
return getMinContentWidth();
}
public int getPrefContentHeight(int height){
return getMinContentHeight();
}
public void paint(Graphics g, int w, int h){
g.setColor(0,0,255);
g.fillRect(0,0, w -1, h-1);
g.setColor(255,255,255);
g.drawString(secretWord, 50,0, g.TOP|g.HCENTER);
}

Riyanto Sigit J2ME - 94


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

public boolean checkWord(String word){


boolean result = false;
if (secretWord.equals(word)){
result = true;
}
return result;
}
}

Riyanto Sigit J2ME - 95


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

9 MIDP Security

9.1. Tujuan:
Setelah selesai praktikum ini, kita dapat:
• Membuat sertifikat pada program
• Autentifikasi sebuah MIDlet
• Membuat Midlet yang dapat menangani hubungan statik.
• Membuat Midlet yang dapat menangani hubungan dinamik.

9.2. Latihan 1: Membuat sertifikat pada program


Pada latihan ini, kita dapat menyelesaikan langkah-langkah sbb:
• Menggunakan J2ME Wireless Toolkit untuk memberikan sertifikat pada program.
• Menambah kunci public pada file JAD dengan baik.
• Meberitahukan pada MIDlet-Certificate-n-m: bahwa sertifikat sudah ditambah pada file
JAD.
Tujuan dari latihan ini dapat menggunakan J2ME Wireless Toolkit untuk memberikan sertifikat
pada program. Sekarang game StarShip Battle sudah selesai, kita harus memprotek aplikasi.
Dengan menambah sertifikat pada aplikasi, kita tidak hanya memprotek keaslian intelektual tapi
juga memprotek pemakai dari download yang tidak diinginkan.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah 1 — Menggunakan J2ME Wireless Toolkit untuk memberikan identitas pada
program
Pada langkah ini kita menggunakan J2ME Wireless Toolkit untuk memberikan sertifikat pada
program.

Riyanto Sigit J2ME - 96


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Copy program dari direktori ..\apps\Lab8_Exercise1\src ke direktori ..\apps\Lab9_Exercise1\src


dan ikuti step ini:

1. Jalankan J2ME Wireless Toolkit dan buka proyek lab9_exercise1.

2. Dari menu J2ME Wireless Toolkit pilih Project dan pilih Sign.

3. Untuk membuat kunci baru pilih New Key Pair dan lakukan setting sbb:

• Alias: StarShipBattleKey
• Domain c:=localhost
• O=:Sudent Productions
4. Pilih Create dan pilih trusted dari menu pull-down

5. Pilih OK

Sertifikat telah kita pasang dan kita telah membuat kunci baru yang dapat digunakan untuk
menandai game StarShipBattle kita.
Langkah 2 — Menambah kunci public pada file JAD dengan baik
Keamanan sebuah aplikasi dan API tergantung pada domain proteksi yang baik. Secara umum
aplikasi terinstal dalam domain untrusted pada J2ME Wireless Toolkit. Ketika pada domain
untrusted maka aplikasi harus ijin. Pada MIDP 2.0 memungkinkan untuk menggunakan sertifikat
dengan baik. Pada langkah 1 kita memasang sertifikat secara manual. Kunci private automatis
diinstal pada emulator dan kunci public sekarang ada. Pada langkah ini tambahkan kunci public
pada file JAD dengan baik.
Ikuti step berikut:
1. Jalankan J2ME Wireless Toolkit dan buka proyek lab9_exercise1.

2. Dari menu J2ME Wireless Toolkit pilih File dan pilih Utilities.

3. Pilih Sign Midlet


4. Pilih sertifikat StarShipBattle dari list disebelah kiri
5. Pilih Sign Midlet Suite
6. Dari file chooser, nafigasi file Lab9_exercise1.jad yang terdapat pada direktori
apps\lab9_Exercise1\bin
Langkah 3 — Meberitahukan pada MIDlet-Certificate-n-m: bahwa sertifikat sudah
ditambah pada file JAD

Riyanto Sigit J2ME - 97


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Pada langkah sebelumnya kita tandai Midlet untuk aplikasi StarShipBattle. Pada langkah ini kita
Meberitahukan pada MIDlet-Certificate-n-m: bahwa sertifikat sudah ditambah pada file JAD.
Dengan verifikasi ditandai dengan baik.
Ikuti step berikut:
1. Pada editor teks buka file lab9_Exercise1.jad yang terdapat pada direktori

apps\lab9_Exercise1\bin
2. Bandingkan isi direktori apps\lab9_Exercise1\bin dengan contoh pada program 9-1. Jika
kunci terinstal dengan benar kita dapat melihat program sama dengan contoh program 9-1

Riyanto Sigit J2ME - 98


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

9.3. Latihan 2: Autentifikasi sebuah MIDlet


Pada latihan ini kita install aplikasi menggunakan Over-the-Air (OTA)
Tujuannya adalah pemakai terproteksi ketika menjalankan API tanpa ijin. Meskipun file JAD
berisi sertifikat pemakai tetap pada kondisi prompt untuk ijin. Jika pemakai memilih fungsi help
dari game sementara aplikasi dijalankan. Domain sertifikat dan proteksi hanya relevan dan
digunakan ketika aplikasi diinstal menggunakan OTA. J2ME Wireless Toolkit mempunyai
simulasi proses OTA dari aplikasi transfer dan install. Juga setelah aplikasi diinstal di emulator.
Aplikasi berjalan pada domain proteksi sebenarnya pemakai tidak pada kondisi prompt untuk ijin
untuk menjalankan proteksi API.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Menginstal Aplikasi Menggunakan OTA
Ikuti step berikut:
1. Jalankan J2ME Wireless Toolkit dan buka proyek lab9_exercise1.

2. Dari menu J2ME Wireless Toolkit pilih Project dan pilih Run via OTA.

Disini dipilih emulator dan pemakai berinteraksi dengan emulator Aplication


Management Software (AMS)
3. Pada emulator pilih Apps
Emulator dapat melihat semua Midlet yang diinstal pada peralatan
4. Pilih select pada emulator
Direktori proyek Hypertext Markup Language (HTML) dapat terlihat
5. Pilih Menu dan pilih select
Halaman Lab9_Exercise1.html mulai download
6. Pilih install
AMS mulai download file JAD. Ketika file JAD didownload emulator menampilkan
informasi Midlet
7. Pilih install lagi
AMS download file Java Archieve (JAR) dan install aplikasi pada emulator. Setelah
install lengkap kita lihat suite ditambahkan pada list aplikasi ketika simulator OTA
dijalankan

Riyanto Sigit J2ME - 99


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

8. Untuk verifikasi install berhasil jalankan aplikasi dengan memilih lab9_Exercise1 dari
list kemudian pilih Menu dan pilih Launch
9. Setelah aplikasi dijalankan pilih Help dari menu utama. Kita tidak dapat di promt untuk
ijin menjalankan hubungan jaringan

9.4. Latihan 3: Pendaftaran sebuah hubungan menggunakan konfigurasi


Midlet
Pada latihan ini kita mengembangkan game StarShipBattle untuk memberitahukan pemakai
ketika score tertinggi baru terdaftar dengan server utama.
Keuntungan Push Register adalah informasi dapat dikirim ke peralatan tanpa pemakai
membutuhkan. Informasi dikirim server dari email, sales update, sport information, untuk
merubah score game. Bagaimanapun juga Push Register memperkenalkan ide khusus karena
peralatan pemakai tidak ingin dihentikan oleh informasi yang tidak dibutuhkan.
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Membuat Midlet baru
Copy program dari direktori ke apps\Lab9_Exercise1\src ke apps\Lab9_Exercise5\src Ikuti step
berikut:
1. Deklarasikan sebuah class baru yaitu HighScoreNotification extends class Midlet

didefinisikan dalam javax.microedition.midled dan implementasikan interface


CommandListener yang didefinisikan dalam paket javax.microedition.lcdui
2. Deklarasikan property dari class HighScoreNotification:

• List score – Menampilkan score yang dikirim server ke peralatan


• Display deviceDisplay – menampilkan score ke pemakai
• Command exit – pemakai keluar dari Midlet
3. Deklarasikan method dari class HighScoreNotification:
• void startApp() – populasi property class oleh instant tipe data
Setelah lengkap method getConnection() dapat dipanggil
• void pauseApp() – tidak mempunyai implementasi
• void destroyApp(Boolean unc) - tidak mempunyai implementasi
• public void commandAction(Command c, Displayable d) – Menutup applikasi

Riyanto Sigit J2ME - 100


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• void getConnection() – Merubah list hubungan dari Push Registry


tiap hubungan sebuah thread baru dibuat yang menangani jaringan untuk merubah
informasi.
4. Mendeklarasikan inner class yaitu ConnectionHandler yang mengimplementasikan
interface Runnable
5. Mendeklarasikan property String connURL dalam interface ConnectionHandler. Properti
merepresentasikan URL untuk menghubungkan tanggung jawab thread. Properti ini set
instant dan memanggil method konstruktor.
6. Mendeklarasikan method dalam interface ConnectonHandler:
• ConnectionHandler(String cURL) – Konstruktor digunakan untuk set property
connURL
• void run() – berisi informasi pengiriman jaringan dan mengupdate score.
7. Set property J2Me Wireless Toolkit:

9.5. Latihan 4: Pendaftaran sebuah hubungan menggunakan pemrograman


Pada latihan ini kita mendaftar sebuah hubungan static menggunakan JAD. Pada latihan ini kita
merubah aplikasi yang dikembangkan dalam latihan terakhir untuk menggunakan dinamik Pust
Registry dibandingkan pendaftaran static
Persiapan
Untuk menyiapkan latihan ini lakukan setting computer pada lokasi direktori: labdir = ________
Langkah — Modifikasi Aplikasi HighScoreNotification
1. Copy program dari direktori ke apps\Lab9_Exercise5\src ke apps\Lab9_Exercise6\src
2. Tambahkan properti pada midlet HighScoreNatification:
• String url = ”socket://:1024;
• String data=null;
3. Tambahkan method pada midlet HighScoreNatification:

Riyanto Sigit J2ME - 101


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

• boolean connectionRegistered(String URL) – Iterasi melalui semua hubungan yang


didaftarkan dengan Push Registy. Jika URL ditemukan maka true dan jika tidak false.
• void registerConn(String URL) – Daftarkan URL yang dilewatkan dengan Push
Registry.
4. Setelah startApp() cek property URL yang dilewatkan Push Registry dengan memanggil
method connectionRegistered(String URL). Jika false maka method registerConn(String
URL) dijalankan lewatkan parameter property url. Iterasi menggunkan semua hubungan
untuk menentukan jika ada data yang datang dan penting untuk ditangani.

9.6. Penyelesaian Latihan


Gunakan penyelesaian untuk mengecek jawaban anda pada latihan dalam lab.
Latihan 1: Membuat Sertifikat
Gunakan program 9-1
Latihan 2: Autentifikasi sebuah Midlet
Setelah aplikasi dijalankan kita dapat memilih Help dari menu utama tanpa prompt untuk ijin
untuk menjalankan hubungan jaringan.
Latihan 3: Pendaftaran sebuah hubungan menggunakan konfigurasi Midlet
Bandingkan jawaban anda dengan contoh program 9-2 pada file HighScoreNotification.java.
Program 9-2 adalah contoh file HighScoreNotification.java – Static Registration

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class HighScoreNotification extends MIDlet implements CommandListener{
private List scores;
private Display deviceDisplay;
privat.e Command exit;
public void startApp(){
deviceDisplay = Display.getDisplay(this);
scores = new List(“Latest High Scores”, Choice.IMPLICIT ) ;
exit = new Command(“Exit”,Comnand.EXIT, 1);
scores.addCommand(exit ) ;

Riyanto Sigit J2ME - 102


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

scores. setcommandListener(this);
getConnections();
deviceDisplay.setCurrent(scores);
)
public void pauseApp(){
}
public void destroyApp(boolean unconditional){
}
public void commandAction(Command a, Displayable d){
destroyApp(false);
notifyDestroyed();
}
private void getConnections(){
String [] connlist = PushRegistry.ListConnections(true) ;
if(connList.length == 0){
errorAlert();
}else{
for(int index = 0;index<connList.length;index++) {
Thread handler = new Thread(new ConnectionHandler(connList[index]));
handler.start();
}
}
}

private void erroralert ( ) {


Alert.error = new Alert("Scores Unavailable", "I will notify you
when\n the scores have\n changed", null, AlertType.INFO);
error. setTimeout (Alert.FOREVER) ;
deviceDisplay.setCurrent(error,scores);
}
class ConnectionHandler implements Runnable{
private String connURL;
public ConnectionHandler(String inURL) {
connURL = inURL;
}
public void run(){
try{
ServerSocketConnection ssc =
(ServerSocketConnection)Connector.open (connURL);
SocketConnection sc = (SocketConnection)ssc.acceptAndOpen();
Inputstream in = sc.openInputStream();
InputstreamReader inMsg = new InputStreamReader(in);
char[] temp = new char[128];
StringBuffer data = new String Buffer(512);

Riyanto Sigit J2ME - 103


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

while(inMsg.read(temp,0,temp.length)!=-1){
data.append(temp) ;
}
if(data.length()!=0){
scores.append(data.toString().trim(),nu11) ;
}
inMsg.close();
sc.close();
ssc.close();
System.out.println("Closed the connection");
}catch(Exception e) {
System.out.println(“ERR: "+ connURL);
e.printstackTrace();
}
System.out.println("Leaving run()");
}
}
}

Latihan 4: Pendaftaran sebuah hubungan menggunakan pemrograman


Bandingkan jawaban anda dengan contoh program 9-3 pada file HighScoreNotification.java.
Program 9-3 adalah contoh file HighScoreNotification.java – Dynamic Push Registration

import javax.microedition.io.*;
import javax.microedition.1cdui.*;
import javax.microedition.midlet .*;
import java.io.*;
public class HighScoreNotification extends MIDlet implements CommandListener{
String url=”socket://:5000”;String data=null;
TextBox msg;Command exit;
public void startaApp(){
try{
if (!connect.ionRegistered(url) ){
registerConn(url);
}
String [] conns = PushRegistry.listConnections(true) ;
for(int index = 0,index<conns.length;index++){
data = handleConnection(conns [index] ) ;
}
}catch(Exception e) {
System.out.println("ERR: instartApp(),' ) ;
}

Riyanto Sigit J2ME - 104


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

if(data==null){
data = “No Messages”;
}
msg = new TextBox("Incoming Message", data, data.length() +1,
TextFieId.ANY) ;
exit = new Command("Exit", Command.EXIT,1);
msg.addCommand(exit);
msg.setCommandListener(this) ;
Display d = Display.getDisplay(this) ;
d.setCurrent (msg);
}
public void pauseApp(){
}
public void destroyApp(boolean unc) {
}
public String handleConnection(String url) {
String response = null;
try{
ServerSocketConnection ssc =
(ServerSocketConnection)Connector.open (url ) ;
Socketconnection sc = (SocketConnection) ssc. acceptAndOpen ( ) ;
InputStream in = sc.openlnputStream();
iputStreamReader input = new InputstreamReader(in) ;
char[] temp = new char[128];
StringBuffer data = new StringBuffer(512);
while(input.read(temp,0, temp.length)!=-1) {
data.append(temp);
}
if(data.length()!=0){
response = data.toString();
)
input.close();
)catch(Exception e) {
System.out.println("Err:handleConnection()”) ;
}
return response;
}
public boolean connectionRegistered(String url) {
boolean response = false;
try{
String [] regConns = PushRegistry.listConnections(false);
for(int index=0; index < regconns.length; index++) {
if (regConns [index] .equals (ur1)){
response = true;
}catch(Exception e) {

Riyanto Sigit J2ME - 105


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

System.out.println("ERR: connectionRegistered()");
}
return responsei;
}
public void registerConn(String url) {
String name = this.getClass().getName(); String filter=”+”;
try{
PushRegistry.registerConnection (url, name, filter);
)catch(Exception e) {
System.out.println(“ERR: Connection”);
}
}
public void commandAction(Command c, Displayable d){
destroyApp(false);
notifyDestroyed();
}
}

Riyanto Sigit J2ME - 106


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Praktikum

10 Over the Air Provisioning

10.1. Tujuan:
Setelah selesai praktikum ini, kita dapat melengkapi aplikasi MIDP 2.0
10.2. Latihan : Melengkapi Aplikasi MIDP 2.0
Pada latihan ini, kita dapat menyelesaikan langkah-langkah sbb:
• Verifikasi konfigurasi web server dan menginstal aplikasi untuk pengembangan
• Menginstal aplikasi dalam web server
• Mengakses aplikasi menggunakan kelengkapan OTA
OTA adalah proses yang dikembangkan pada aplikasi mobile di atas peralatan mobile. Ada
banyak cara untuk mengembangkan OTA, salah satunya untuk aplikasi web server yang dapat
diakses oleh peralatan mobile. Setelah aplikasi diinstal di web server peralatan mobile harus
tersedia mekanisme untuk menginisialisasi download dan proses penginstalan.
Tujuan latihan ini untuk mengembangkan aplikasi pada Tomcat Web Server dan inisialisasi
proses instal dari J2ME Wireless Toolkit.
Persiapan
Tomcat Web Server dibutuhkan untuk menyelesaikan praktikum ini.
Menyiapkan latihan sesuai seting workstation.
Tomcat Web Server instan pada direktori:
Installation directory = __________
Lab directory location = _________
Langkah 1 — Verifikasi konfigurasi web server dan menginstal aplikasi untuk
pengembangan
Untuk mengembangkan aplikasi harus ada sebuah server. Tomcat Web Server adalah server
bebas yang dapat digunakan untuk test proses OTA. Tomcat siap diinstal pada sistem.

Riyanto Sigit J2ME - 107


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Bagaimanapun juga server tidak mempunyai verifikasi. Pada langkah ini verifikasi konfigurasi
tipe MIME pada web server dan instal aplikasi untuk deployment.
Tomcat mendefinisikan semua tipe MIME dengan file web.xml. Ikuti step ini:
1. Buka instalasi direktori file \conf\web.xml pada teks editor. Ketika sebuah peralatan

mobile membutuhkan hubungan JAD, server memberikan indikasi data dikembalikan


sebuah tipe MIME tekxt/vnd.sun.j2me.app-descriptor.
2. Jalankan pencarian tipe MIME untuk menverifikasi tipe MIME dengan benar

didefinisikan pada Tomcat file web.xml.


3. Jika tipe MIME tidak ditemukan tambahkan dalam tipe MIME bagian Mapping pada file

web.xml:
<mime-mapping>
<extention>jad</extention>
<mime-type>text/vnd.sun.j2me.app-descriptor</mime-type>
</mime-mapping>
4. Simpan perubahan dan tutup file web.xml

Langkah 2 — Menginstal aplikasi dalam web server


Setelah web server di setup dengan baik kita dap menginstal aplikasi dalam web server. J2ME
Wireless Toolkit mempunyai pilihan paket aplikasi yang membuat aplikasi mudah diinstal.
Ketika aplikasi dipaket, J2ME Wireless Toolkit men-generate tiga file dalam direktori Project
bin.
• ProjectName.html – ini adalah standar halaman html yang terlihat dipaket dengan
hubungan file JAD.
• ProjectName.jad - ini versi terakhir dari aplikasi file descriptor.
• ProjectName,jar – ini file JAR dari Midlet yang berisi file-file class dan sumber yang
dibutuhkan midlet.
Pada langkah ini kita meletakkan file pada lokasi dimana peralatan mobile dapat diakses.
1. Membuat kebutuhan file yang ada di pemakai, copy file dari direktori project bin
untuk menginstal direktori \webapps\ROOT\
2. Jalankan perintah untuk menjalankan web server: startup.bat.

Riyanto Sigit J2ME - 108


Wiratmoko Yuwono
Politeknik Elektronika Negeri Surabaya

Langkah 3 — Mengakses aplikasi menggunakan kelengkapan OTA


Pada langkah ini kita mengakses aplikasi menggunakan fitur OTA dalam J2ME Wireless Toolkit
dan kebutuhan file HTML yang di copy pada langkah 2 step 1
1. Pada J2ME Wireless Toolkit pilih option RUN via OTA dari menu Project
Pada aksi ini memulai emulator AMS dan menyediakan akses pada aplikasi yang diinstal
pada emulator.
2. Pada emulator pilih Apps.
Pada aksi ini menuju menu Aplikasi yang menyediakan semua program yang diinstal
dalam emulator.v
3. Dari list Aplikasi pada program pilih SELECT pada peralatan.
Instal Aplikasi dan prompt kita menuju website dari aplikasi yang diinstal. Default
emulator menuju file HTML yang dilokasikan pada direktori Project bin yang terbuka.
4. Untuk download aplikasi dari Tomcat gunakan URL:
http://localhost:8080/Application.html
File HTML yang dipindahkan ke direktori webapps\ROOT pada step 1 dari latihan 2-
Instal aplikasi pada server.
5. Setelah lengkap rubah URL pilih Menu
6. Pilih SELECT untuk mengirim file HTML
Ditampilkan nama yang akan didownload.
7. Pilih instal pada peralatan untuk mengirim file JAD ke peralatan. Setelah pengiriman
lengkap kita dapat melihat informasi tentang midlet berdasarkan setting pada file JAD.
Sekarang kita verifikasi aplikasi untuk mengirim file JAR.
8. Pilih instal untuk download dan instal aplikasi pada peralatan. Aplikasi sekarang terinstal
pad emulator dan proses OTA lengkap.

Riyanto Sigit J2ME - 109


Wiratmoko Yuwono