Mengakses Web Services Dari Aplikasi Java Micro Edition (Mobile)

Artikel ini adalah request dari Erna

Seorang mahasiswi bertanya bagaimana cara mengakses database yang ada di server melalui aplikasi Java Micro Edition (JME) di ponsel.  Salah satu cara yang dapat ditempuh adalah dengan menggunakan web services.  Pada tulisan ini, saya akan memakai WS-* Web Services.  Alternatif lain adalah memakai web service RESTfulyang lebih ringan.

Membuat Web Service dengan Java Di Sisi Server

Web Service akan dijalankan pada komputer server yang terhubung dengan database.   Saya akan menggunakan NetBeans IDE. Langkah pertama adalah memilih menu File, New Project…  Kemudian pilih Java Web, Web Application.  Klik tombol Next. Berikan sebuah nama proyek seperti LatihanWebService, kemudian klik tombol Next.

Pada langkah berikutnya, saya memakai server GlassFish Server 3.1.2 dan versi Java EE 6 Web.  Saya membiarkan context path saya berupa /LatihanWebService.  Karena saya tidak akan memakai framework, maka saya langsung men-klik tombol Finish.

Klik kanan pada nama proyek, kemudian pilih New, Web Service…  Pada Web Service Name, isi dengan AksesDatabase.  Kemudian pada package, isi dengan co.id.jocki.webservice.  Kemudian klik tombol Finish.

Pada nama proyek, akan ada folder Web Services yang didalamnya terdapat node AksesDatabase.  Klik kanan pada AksesDatabase, kemudian pilih Add Operation…  Isi Name dengan lihatIsiTabel, dan isi Return Type dengan java.util.ArrayList<String>.  Klik tombol OK.

Saya akan menambah sebuah operasi lagi.  Untuk itu, saya kembali men-klik kanan pada AksesDatabase, kemudian saya memilih Add Operation…  Kali ini saya mengisi dialog yang muncul sehingga terlihat seperti berikut ini:

Membuat operasi Web Service

Membuat operasi Web Service

Klik tombol OK untuk menutup dialog.

Karena saya akan memakai database MySQL, saya perlu menambahkan MySQL connector terlebih dahulu.  Saya men-klik kanan pada nama proyek (LatihanWebService), lalu memilih Properties.  Kemudian saya memilih Libraries, Add Library…  Pada pilihan yang muncul, saya memilih MySQL JDBC Driver, kemudian saya men-klik tombol Add Library.  Klik tombol OK untuk menutup dialog.

Jika saya men-double klik pada AksesDatabase di Projects, NetBeans akan memunculkan kode program dimana saya bisa menuliskan implementasi.  Saya akan memakai kode program Java 7, sehingga untuk menjalankan program ini dibutuhkan Java JDK minimal versi 7.  Java versi terbaru dapat di-download di http://www.oracle.com/technetwork/java/javase/downloads/index.html.  Selain itu, saya men-klik kanan nama proyek, memilih Properties.  Pada Sources, saya memastikan bahwa JDK 7 sedang dipilih di bagian Source/Binary Format.

Berikut ini adalah isi file AksesDatabase.javayang telah saya modifikasi:

package co.id.jocki.webservice;
import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource;
import java.sql.*;
import java.util.ArrayList;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService(serviceName = "AksesDatabase")
public class AksesDatabase {
  private MysqlConnectionPoolDataSource dataSource;

  public AksesDatabase() {
    dataSource = new MysqlConnectionPoolDataSource();
    dataSource.setUser("jocki");
    dataSource.setPassword("password");
    dataSource.setURL("jdbc:mysql://localhost:3306/latihan"); 
  }

