Friday, December 7, 2012

Script kamera (kelas bantuan) pada JAVA (J2ME)

import javax.microedition.lcdui.*;
import javax.microedition.media.*;
import javax.microedition.media.control.VideoControl;

public class CameraCanvas extends Canvas {
   
    private CameraMIDlet midlet;
   
    public CameraCanvas(CameraMIDlet midlet, VideoControl vc) {
        this.midlet = midlet;
       
        vc.initDisplayMode(VideoControl.USE_DIRECT_VIDEO, this);
        try {
            vc.setDisplayLocation(0,0);
            vc.setDisplaySize(this.getWidth(), this.getHeight());
        } catch (MediaException me) {
            me.printStackTrace();
        }
        vc.setVisible(true);
    }
   
    public void paint(Graphics g) {
        g.setColor(0, 0, 0);
        g.drawRect(0, 0, this.getWidth()-1, this.getHeight()-1);
    }
   
}

Scrip menerima MMS pada JAVA (J2ME)

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
import java.io.*;

public class TerimaMMS extends MIDlet
  implements CommandListener, MessageListener, Runnable {
   
  private Display display;
  private Form content;
  private Alert alert;
  private MessageConnection mmsConn;
  private Message message;
  private Thread thread;
  private String senderAddress, subject, connectionList[];
  private boolean done;   
  private final Command cmdKeluar;
   
  public TerimaMMS() {
    display = Display.getDisplay(this);
    cmdKeluar = new Command("Keluar", Command.EXIT, 1);

    content = new Form("Menerima MMS");
    content.addCommand(cmdKeluar);
    content.setCommandListener(this);
       
    String appID = getAppProperty("MMS-ApplicationID");
    String address = "mms://:" + appID;
    try {
      mmsConn = (MessageConnection) Connector.open(address);
      mmsConn.setMessageListener(this);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
    connectionList = PushRegistry.listConnections(true);
    if (connectionList == null || connectionList.length == 0) {
      content.append("waiting for MMS on application ID: " +
                     appID);
    }
    done = false;
    thread = new Thread(this);
    thread.start();       
  }
   
  public void startApp() {
    display.setCurrent(content);
  }
   
  public void pauseApp() {
  }
   
  public void destroyApp(boolean unconditional) {
  }
   
  public void commandAction(Command c, Displayable d) {
    if (c == cmdKeluar) {
      destroyApp(false);
      notifyDestroyed();
    }
  }

  public void notifyIncomingMessage(MessageConnection conn) {
    if (thread == null && !done) {
      thread = new Thread(this);
      thread.start();
    }
  }
   
  public void run() {
    receiveMMS();
  }
   
  public void receiveMMS() {
    try {
      message = mmsConn.receive();
      if (message != null) {
        senderAddress = message.getAddress();
        content.deleteAll();
        String titleStr = senderAddress.substring(6);
        int colonPos = titleStr.indexOf(":");
        if (colonPos != -1) {
          titleStr = titleStr.substring(0, colonPos);
        }
        content.setTitle("Dari: " + titleStr);
        if (message instanceof MultipartMessage) {
          MultipartMessage mpm = (MultipartMessage) message;
          StringBuffer buff = new StringBuffer("Judul: ");
          buff.append((subject = mpm.getSubject()));
          buff.append("\nTanggal: ");
          buff.append(mpm.getTimestamp().toString());
          StringItem messageItem = new StringItem("Pesan",
           buff.toString());                    
          messageItem.setLayout(Item.LAYOUT_NEWLINE_AFTER);
          content.append(messageItem);
          MessagePart[] parts = mpm.getMessageParts();
          if (parts != null) {
            for (int i = 0; i < parts.length; i++) {
              buff = new StringBuffer();
              MessagePart mp = parts[i];
              buff.append("Tipe isi: ");
              String mimeType = mp.getMIMEType();
              buff.append(mimeType);
              String contentLocation = mp.getContentLocation();
              buff.append("\nIsi:\n");
              byte[] ba = mp.getContent();
              if (mimeType.equals("image/png") ||
                  mimeType.equals("image/jpg")) {
                content.append(buff.toString());                                                        
                Image img = Image.createImage(ba, 0, ba.length);                               
                ImageItem ii = new ImageItem(contentLocation,
                  img, Item.LAYOUT_NEWLINE_AFTER,                                  
                  contentLocation);
                content.append(ii);
              } else {
                buff.append(new String(ba));
                StringItem si =
                  new StringItem("Bagian", buff.toString());                             
                si.setLayout(Item.LAYOUT_NEWLINE_AFTER);
                content.append(si);
              }
            }
          }
        }
        display.setCurrent(content);
      }
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
  }   
}

Script Mengirim SMS pada JAVA (J2ME)

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.wireless.messaging.*;
import javax.microedition.io.*;
import java.io.*;

public class KirimSMS extends MIDlet
  implements CommandListener, Runnable {
   
  private Display display;
  private Command cmdKeluar, cmdLanjut, cmdKembali, cmdKirim;
  private Displayable prevScreen;
  private TextBox tfNum, tfText;
  private String port;
  private Thread thread;
  private Alert alert;
   
  private final String INVALID_PHONE =
    "Nomor yang dimasukkan tidak absah";
   
  public KirimSMS() {
    display = Display.getDisplay(this);
       
    port = getAppProperty("Port-SMS");
       
    cmdKeluar = new Command("Keluar", Command.EXIT, 1);
    cmdLanjut = new Command("Lanjut", Command.SCREEN, 1);
    cmdKembali = new Command("Kembali", Command.BACK, 1);
    cmdKirim = new Command("Kirim", Command.SCREEN, 1);
       
    alert = new Alert(null);
    alert.setTimeout(3000);
  }   
   
  public void startApp() {
    tfNum = generatePhoneInput();
  }
   
  public void pauseApp() {
  }
   
  public void destroyApp(boolean unconditional) {
  }
   
  public void commandAction(Command c, Displayable s) {
    if (c == cmdKeluar) {
      destroyApp(false);
      notifyDestroyed();
    } else if (c == cmdKembali) {
      display.setCurrent(tfNum);
    } else if (c == cmdLanjut) {
      if (!isValidPhoneNumber(tfNum.getString())) {
        alert.setType(AlertType.ERROR);
        alert.setString(INVALID_PHONE);
        display.setCurrent(alert,tfNum);
      } else {
        tfText = generateMessageInput();
      }
    } else {
      thread = new Thread(this);
      thread.start();
    }
  }
   
  public void run() {
    MessageConnection conn = null;       
    String alamat = "sms://" + tfNum.getString() + ":" + port;       
    try {
      conn = (MessageConnection) Connector.open(alamat);
      TextMessage pesan = (TextMessage)
         conn.newMessage(MessageConnection.TEXT_MESSAGE);
      pesan.setAddress(alamat);
      pesan.setPayloadText(tfText.getString());
      conn.send(pesan);
      alert.setString("Sedang mengirim ke nomor " +
         alamat.substring(6));
      alert.setType(AlertType.INFO);
      display.setCurrent(alert);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
    if (conn != null) {
      try {
        conn.close();
      } catch (IOException ioe) {
        ioe.printStackTrace();
      }
    }
  }
   
  public TextBox generatePhoneInput() {
    TextBox tfPhone = new TextBox("Nomor Tujuan?", null,
                                   15, TextField.PHONENUMBER);
    tfPhone.addCommand(cmdKeluar);
    tfPhone.addCommand(cmdLanjut);
    tfPhone.setCommandListener(this);
    display.setCurrent(tfPhone);
    return tfPhone;
  }
   
  public TextBox generateMessageInput() {
    TextBox tfMessage = new TextBox("Teks Pesan", null,
                                   500, TextField.ANY);
    tfMessage.addCommand(cmdKembali);
    tfMessage.addCommand(cmdKirim);
    tfMessage.setCommandListener(this);
    display.setCurrent(tfMessage);
    return tfMessage;
  }
   
  private static boolean isValidPhoneNumber(String number) {
    char[] chars = number.toCharArray();
    if (chars.length == 0) {
      return false;
    }
    int startPos = 0;
    // jika diawali dengan tanda +
    if (chars[0] == '+') {
      startPos = 1;
    }
    for (int i = startPos; i < chars.length; ++i) {
      if (!Character.isDigit(chars[i])) {
        return false;
      }
    }
    return true;
  }   
}

Script mengirim MMS pada JAVA (J2ME)

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import javax.wireless.messaging.*;
import java.io.*;
import java.util.Vector;

public class KirimMMS extends MIDlet
  implements CommandListener {
   
  private Display display;
  private Form form;
  private TextField destination;
  private Image image = null;
  private MMSThread thread;

  private final String textMsg = "Contoh pesan teks";
  private final String imageFile = "/icons/Duke.png";
   
  private final Command cmdKeluar =
    new Command("Keluar", Command.EXIT, 1);
  private final Command cmdKirim =
    new Command("Kirim", Command.SCREEN, 1);
   
  public KirimMMS() {
    display = Display.getDisplay(this);
    form = new Form("Mengirim MMS");
       
    destination = new TextField("Nomor tujuan:", null, 15,
                    TextField.PHONENUMBER);
    form.append(destination);
       
    //pesan teks
    StringItem si = new StringItem("Pesan teks:",
                                   "\n" + textMsg + "\n");
    form.append(si);
       
    //pesan gambar
    try {
      image = Image.createImage(imageFile);
    } catch(IOException ioe) {
      ioe.printStackTrace();
    }
    ImageItem ii = new ImageItem("Pesan gambar:", image,
                                 Item.LAYOUT_LEFT, null);       
    form.append(ii);
       
    form.addCommand(cmdKeluar);
    form.addCommand(cmdKirim);
    form.setCommandListener(this);
  }
   
  public void startApp() {
    display.setCurrent(form);
  }
   
  public void pauseApp() {
  }
   
  public void destroyApp(boolean unconditional) {
  }
   
  public void commandAction(Command c, Displayable s) {
    if (c == cmdKeluar) {
      destroyApp(false);
      notifyDestroyed();
    } else {
      thread = new MMSThread(this);
      thread.start();
    }
  }
     
   
  // inner class
  class MMSThread extends Thread {
       
    private KirimMMS midlet;
    private Vector parts;
       
    public MMSThread(KirimMMS midlet) {
      this.midlet = midlet;
    }
       
    public void run() {           
      String appID = midlet.getAppProperty("MMS-ApplicationID");
      String phoneNumber = destination.getString();
      String address = "mms://" + phoneNumber + ":" + appID;

      parts = new Vector();
           
      // pesan teks           
      String encoding = "UTF-8";
      try {
        byte[] textcontents = textMsg.getBytes(encoding);
        addPart(
          new MessagePart(textcontents, 0, textcontents.length,
                        "text/plain", "id1",
                     "contentLocation", encoding));
      } catch (Exception e) {
        //
      }

      // pesan gambar
      try {
        InputStream is =
          getClass().getResourceAsStream(imageFile);
        byte[] imagecontents = new byte[is.available()];
        is.read(imagecontents);
        addPart(
          new MessagePart(imagecontents, 0, imagecontents.length,
                     "image/png", "id2",
                     "Duke.png", null));
      } catch (Exception e) {
        //
      }
                     
      MessageConnection mmsconn = null;

      try {
        mmsconn = (MessageConnection) Connector.open(address);

        MultipartMessage mmmessage =(MultipartMessage)
          mmsconn.newMessage(                   
            MessageConnection.MULTIPART_MESSAGE);
        mmmessage.setAddress(address);

        MessagePart[] mparts = getParts();

        for (int i = 0; i < mparts.length; i++) {
          mmmessage.addMessagePart(mparts[i]);
        }

        mmmessage.setSubject("Contoh MMS");
        mmsconn.send(mmmessage);
      } catch (Exception e) {
        System.out.println(e.toString());
      }                      
    }
       
    public MessagePart[] getParts() {
      MessagePart[] partsArray = new MessagePart[parts.size()];
      parts.copyInto(partsArray);
      return partsArray;
    }
   
    public void addPart(MessagePart part) {
      parts.addElement(part);
    }
  }       
}

Mengurutkan data dalam record store pada JAVA (J2ME)

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import java.io.IOException;
      
public class DemoUrutRecord extends MIDlet
  implements CommandListener {
  
  private Display display;
  private List list;
  private RecordStore rs = null;
 
  private final Command cmdKeluar =
    new Command("Keluar", Command.EXIT, 1);
  private final Command cmdUrutkan =
    new Command("Urutkan", Command.SCREEN, 1);
  
  public DemoUrutRecord() {
    display = Display.getDisplay(this);
    list = new List("Daftar Nama", Choice.IMPLICIT);
    list.addCommand(cmdKeluar);
    list.addCommand(cmdUrutkan);
    list.setCommandListener(this);
      
    try {
      rs = RecordStore.openRecordStore("DBNama", true);
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
      
  }
  
  public void startApp() {
    try {
      if (rs.getNumRecords() < 1) {
        tambahData("Kiki");
        tambahData("Fira");
        tambahData("Dede");
        tambahData("Mira");
        tambahData("Aryo");
      }
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
    tampilkanData(false); // menampilkan data tanpa diurutkan
    display.setCurrent(list);
  }
  
  public void pauseApp() {      
  }
  
  public void destroyApp(boolean unconditional) {     
  }
  
  public void commandAction(Command c, Displayable s) {
    if (c == cmdKeluar) {
      destroyApp(false);
      notifyDestroyed();
    } else if (c == cmdUrutkan) {
      tampilkanData(true);
    }
  }
  
  public void tambahData(String nama) {
    byte[] temp = null;
         
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      DataOutputStream dos = new DataOutputStream(baos);
      dos.writeUTF(nama);
      temp = baos.toByteArray();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
    
    try {
      rs.addRecord(temp, 0, temp.length);
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
  }
  
  public void tampilkanData(boolean urut) {
    byte[] temp = null;
    RecordEnumeration re = null;
    list.deleteAll();
    try {          
      if (urut) {
        UrutNama un = new UrutNama();
        re = rs.enumerateRecords(null, un, false);
      } else {
        re = rs.enumerateRecords(null, null, false);
      }
      while (re.hasNextElement()) {
        int i = re.nextRecordId();              
        temp = rs.getRecord(i);
        ByteArrayInputStream bais =
          new ByteArrayInputStream(temp);
        DataInputStream dis = new DataInputStream(bais);
        try {
          String nama = dis.readUTF();
          list.append(nama, null);
        } catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }
      display.setCurrent(list);
    } catch (InvalidRecordIDException invID) {
      invID.printStackTrace();
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }  
  }
  
  // inner class untuk mengurutkan data
  class UrutNama implements RecordComparator {
    public int compare(byte[] record1, byte[] record2) {
      String nama1 = new String(record1);
      String nama2 = new String(record2);
      int hasil = nama1.compareTo(nama2);
      if (hasil < 0) {
        return RecordComparator.PRECEDES;
      } else if (hasil > 0) {
        return RecordComparator.FOLLOWS;
      } else {
        return RecordComparator.EQUIVALENT;
      }
    }
  }
}

Memanipulasi data dalam record store, pada JAVA (J2ME)

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;

public class DemoRMS extends MIDlet
  implements CommandListener {
   
  private Display display;
  private Form form;
  private RecordStore rs;
  private RecordEnumeration re;
  private ChoiceGroup choicegroup;
  private Alert alert;
  private List list;
   
  //untuk proses entri data
  private Form entri;
  private TextField tfNama, tfNoTelp;
   
  private final Command cmdKeluar =
    new Command("Keluar", Command.EXIT, 1);
  private final Command cmdPilih =
    new Command("Pilih", Command.OK, 1);
  private final Command cmdSimpan =
    new Command("Simpan", Command.SCREEN, 1);
  private final Command cmdHapus =
    new Command("Hapus", Command.SCREEN, 1);
  private final Command cmdKembali =
    new Command("Kembali", Command.BACK, 1);
 
  public DemoRMS() {
    display = Display.getDisplay(this);
     
    alert = new Alert(null);
    alert.setTimeout(Alert.FOREVER);
       
    list = new List(null, Choice.IMPLICIT);
      
    rs = null;
    // membuat atau membuka record store
    try {
      rs = RecordStore.openRecordStore("contohDB", true);
    } catch (RecordStoreException rse) {
      alert.setString("Record store tidak dapat dibuka. " +
                      "Aplikasi akan dihetikan");
      alert.setType(AlertType.ERROR);
      display.setCurrent(alert, null);
      System.exit(1);
    }
  }
   
  public void startApp() {
    form = new Form("Demo RMS");
        
    choicegroup = new ChoiceGroup("Menu:", Choice.EXCLUSIVE);
    choicegroup.append("Tambah Record", null);
    choicegroup.append("Daftar Record", null);
        
    form.append(choicegroup);
    form.addCommand(cmdKeluar);
    form.addCommand(cmdPilih);
    form.setCommandListener(this);
    display.setCurrent(form);
  }  
   
  public void pauseApp() {
  }
   
  public void destroyApp(boolean unconditional) {
  }
   
  public void commandAction(Command c, Displayable s) {
    if (c == cmdKeluar) {
      destroyApp(false);
      notifyDestroyed();
    } else if (c == cmdPilih) {
      switch (choicegroup.getSelectedIndex()) {
        case 0: {
          entriData();
          break;
        }
        case 1: {
          lihatRecord();
          break;
        }
      }
    } else if (c == cmdKembali) {
      display.setCurrent(form);
    } else if (c == cmdSimpan) {
      alert.setType(AlertType.INFO);
      if (!tfNama.equals("") && !tfNoTelp.equals("")) {
        tambahRecord(tfNama.getString(), tfNoTelp.getString());
        alert.setString("Data baru telah berhasil disimpan");               
        display.setCurrent(alert, form);
      } else {
        alert.setString("Data NAMA dan NO. TELP " +
                        "tidak boleh kosong");               
        display.setCurrent(alert, entri);
      }           
    } else if (c == cmdHapus) {
      int pos =
        list.getString(list.getSelectedIndex()).indexOf(" [");
      String nama = list.getString(
       list.getSelectedIndex()).substring(0, pos);
       hapusRecord(nama);
    }
  }
   
  public void tambahRecord(String nama, String noTelp) {
    byte[] temp = null;
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      DataOutputStream dos = new DataOutputStream(baos);
      dos.writeUTF(nama);
      dos.writeUTF(noTelp);
      temp = baos.toByteArray();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
    try {
      rs.addRecord(temp, 0, temp.length);
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
  }
   
  public void lihatRecord() {
    byte[] temp = null;
    list.setTitle("Daftar Record");
    list.deleteAll();
    try {           
      re = rs.enumerateRecords(null, null, false);
      while (re.hasNextElement()) {
        int i = re.nextRecordId();               
        temp = rs.getRecord(i);
        ByteArrayInputStream bais =
          new ByteArrayInputStream(temp);
        DataInputStream dis = new DataInputStream(bais);
        try {
          String nama = dis.readUTF();
          String noTelp = dis.readUTF();
          list.append(nama + " [" + noTelp + "]", null);                   
        } catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }
      list.addCommand(cmdKembali);
      list.addCommand(cmdHapus);
      list.setCommandListener(this);
      display.setCurrent(list);
    } catch (InvalidRecordIDException invID) {
      invID.printStackTrace();
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
      
  }
   
  public void hapusRecord(String nama) {
    byte[] temp = null;
    try {
      re = rs.enumerateRecords(null, null, false);
      while (re.hasNextElement()) {
        int i = re.nextRecordId();
        temp = rs.getRecord(i);
        ByteArrayInputStream bais =
          new ByteArrayInputStream(temp);
        DataInputStream dis = new DataInputStream(bais);
        try {
          String vNama = dis.readUTF();
          if (vNama.equals(nama)) {
            rs.deleteRecord(i);
            break;
          }                   
        } catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }
      re.rebuild();
      lihatRecord();
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
  }
       
  public Form entriData() {
    entri = new Form("Entri Data");
    tfNama = new TextField("Nama:", null, 25, TextField.ANY);
    tfNoTelp = new TextField("No. Telepon:", null, 15,
                              TextField.PHONENUMBER);
    entri.append(tfNama);
    entri.append(tfNoTelp);
    entri.addCommand(cmdSimpan);
    entri.addCommand(cmdKembali);
    entri.setCommandListener(this);
    display.setCurrent(entri);
    return entri;
  }
}

Wednesday, December 5, 2012

Mencari/mem-filter data dalam record store pada JAVA (J2ME)

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import java.io.IOException;
       
public class DemoCariRecord extends MIDlet
  implements CommandListener {
   
  private Display display;
  private List list;
  private TextField tfCari;
  private RecordStore rs = null;
   
  private final Command cmdKeluar =
    new Command("Keluar", Command.EXIT, 1);
  private final Command cmdKembali =
    new Command("Kembali", Command.BACK, 1);
  private final Command cmdPencarian =
    new Command("Pencarian", Command.SCREEN, 1);
  private final Command cmdCari =
    new Command("Cari", Command.OK, 1);
   
  public DemoCariRecord() {
    display = Display.getDisplay(this);
    list = new List(null, Choice.IMPLICIT);
    list.addCommand(cmdKeluar);
    list.addCommand(cmdPencarian);
    list.setCommandListener(this);
      
    try {
      rs = RecordStore.openRecordStore("DBNama", true);
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
       
  }
   
  public void startApp() {
    try {
      if (rs.getNumRecords() < 1) {
        tambahData("Kiki");
        tambahData("Fira");
        tambahData("Dede");
        tambahData("Mira");
        tambahData("Aryo");
        tambahData("Dona");
      }
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
    tampilkanData(false);
    display.setCurrent(list);
  }
   
  public void pauseApp() {       
  }
   
  public void destroyApp(boolean unconditional) {       
  }
   
  public void commandAction(Command c, Displayable s) {
    if (c == cmdKeluar) {
      destroyApp(false);
      notifyDestroyed();
    } else if (c == cmdKembali) {
      display.setCurrent(list);
      tampilkanData(false);
    } else if (c == cmdPencarian) {
      Form form = new Form("Cari Nama");
      tfCari = new TextField("Masukkan karakter pertama", null,
                              1, TextField.ANY);
      form.append(tfCari);
      form.addCommand(cmdCari);
      form.addCommand(cmdKembali);
      form.setCommandListener(this);
      display.setCurrent(form);
    } else if (c == cmdCari) {
      tampilkanData(true);
    }
  }
   
  public void tambahData(String nama) {
    byte[] temp = null;
           
    try {
      ByteArrayOutputStream baos =
        new ByteArrayOutputStream();
      DataOutputStream dos = new DataOutputStream(baos);
      dos.writeUTF(nama);
      temp = baos.toByteArray();
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
     
    try {
      rs.addRecord(temp, 0, temp.length);
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }
  }
   
  public void tampilkanData(boolean filter) {
    byte[] temp = null;
    RecordEnumeration re = null;

    list.deleteAll();
    try {           
      if (filter) {
        String s = tfCari.getString().toLowerCase();
        CariNama cn = new CariNama(s);
        re = rs.enumerateRecords(cn, null, false);
        list.setTitle("Hasil Pencarian");
        list.removeCommand(cmdPencarian);
        list.removeCommand(cmdKeluar);
        list.addCommand(cmdKembali);
      } else {
        re = rs.enumerateRecords(null, null, false);
        list.setTitle("Daftar Nama");
        list.addCommand(cmdPencarian);
        list.addCommand(cmdKeluar);
        list.removeCommand(cmdKembali);
      }
      while (re.hasNextElement()) {
        int i = re.nextRecordId();               
        temp = rs.getRecord(i);
        ByteArrayInputStream bais =
          new ByteArrayInputStream(temp);
        DataInputStream dis = new DataInputStream(bais);
        try {
          String nama = dis.readUTF();
          list.append(nama, null);
        } catch (IOException ioe) {
          ioe.printStackTrace();
        }
      }
      display.setCurrent(list);
    } catch (InvalidRecordIDException invID) {
      invID.printStackTrace();
    } catch (RecordStoreNotOpenException rsnoe) {
      rsnoe.printStackTrace();
    } catch (RecordStoreException rse) {
      rse.printStackTrace();
    }   
     
    display.setCurrent(list);
  }
   
  // inner class untuk mencari data
  class CariNama implements RecordFilter {
       
    private String karakterAwal;
       
    public CariNama(String karakterAwal) {
      this.karakterAwal = karakterAwal.toLowerCase();
    }
       
    public boolean matches(byte[] candidate) {
      String s =
        new String(candidate).toLowerCase().substring(2);           
      return s.startsWith(karakterAwal);
    }
  }
   
}