  private void buatTabelBilaBelumAda(Connection cn) throws SQLException {
    ResultSet rs = cn.getMetaData().getTables(null, null, "namatabel", null);
    if (rs.next()==false) {
      // Tidak ada tabel dengan nama 'namatabel', maka buat tabel tersebut
      cn.createStatement().execute("CREATE TABLE namatabel (data VARCHAR(255))");
    }
  }
  @WebMethod(operationName = "lihatIsiTabel")
  public ArrayList<String> lihatIsiTabel() {
    ArrayList<String> lstReturn = new ArrayList<>(); 
    try (Connection cn = dataSource.getConnection()) {
      buatTabelBilaBelumAda(cn);
      Statement stmt = cn.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT data FROM namatabel");
      while (rs.next()) {
        lstReturn.add(rs.getString("data"));
      }
    } catch (Exception ex) {
      System.out.println("Kesalahan [" + ex.getMessage() + "]");
    } 
    return lstReturn;
  }
  @WebMethod(operationName = "tambah")
  public boolean tambah(@WebParam(name = "nilai") String nilai) { 
    try (Connection cn = dataSource.getConnection()) {
      buatTabelBilaBelumAda(cn);
      PreparedStatement ps = cn.prepareStatement("INSERT INTO namatabel VALUES (?)");
      ps.setString(1, nilai);
      ps.executeUpdate();
    } catch (Exception ex) {
      System.out.println("Kesalahan [" + ex.getMessage() + "]");
      return false;
    }
    return true;
  }
}

Pada kode program di atas, saya mengandaikan bahwa nama user MySQL adalah jocki dan password-nya adalah password.  Bila di database tidak ada user lain, bisa juga menggunakan nama user root dan password dikosongkan (“” / string kosong).   Saya juga mengandaikan nama database yang diakses adalah latihan (ini harus sesuai dengan nama database yang ada di MySQL).

Jalankan web services dengan men-klik kanan pada nama proyek LatihanWebService kemudian memilih menu Run.  Jangan matikan server ini karena nanti akan dipanggil oleh aplikasi JME.

Untuk informasi lebih lanjut mengenai bagaimana cara membuat web services atau ingin membuat implementasi web services dalam bahasa lain, baca artikel yang saya tulis di https://thesolidsnake.wordpress.com/2012/07/04/membuat-web-service-soap-dengan-php-dan-memanggilnya-di-client-java/ , https://thesolidsnake.wordpress.com/2012/05/26/memanggil-web-service-dari-server-java-ee-di-client-php/, atau https://thesolidsnake.wordpress.com/2012/07/08/perbandingan-web-service-soap-antara-java-ee-vs-php/ .

Membuat Aplikasi JME Sebagai Client

Saya akan membuat sebuah aplikasi JME dengan memilih menu File, New Project…  Lalu memilih Java ME, Mobile Application.  Pada Project Name, saya memberi nama LatihanClient.  Saya menghilangkan tanda centang di bagian Create Hello Midlet.  Kemudian saya men-klik tombol Next.  Pada Emulator Platform, saya akan memiliki CLDC Oracle Java(TM) Platform Micro Edition SDK 3.0.5.  Lalu pada Device, saya memilih DefaultCldcMsaPhone1.   Saya memastikan Device Configuration bernilai CLDC-1.1 dan Device Profile bernilai MIDP-2.1.  Kemudian saya men-klik Finish untuk membuat proyek tersebut.

Saya membuat sebuah MIDlet baru dengan men-klik kanan pada nama proyek, kemudian memilih New, MIDlet…  Pada MIDlet Name, saya mengisi LatihanMidlet.  Pada Package, saya mengisi co.id.jocki.midlet.  Lalu saya men-klik tombol Finish.

Langkah berikutnya adalah membuat stub untuk web services.  Saya mulai dengan men-klik kanan pada nama proyek, memilih New, Others…  Pada MIDP, saya memilih Java ME Web Service Client dan men-klik tombol Next. Pada langkah Java ME Web Service Client Information, pilih Running Web Service,  isi WSDL URL dengan http://localhost:8080/LatihanWebService/AksesDatabase.    Ini adalah URL web service yang telah saya buat sebelumnya.  Lalu klik tombol Retrieve WSDL.  Jika tidak terjadi kesalahan, NetBeans akan mengisi field yang ada secara otomatis seperti yang terlihat pada gambar berikut ini:

Menambah Stub WS ke Java ME

Menambah Stub WS ke Java ME

Klik tombol Finish untuk selesai.

Sekarang, di proyek JME LatihanClient, akan ada package AksesDatabase yang dibuat secara otomatis.  Yang perlu saya lakukan sekarang adalah menambahkan kode program pada LatihanMiddlet.java yang akan memakai stub tersebut untuk mengakses web services.

Berikut ini adalah isi LatihanMiddlet.javayang telah saya modifikasi:

package co.id.jocki.midlet;

import aksesdatabase.AksesDatabase;
import aksesdatabase.AksesDatabase_Stub;
import java.rmi.RemoteException;
import javax.microedition.lcdui.*;
import javax.microedition.midlet.MIDlet;

public class LatihanMidlet extends MIDlet {

    private List listData;
    private Form frmTambah;
    private TextField txtData;
    private Command cmdSimpan;
    private Command cmdTambah;

    public void startApp() {
        if (listData==null) {            
            listData = new List("Data Di Database", List.EXCLUSIVE);            
            cmdTambah = new Command("Tambah", Command.ITEM, 0);            
            listData.addCommand(cmdTambah);
            listData.setCommandListener(new CommandListener() {

                public void commandAction(Command c, Displayable d) {
                    if (c==cmdTambah) {
                        Display.getDisplay(LatihanMidlet.this).setCurrent(frmTambah);
                    }
                }

            });

            frmTambah = new Form("Akses Database");
            txtData = new TextField("Data", null, 20, TextField.ANY);
            frmTambah.append(txtData);
            cmdSimpan = new Command("Simpan", Command.OK, 0);
            frmTambah.addCommand(cmdSimpan);
            frmTambah.setCommandListener(new CommandListener() {

                public void commandAction(Command c, Displayable d) {
                    if (c==cmdSimpan) {
                        String data = txtData.getString();
                        simpanDataKeDatabase(data);
                        getDataDariDatabase();
                        Display.getDisplay(LatihanMidlet.this).setCurrent(listData);
                    }
                }

            });

        }
        getDataDariDatabase();
        Display.getDisplay(this).setCurrent(listData);
    }        

    private void getDataDariDatabase() {
        AksesDatabase aksesDatabase = new AksesDatabase_Stub();
        listData.deleteAll();
        try {
            String[] data = aksesDatabase.lihatIsiTabel();
            for (int i=0; i<data.length; i++) {
                listData.append(data[i], null);
            }
        } catch (RemoteException ex) {            
            listData.append("Kesalahan Akses Data [" + ex.getMessage() + "]", null);
        }
    }

    private void simpanDataKeDatabase(String data) {
        AksesDatabase aksesDatabase = new AksesDatabase_Stub();
        try {
            aksesDatabase.tambah(data);
        } catch (RemoteException ex) {
            listData.append("Kesalahan Simpan Data [" + ex.getMessage() + "]", null);
        }
    }

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
    }
}

Sekarang, saya akan mencoba menjalankan aplikasi JME tersebut dengan men-klik icon Run (F6).  Tampilan awal adalah sebuah List yang harusnya berisi isi tabel (saat ini masih kosong karena belum ada data):

Tampilan Awal (Isi Tabel Masih Kosong)

Tampilan Awal (Isi Tabel Masih Kosong)

Pilih menu “Tambah” (dengan left soft key/tombol untuk menu kiri).  Akan muncul frmTambah yang berisi sebuah TextField.  Saya mengisi TextField ini dengan jocki, kemudian memilih menuSimpan:

Menambah Data Baru

Menambah Data Baru

Hal ini akan menyebabkan nilai “jocki” disimpan di tabel database.   Sekarang saat List mengambil data dari tabel di database, ia akan menemukan sebuah data:

Data Diambil Dari Database

Data Diambil Dari Database

Seandainya saya menambah sebuah data baru dengan nilai “keren”, isi List akan terlihat seperti:

Mengambil Data Dari Database

Mengambil Data Dari Database

Bila ingin lebih yakin lagi, silahkan periksa isi tabel di database dan pastikan terdapat dua record dengan nilai “jocki” dan “keren”.

Iklan

Memakai J2ME Polish GUI

Setelah selesai melakukan konfigurasi, memakai J2ME Polish GUI sangatlah mudah.  Yang perlu dilakukan adalah membuat sebuah file polish.css di lokasi direktori resource yang telah ditentukan di build.xml.  Berikut ini adalah contoh sebuah MIDlet yang dibuat dengan menggunakan J2ME Polish GUI:

Contoh MIDlet Yang Memakai J2ME Polish GUI

Contoh MIDlet Yang Memakai J2ME Polish GUI

Berikut ini adalah isi file polish.css untuk menghasilkan output seperti gambar di atas:

.menuUtama {
	background {
		type: snowflakes;
		color: #cccccc;
		flake-color: white;
		max-flake-size: 20;
		number-of-flakes: 50;
	}
	layout: horizontal-expand | horizontal-center | vertical-center;
}

.pilihanMenu {
	layout: expand | center;
	font {
		face: proportional;
		size: large;
		color: black;
	}
}

.pilihanMenu:hover {
	layout: expand | center;
	font {
		size: large;
		color: #dddddd;
	}
	background {
		type: pulsating;
		start-color: #333333;
		end-color: #cccccc;
		back-and-forth: true;
		repeat: true;
	}
}

title {
	background {
		type: web20;
		color: #aaaaaa;
		circle-color: #cccccc;
		circle-anchor: bottom;
	}
	font {
		face: proportional;
		size: large;
		color: #333333;
	}
	text-effect: drop-shadow;
	layout: expand | center;
}

menu {
	background {
		type: horizontal-stripes;
		first-top-color: #aaaaaa;
		second-top-color: #777777;
		first-bottom-color: #dddddd;
		second-bottom-color: #aaaaaa;
	}
}

leftcommand {
	text-effect: shadow;
	text-shadow-color: #cccccc;

}

Isi MIDlet-nya sendiri sangatlah sederhana, dengan kode program yang sangat familiar bagi yang sudah terbiasa memakai LCDUI:

package co.id.jocki.latihan;

import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.List;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class LatihanMIDlet extends MIDlet {

	private Display display;
	private List lstMenuUtama;

	public LatihanMIDlet() {

		display = Display.getDisplay(this);

		//#style menuUtama
		lstMenuUtama = new List("The Solid Snake", List.IMPLICIT);

		//#style pilihanMenu
		lstMenuUtama.append("New Game", null);
		//#style pilihanMenu
		lstMenuUtama.append("Load Game", null);
		//#style pilihanMenu
		lstMenuUtama.append("Options", null);
		//#style pilihanMenu
		lstMenuUtama.append("Exit", null);

	}

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
	}

	protected void pauseApp() {
	}

	protected void startApp() throws MIDletStateChangeException {
		display.setCurrent(lstMenuUtama);
	}

}

Yang membedakan hanyalah terdapat preprocessor #style (dalam bentuk comment) yang hanya akan dimengerti oleh J2ME Polish GUI, dan akan dipakai untuk melakukan translasi kode program nantinya.

Artikel ini juga dilengkapi dengan sebuah video tutorial yang dapat dilihat di sini.

Konfigurasi J2ME Polish

Framework J2ME Polish menyertakan build.xml yang merupakan build file Apache Ant yang dipakai untuk men-compile dan menjalankan emulator.   Dengan demikian, pada dasarnya, J2ME Polish dapat dipakai pada IDE apa saja asalkan telah mendukung Apache Ant.  Salah satu pengecualian adalah pada IDE NetBeans karena IDE tersebut telah menggunakan Apache Ant untuk menjalankan tugas-tugas standar, sehingga programmer harus memakai file build-netbeans.xml yang akan meng-‘extends‘ task bawaan NetBeans (yang terletak di lokasi nbproject/build-impl.xml).  Bila hal ini menyebabkan perilaku NetBeans menjadi aneh, sebaiknya jangan menggunakan plugin J2ME Polish untuk NetBeans!  Sebaliknya, jalankan build.xml secara manual atau terpisah dari IDE tersebut.  Pada IDE Eclipse, seseorang dapat memilih menu Window, Show View, Others.., kemudian memilih Ant, Ant.  Pada window yang muncul, klik kanan bagian kosong dan pilih Add Buildfiles…, kemudian pilih build.xml bawaan J2ME Polish yang telah di-copy ke folder project sebelumnya.

Tanpa menggunakan plugin, project dapat dibuat seperti membuat project Java ME biasanya.  Bedanya, file build.xml dan resources yang diperlukan harus di-copy secara manual ke folder project yang telah dibuat.  Setelah itu, buka file build.xml dan lakukan perubahan pada file tersebut.

Target <target name=”j2mepolish”> adalah bagian yang paling sering harus diubah.  Pada target ini dapat ditemukan tag <j2mepolish> yang di dalamnya terdapat sejumlah tag lagi, seperti <info>, <deviceRequirements>, <build>, dan <emulator>.

Tag <info> berisi informasi mengenai MIDlet, yang dapat diubah sesuai kebutuhan, misalnya:

<info
  name="Latihan MIDlet"
  version="1.0.0"
  description="Latihan pertama saya"
  vendorName="SolidSnake"
  infoUrl="https://thesolidsnake.wordpress.com"
  jarName="latihan.jar"
  jarUrl="${polish.jarName}"
  copyright="Copyright 2011 SolidSnake."
/>

Informasi yang ada di tag <info> nantinya akan mempengaruhi isi file JAD yang dihasilkan.  Sebagai catatan, file JAD adalah file teks yang berisi informasi mengenai aplikasi, yang akan di-download oleh pengguna sebelum men-download file JAR.

Tag <deviceRequirements> merupakan salah satu kelebihan memakai J2ME Polish!!  Dengan adanya tag ini, kita dapat menentukan target perangkat mobile dari aplikasi.  J2ME Polish memiliki sejumlah besar daftar perangkat yang tersimpan di file vendors.xml, devices.xml, dan capabilities.xml.  Ketiga file ini telah terdapat dalam file enough-j2mepolish-build.jar.  Untuk melihat ketiga file ini, buka file enough-j2mepolish-build.jar dengan program yang dapat membaca arsip zip.  Bila daftar yang ada dinilai masih kurang, seseorang dapat menambahkan perangkat baru di file custom-devices.xml.

Di dalam tag <deviceRequirements>, terdapat satu atau lebih tag <requirement>yang menjadi persyaratan bagi perangkat yang dapat menjalankan aplikasi ini.  Cara yang paling gampang adalah menyamakan Identifier dari perangkat, seperti yang terlihat di:

<deviceRequirements>
  <requirement name="Identifier" value="Generic/AnyMidp1Phone" />
</deviceRequirements>

Jika ingin platform yang lebih spesifik, nilai value pada Identifier dapat diganti menjadi seperti “Nokia/Series40E3”, “Sony-Ericsson/JavaPlatform7”, dan sebagainya.  Nilai ini harus sesuai dengan yang ada di vendors.xml dan devices.xml.

Lalu apa yang membuat <deviceRequirements> berguna?  Tag ini memiliki atribut if dan unless, sehingga seseorang bisa mengatur deviceRequirement apa saja yang aktif berdasarkan property Ant.  Misalnya, jika terdapat konfigurasi seperti:

<deviceRequirements if="untukNokiaS40Saja">
  <requirement name="Identifier" value="Nokia/Series40E3" />
</deviceRequirements>
<deviceRequirements if="untukSEJP7Saja">
  <requirement name="Identifier" value="Sony-Ericsson/JavaPlatform7" />
</deviceRequirements>

maka jika <property name=”untukNokiaS40″ value=”true” /> dipanggil sebelumnya, maka hanya deviceRequirements tersebut saja yang aktif.  Dengan demikian, seseorang bisa membuat target seperti “jalankanNokia“, “jalankanSonyEricson“, dan sebagainya, sehingga proses pengembangan aplikasi yang sama untuk banyak vendor berbeda menjadi mudah.

Tag <build> akan men-compile dan membuat file JAR dari kode program.  Tag ini memiliki sejumlah elemen seperti <midlet>, <variables>, <resources>, <obfuscator>, dan lainnya.  Yang harus diubah adalah tag <midlet> dimana programmer harus menentukan class MIDlet dan nama MIDlet.  Satu hal yang berguna dan tidak ditemui pada IDE standar adalah tag <midlet> juga mendukung atribut if.  Ini berarti seseorang dapat menentukan MIDlet apa saja yang akan menjadi bagian dari JAR berdasarkan kondisi tertentu!  Sementara pada IDE seperti NetBeans dan Eclipse, seluruh MIDlet dalam proyek yang sama akan di-bundle menjadi satu kesatuan, tanpa pengkondisian tertentu.

Terakhir, untuk menjalankan emulator, tambahkan tag <emulator>.  Tag ini sangat sederhana, hanya terdiri dari atribut seperti wait, securityDomain, enableProfiler, enableMemoryMonitor, dan sebagainya.  Perlu diingat bahwa programmer TIDAK menentukan secara manual emulator apa yang akan dijalankan.  J2ME Polish secara otomatis menentukan emulator yang akan dijalankan berdasarkan pengaturan di deviceRequirements.  Pada banyak kasus, J2ME Polish akan menjalankan MicroEmulator yang sudah ter-install bersama dengannya.  MicroEmulator adalah emulator JME yang berjalan pada Java Standard Edition.

Bila tidak ingin memakai MicroEmulator, melainkan emulator bawaan Java ME Platform SDK, gunakan Identifier seperti Generic/AnyMidp1Phone pada deviceRequirements.  Perlu diingat bahwa Java ME Platform SDK mungkin akan menolak menjalankan JAR yang telah mengandung file-file class J2ME Polish karena memiliki ukuran yang besar, di atas 1 MB.  Untuk mengatasi permasalahan ini, masuk ke direktori instalasi Java ME Platform SDK 3.0, kemudian buka direktori runtimes, lalu cldc-hi-javafx, dan kemudian buka direktori bin.  Edit file jwc_properties.ini yang terdapat pada direktori tersebut dengan notepad atau editor lainnya.  Gunakan fitur search untuk mencari tulisan system.jam_space, kemudian ganti nilai 1000000 menjadi nilai yang lebih besar.

Setelah itu, tutup device-manager.exe melalui icon di taskbar ataupun melaui task manager.  Jalankan kembali target Ant j2mepolish, dan kini emulator Java ME Platform SDK akan menampilkan MIDlet dengan lancar.  Tapi satu hal yang perlu diingat adalah pada kenyataannya, sama seperti emulator yang sebelumnya menolak, perangkat mobile lama mungkin juga tidak mendukung file JAR yang besar.

Memakai J2ME Polish Di Dalam NetBeans

J2ME?  Sebuah nama yang masih mewakili generasi lama, karena Sun (kini dibeli Oracle) sudah lama mengganti nama Java 2 Micro Edition (J2ME)  menjadi Java Micro Edition (JME).  Dari sisi teknologi sendiri, kini sudah ada Java FX yang semakin didukung.  Lalu kenapa masih memakai J2ME Polish?

J2ME Polish adalah sebuah framework tambahan dari Enough Software dan bersifat open-source.  J2ME Polish terdiri atas beberapa komponen, seperti:

  • Lush,  untuk perancangan user interface.
  • Janus, untuk transcoding aplikasi Java Micro Edition ke BlackBerry atau Android.
  • Touch, untuk mempermudah pemograman networking.
  • Trunk, untuk menyederhanakan proses menyimpan dan membaca data.
  • Marjory, merupakan kumpulan database yang berisi informasi perangkat mobile, yang dihimpun bersama oleh komunitas.

Pada konotasi secara umum dan juga pada artikel ini, J2ME Polish sering dirujuk dengan komponen Lush-nya, sehingga asumsi-nya J2ME Polish adalah framework berbasis GUI.

Jika memang demikian, apa kelebihan framework user interface di J2ME Polish?  Pada beberapa framework lain, seperti Kuix (Kalmeo User Interface eXtensions), tampilan user interface digantikan sepenuhnya dengan menggunakan XML.  J2ME Polish mengambil pendekatan yang berbeda, dimana J2ME Polish tetap menggunakan class-class LCDUI seperti class Form dan turunan Item (TextField, StringItem, dsb).  Hal ini berarti untuk beralih dari proyek yang sudah ada ke J2ME Polish, programmer tidak perlu mengubah kode program yang sudah ada.  J2ME Polish tentu saja juga menyediakan class-class tambahan, seperti TabbedForm, TreeItem, dan sebagainya.  Setiap komponen tersebut dapat di-customize dengan membuat sebuah file teks yang menggunakan syntax CSS.

Kelemahan J2ME Polish, sama seperti framework lainnya yang bukan merupakan bagian dari standar Java, adalah ukuran JAR yang meningkat beberapa kilobyte.  Ini karena JAR harus menyertakan kode program J2ME Polish.

File JAR J2ME Polish dapat di-download di http://www.enough.de/products/j2me-polish/download.  File berukuran sekitar 52 MB tersebut merupakan sebuah aplikas Java Standard Edition yang berfungsi sebagai installer.  Ketik perintah berikut di command prompt untuk memulai proses instalasi:

java - jar j2mepolish-2.2.1.jar

Installer akan meminta beberapa informasi lokasi direktori, seperti lokasi instalasi NetBeans dan Java ME Platforms SDK.  Installer juga menawarkan untuk menyiapkan sebuah plugin bagi NetBeans sehingga NetBeans dapat langsung menjalankan MIDlet yang memakai framework J2ME Polish.

Salah satu hal yang perlu diperhatikan bila melakukan instalasi plugin J2ME Polish untuk  NetBeans 7  di Windows 7 adalah  jangan lupa menjalankan NetBeans 7 dengan hak akses administrator.  Bila pada saat melakukan update plugin, NetBeans 7 tidak memiliki hak akses administrator, ia akan terus me-restart dirinya sendiri walaupun aplikasinya sudah ditutup.   Solusinya, tutup NetBeans 7 melalui Task Manager, kemudian jalankan kembali NetBeans 7 dengan men-klik kanan icon-nya lalu memilih Run as administrator.

Bila plugin telah ter-install dengan benar, pengguna dapat segera membuat proyek baru dengan memilih menu File, New Project, Java ME, dan men-klik pada J2ME Polish Project.  Kotak dialog New Project yang muncul terlihat sedikit berbeda dari biasanya.  Misalnya, sekarang pengguna dapat menentukan lokasi ia men-install J2ME Polish.  Akan tetapi, halaman yang paling berubah dari biasanya adalah halaman Select Target Devices.  Pilihan device terlihat semakin banyak berkat komponen Marjory dari J2ME Polish.  Coba mulai dengan memilih Configuration “CLDC/1.1“, profiles “MIDP/2.1“, dan salah satu device Nokia seperti “Nokia E66″.

Halaman "Select Device Type"

Di NetBeans, J2ME Polish membuat turunan dari build-impl.xml milik NetBeans sehingga pada saat tombol “Run” ditekan, yang akan dikerjakan adalah Ant’s Task milik proyek J2ME Polish.  Untuk melihat Ant’s Task yang telah dimodifikasi tersebut, buka proyek melalui window Files, kemudian double-click pada build.xml.

Saya menemukan masalah pada saat akan menjalankan proyek, dimana window Output memunculkan kesalahan:

java.io.IOException: Cannot run program "jvisualvm": CreateProcess error=2, The system cannot find the file specified

Kesalahan ini terjadi karena pada saat menjalankan emulator, J2ME Polish juga menjalankan profiler, dalam hal ini adalah JVisualVM.  Akan tetapi cara pemanggilan JVisualVM tersebut tidak diikuti dengan lokasi path yang lengkap!  Hal ini menyebabkan ProcessBuilder tidak menemukan file yang akan dijalankan.

Solusi yang paling mudah adalah dengan meng-edit file build.xml untuk mematikan profiler.  Lagipula, bagi sebagian orang, menjalankan JVisualVM setiap kali program di-run adalah hal yang menganggu.  Pada bagian <target name=”j2mepolish”>, cari bagian yang bertanggung jawab untuk memanggil emulator, yang isinya seperti berikut ini:

<emulator wait="true" trace="class" securityDomain="trusted" enableProfiler="true" enableMemoryMonitor="false" enableNetworkMonitor="false" if="test and not debug" ></emulator>

Ganti nilai “true” pada atribut enableProfiler, enableMemoryMonitor, dan enableNetworkMonitor menjadi “false“.  Setelah itu, emulator J2ME Polish harusnya dapat berjalan dengan lancar, seperti pada tampilan berikut ini:

Tampilan J2ME Polish

Tampilan J2ME Polish

Game API di Java Micro Edition

Sebentar lagi masa kuliah semester genap akan berakhir, saatnya untuk liburan panjang… Aku akui liburan panjang hingga bulan September mendatang menyebabkan hampir gaji tiga bulan menjadi ‘kosong’..  Tapi dari sisi lain, liburan ini berarti aku bisa berpesta ria dengan aneka kode program tanpa diganggu sedikit pun.  Bayangkan, waktu kerja kantoran dulu, jatah cuti hanya 12 hari selama setahun.. Dan sekarang, sebagai dosen, aku bisa cuti selama dua bulan!!!

Selama mengajar dua semester ini, aku lebih banyak menghabiskan waktu menulis materi di modul kuliah ketimbang menulis di blog.  Maklum, itu merupakan salah satu tugas seorang dosen..  Salah satu mata kuliah menarik yang harus aku ajarkan adalah pemograman mobile dengan Java Micro Edition..  Aku sudah sering bermain-main dengan Java Enterprise Edition & Java Standard Edition, tapi baru kali ini menyentuh JME..  Sebagai informasi, aplikasi Android juga diprogram dengan Java, tetapi bukan versi JME..  Aplikasi BlackBerry sendiri mendukung JME, tetapi juga punya pengembangan aplikasi berbasis Java-nya sendiri yang khas untuk BlackBerry.

Salah satu hal menarik yang dari JME adalah dukungan Game API bawaan.  Hal ini karena JME banyak dipakai untuk membuat aplikasi game, istilah gaulnya: “game java” sehingga ia disertai dengan peralatan yang sangat membantu dalam pembuatan game. Inti dari Game API di JME adalah class GameCanvas yang merupakan turunan dari class Canvas.

Class GameCanvas menyediakan method getGraphics() dan flushGraphics() untuk mendukung double buffering.  Programmer bisa mendapatkan sebuah Graphics dengan memanggil getGraphics(), kemudian menggambar dengan menggunakan context tersebut, baru setelah selesai menggambar dan ingin menampilkan ke layar, ia tinggal memanggil flushGraphics().

Class lain dalam Game API adalah class TiledLayer dan class Sprite.  Kedua class tersebut mewakili objek dalam game yang dapat digambar secara otomatis oleh class LayerManager.

Salah satu cara untuk memahami konsep Layer di Game API adalah dengan memanfaatkan Game Builder dari NetBeans IDE.  Game Builder bukanlah bagian dari spesifikasi JME, melainkan alat bantu yang ditawarkan oleh NetBeans IDE.  Versi terbaru dari NetBeans IDE, yaitu versi 7.0, dapat didownload di http://netbeans.org/community/releases/70/ .

Untuk membuat sebuah Game Builder baru, klik kanan pada nama package, kemudian pilih New, Game Builder…  Berikut ini adalah contoh tampilan sample Game Builder dari NetBeans:

Tampilan Game Builder

Tampilan Game Builder

Scenes mewakili apa yang akan ditampilkan di layar nantinya, terdiri atas satu atau lebih TiledLayer dan Sprite.

TiledLayer adalah sebuah layer yang terdiri atas kotak-kotak dimana setiap ‘kotak’ ini diisi dengan gambar tertentu.  Perancang game harus membuat sebuah file gambar yang merupakan gabungan dari seluruh elemen yang dapat di-isi-kan ke dalam TiledLayer tersebut.  Contoh file gambarnya seperti:

Contoh Gambar Untuk Game API

Contoh Gambar Untuk Game API

Game Builder menawarkan kemudahan untuk mengisi setiap kotak atau ’tile’ yang ada di gambar secara visual, seperti yang terlihat di gambar berikut:

Tiled Layer Editor

Tiled Layer Editor

Pembuat game dapat memisahkan setiap elemen interaksi yang berbeda ke dalam TiledLayer yang berbeda.  Misalnya sebuah TiledLayer untuk background game, dan sebuah TiledLayer lagi untuk mewakili bebatuan atau penghalang.  Dengan demikian, pada saat karakter utama bergerak, programmer dapat memanggil method collidesWith() untuk memeriksa apakah karakter bersinggungan dengan TiledLayer tertentu.

Karakter yang ada di game diwakili oleh class Sprite.  Game Builder menyediakan editor visual untuk merancang dan memutar animasi sebuah Sprite seperti pada contoh tampilan berikut ini:

Sprite Editor

Sprite Editor

Setelah selesai merancang TiledLayer dan Sprite, yang harus dilakukan berikutnya adalah menggambar mereka di layar dengan menggunakan method paint() dari LayerManager.  Jangan khawatir soal pergeseran layar karena programmer dapat memanggil method setViewWindow() milik LayerManager untuk mengkliping layar.

Berikut ini adalah contoh tampilan hasil game yang dibuat dengan Game Builder bila dijalankan menggunakan emulator bawaan JME:

Contoh Tampilan

Contoh Tampilan