Mengubah Format Currency dan Format Rupiah ke dalam Number pada Bahasa Java

Berawal dari lebih dari 1 orang yang nanyain di kotak komentar postingan ini, gw akhirnya bikin dah post ini. Mayan… buat nambah2in isi blog yang agak guna biar ga curcolan mulu isinya…

Singkat cerita, ada yang nanyain gimana cara ngubah format dalam bentuk duit balik lagi ke sifat aslinya (number) biar bisa dioperasiin. Well… buat gw, itu pertanyaan yang bikin gw bingung. Banget! Karena… faktanya, kalau kamu udah punya suatu “a” yang kamu ubah jadi “b”, buat apa kamu ngubah “b” jadi “a”. Toh nilai “a” dari awal udah kamu punya dan nilainya sama sekali ga ketimpa. Beda tipe data gitu… gimana cara isinya bisa ditimpa jadi nilai lain kan yah… Makanya gw bingung.

Tapi apapun itu… ada satu alasan buat para programmer-pemberi-isi-kotak-komentar-di-postingan-asal biar ga ambil lagi nilai awalnya. Dan mereka bingung gimana cara balikinnya. Untuk itu… disinilah gw sebagai pencerah bagi mereka yang kebingungan… Hohoho.

Seperti yang gw tulisin di kotak balasan, ada beberapa langkah yang musti dilakukan:

  1. Parse formatted String ke tipe Number pakai method parse dari objekDecimalFormat
  2. Konversi bentuk Number ke byte/double/float/long/int/short pakai byteValue/doubleValue dst.

Simple kan… buat yang bingung, kodenya gini:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

public class KurensiIndonesia {

    public static void main(String[] args) {
        double harga = 250000000;

        DecimalFormat kursIndonesia = (DecimalFormat) DecimalFormat.getCurrencyInstance();
        DecimalFormatSymbols formatRp = new DecimalFormatSymbols();

        formatRp.setCurrencySymbol("Rp. ");
        formatRp.setMonetaryDecimalSeparator(',');
        formatRp.setGroupingSeparator('.');

        kursIndonesia.setDecimalFormatSymbols(formatRp);
        String x = kursIndonesia.format(harga);
        System.out.println("Harga Rupiah: "+x);
//konversi balik String --> number type
        try {
            Number number = kursIndonesia.parse(x);
            double nilai = number.doubleValue();
            System.out.println("Nilai dari rupiah: "+String.format("%.2f", nilai));
        } catch (ParseException ex) {
            System.out.println("Kesalahan Parsing");
        }
    }
}

Hasil:

Capture

Contoh kode yang lebih singkat… cuma buat konversi rupiah ke angka itu gini:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

public class KurensiIndonesia {

    public static void main(String[] args) {

        String x = "Rp. 250.000.000,00";
        DecimalFormat kursIndonesia = (DecimalFormat) DecimalFormat.getCurrencyInstance();
        DecimalFormatSymbols formatRp = new DecimalFormatSymbols();

        formatRp.setCurrencySymbol("Rp. ");
        formatRp.setMonetaryDecimalSeparator(',');
        formatRp.setGroupingSeparator('.');

        kursIndonesia.setDecimalFormatSymbols(formatRp);
        try {
            Number number = kursIndonesia.parse(x);
            double nilai = number.doubleValue();
            System.out.println("Nilai dari rupiah: "+String.format("%.2f", nilai));
        } catch (ParseException ex) {
            System.out.println("Kesalahan Parsing");
        }
    }
}

Intinya, pastiin objek DecimalFormat sama DecimalFormatSymbols yang dibentuk itu sama jenisnya. Gampangnya, objek yang digunain buat nge-format sama nge-parse itu sama. Jangan sampe beda. Kalau beda, ada kemungkinan kamu dapat nilai yang salah bahkan kegagalan eksepsi.

Dan karena banyak yang nanya juga terkait swing dan lainnya… hal di atas gw juga udah coba ke swing (pakai jtextfield biasa) sama akses database (nyimpen ke Access–biar gw ga usah nginstall dbms lagi)…. dan berhasil.

Moga ngebantu urusan kamu masing-masing…

Baca juga: Mengubah nilai double –> rupiah.

Advertisements

Pass By Reference Menggunakan Java

Okeh… ini postingan yang bermula dari chat yang dah lamaaaaaaa banget. Tapi baru sempat gw bikin tulisannya sekarang. Yeah… shame on me… 😦

Kerjaan seabrek emang mustinya gak jadi alasan. Gw ajah yang ga bisa ngatur jadwal. Tapi yah.. gitu deh, akhirnya ketulisan juga nih blog pake postingan yang sebenernya dah kadaluarsa.

Jadi… yaaa, ada lah yaaa… kenalan gw. Sebut saja si Cantik (karena ga mau disebutin identitasnya). Ceritanya si Cantik ini keukeuh ama temennya kalo yang namanya pass by reference itu mungkin banget ditulisin pake bahasa Java. Dan pendiriannya itu tepat! Sayangnya, contoh implementasi (berdasarkan pengakuan) yang dia kasih… ternyata ga secantik…. nama aliasnya (yah… nama aliasnya si Cantik, kan?).

Key… jadi… di Java emang mungkin untuk membuat sebuah mekanisme pass-by-reference layaknya bahasa pemrograman C++. Cuma caranya ajah yang beda. Kalo di C++, kan pake pengaksesan alamat menggunakan simbol ampersand (&). Sedangkan kalo di Java, cara pengaksesannya menggunakan pengiriman objek. Yah… kalo ada dari kamu yang nganggap ini bukan sebagai bentuk pass by reference, gw juga gak ngebantah. Emang sifatnya agak beda. Tapi gw punya alasan yang cukup buat berpegang teguh kenapa pengiriman objek jadi mirip sama pass by reference.

Cukup ngocehnya, jadi berikut contoh dari kode pass by value plus pass by reference make bahasa pemrograman Java.

public class X {

    int u,v;

    public X(int u, int v) {
        this.u = u;
        this.v = v;
    }

    public void passValue(int u, int v){
        u = u+10;
        v = v*10;
    }

    public void passReference(X x){
        x.u = x.u+10;
        x.v = x.v*10;
    }
}
public class Main {
public static void main(String[] args) {
X x = new X(1,2);

//Nilai u & v milik objek x sebelum pass by value
System.out.println("Pass Value\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passValue(x.u, x.v);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

//Nilai u & v milik objek x sebelum pass by reference
System.out.println("\nPass Reference\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passReference(x);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

}
}

Jadi skenario dari kode di atas, terdapat sebuah class X. Class tersebut mempunyai 2 buah fungsi (passValue untuk merepresentasikan pass by value, dan passReference untuk pass by reference). Kedua fungsi tersebut dimaksudkan untuk mengubah isi dari atribut yang dimiliki. Dan terlihat, bahwa hasil akhirnya sebagai berikut:

Pass By Reference

Terdapat perubahan nilai ketika dilakukan skenario pass by reference. Hal yang perlu diperhatikan di sini, pass by reference di Java hanya mungkin untuk dilakukan oleh pengiriman objek, dan tidak mungkin dilakukan jika menggunakan pengiriman menggunakan tipe data primitif.

Buat nambahin… gw kasih liat kalo yang namanya objek itu merupakan sebuah referensi. Hal ini yang bikin skenario di atas jadi kayak pass by reference, padahal yang diubah cuma nilai objeknya (yah…. kode di atas bisa didebat tentang pass2an itu). Jadi… gw punya skenario kode pembentukan objek dari class X yang ditulisin gini:

public class NewClass1 {
    public static void main(String[] args) {
        X x = new X(10,20);
        X y = new X(30,40);
        System.out.println("Nilai Awal");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

        //operasi penyamaan referensi
        x = y;

        System.out.println("\nNilai Setelah Operasi x = y");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+
    }
}

Hasilnya gini:

Hasil Perubahan x=y

Kalo kamu liat2, hasilnya wajar lah ya…. Kalo x = y, maka nilai x akan ngikutin nilai y. Juga kalau ada perubahan nilai y, maka nilai x otomatis akan berubah. Wajar! Tapi… coba dibalik… kalo seandainya ada skenario gini…

        x.u=1;
        x.v=2;

        System.out.println("\nNilai Setelah Operasi Perubahan x");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

Hasilnya bakal gini…

Nilai Perubahan X

Liat kan… kalau ada perubahan di x, ternyata nilai y juga berubah. Hal ini terjadi karena pas dilakukan operasi “x=y”, yang dilakukan si javanya, ga cuma sekedar ngubah nilai. Tapi juga penyamaan alamat. Kalo kamu masih ga percaya, coba ajah debug, lihat posisi penyimpanan masing-masing objek sebelum dan sesudah operasi “x=y”.

Begitulah… intinya, kamu bisa ngelakuin pass by reference dengan cara ngakses objek dari class terkait… dan hal yang sama gak akan kamu dapatkan dengan ngakses variabel dengan tipe data primitif biasa.

Walo penjelasannya belepotan, moga ngebantu yah… terutama buat si *******… eh, si Cantik… 😀

Menyimpan Objek Java ke dalam File

Minnaaaa~~~, akhirnya blog balita balik lagi. Sekarang, bakal dibahas caranya gimana buat nyimpan data dalam bentuk objek. Yap, emang kalo nyimpan data gampangnya pake database ajah. Tapi, dalam satu atau lain kesempatan, bisa ajah kita musti nyimpen bukan ke database, tapi bentuk lain. Kalo udah gini, cara paling gampang yaaa… pake penyimpanan file. Tapi, akses file sendiri biasanya yang disimpan adalah tulisan2.

Tulisan ini bisa aja dijadiin data tersendiri ke dalam file kalo ngegunain pake bahasa pemrograman Java. Tapi, pendekatan yang gw maksud gini… Pas kamu punya satu master data yang jumlahnya puluhan baris record, dan satu record-nya terdiri dari beberapa hal. Yaa.. contohnya aja kamu nyimpen data semua member JKT48 di aplikasi yang kamu bikin. Kali ajah, kan… Dan hal ini, gak bisa kamu simpan gitu aja dalam bentuk tulisan. Karena, kamu musti bikin parsing dari tulisan2 yang kamu simpan. Alternatif penyimpanan yang bisa kamu lakuin contohnya (paling gak yang kepikiran ma gw sekarang), yaitu nyimpen dalam format XML. Yap, kamu musti parsing lagi, tapi bentuknya kan dah standar. Jadi gampang… dan alternatif lainnya, merupakan hal yang bakal dibahas di postingan sekarang… yaitu nyimpen dalam bentuk objek.

Bahasa Java mengakomodir penyimpanan objek yang dibentuk ke dalam file. Untuk melakukan hal ini, kita butuh yang namanya package java.io. Bagian yang kita butuhkan nantinya yaitu “FileOutputStream” dan “ObjectOutputStream”. Dari namanya ajah dah jelas ya gunanya buat apa. Selain itu, yang kita butuhin juga, bentuk POJO dari class yang kita simpan objeknya. Gw agak gak yakin tentang POJO (yaaa, maaf2 ajah kalo gw salah ngejerumusin kamu semua ama info yang gak valid. Kalo ada yang musti diperbaikin tell2 yak), tapi intinya POJO itu kependekan dari “Plain Old Java Object”. Bentuk dari POJO itu standar… cuma satu class dengan atribut dan method set-get, ditambah meng-implements “Serializable” dari java.io.Serializable.

Okeh, kita langsung praktek yah… Pertama, bikin class POJO dari objek yang nantinya mau disimpen. Gw bikin class “Oshi”, dengan atribut nama, tim, plus tahun lahir. Konstruktornya mau ada ketiga-tiganya, trus override method toString jugak. Jadi, gw bikin 1 file java, dengan class diagram kayak gini:

Class Diagram Oshi

Class diagram di atas dibikin pake plugin EasyUML dari Netbeans, gak bikin sendiri. Jadi kalo dirasa gak sesuai ama UML yang kamu kenal, yaaa… silahkan disesuaikan ajah. Kode dari class diagram di atas ditulisin gini:

import java.io.Serializable;

/**
 *
 * @author arby
 */

public class Oshi implements Serializable{
    private String nama;
    private char tim;
    private int tahunLahir;

    public Oshi(String nama, char tim, int tahunLahir) {
        this.nama = nama;
        this.tim = tim;
        this.tahunLahir = tahunLahir;
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public char getTim() {
        return tim;
    }

    public void setTim(char tim) {
        this.tim = tim;
    }

    public int getTahunLahir() {
        return tahunLahir;
    }

    public void setTahunLahir(int tahunLahir) {
        this.tahunLahir = tahunLahir;
    }

    @Override
    public String toString() {
        return "Oshi{" + "nama=" + nama + ", tim=" + tim + ", tahunLahir=" + tahunLahir + '}';
    }
}

Terus, buat nyimpen objeknya ke file, gw bikin class baru Main.java

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 *
 * @author arby
 */
public class Main {
    public static void main(String[] args) {
        //bentuk 1 objek Oshi
        Oshi o = new Oshi("Melody", 'J', 1992);
        
        //menyimpan objek oshi "o"
        try {
            FileOutputStream fos = new FileOutputStream("file_oshi.dat");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(o);
            oos.close();
            System.out.println("Tersimpan");
        } catch (IOException ex) {
            System.out.println("Gagal. Error: "+ex);
        }
    }
}

Keliatan kan urutannya… pertama, tentukan file-nya pake FileOutputStream, abis itu simpan objek ke dalam file pake ObjectOutputStream. Kalo udah ditulis, jangan lupa ditutup pake “close”. Untuk tipe data (ekstensi file), itu juga bebas c… gak dipakein ekstensi pun sebenernya gak masalah. Nanti, bakal ada file_oshi.dat yang kebentuk sesuai path class yang kamu punya. Kalo gw, berhubung pake netbeans, kebentuknya di dalam project Netbeans-nya langsung. Hirarkisnya gini:

Selection_005

Kalo kamu liat isinya pake text editor, bakal keluarnya gini:

Selection_006

Dan… selesai lah sudah. Objek kamu berhasil tersimpan. Tapi, yang perlu kamu perhatiin… cara di atas, gak cuma bisa nyimpen 1 objek per file lhoh yah.. kalo kamu bikin 2 objek, anggaplah o1 sama o2, terus kamu tulisin syntax “oos.writeObject(o1);” juga “oos.writeObject(o2);”, yang kesimpen 2 objek itu. Cara ngebuktiinnya?! Hmm… cara ngebuktiinnya, kamu musti baca file tersebut. Bisa liat di file-nya langsung pake editor semacam notepad atau wordpad (soalnya kalo gedit/netbeans langsung dah gw coba, dan berakhir dengan kegagalan buat nampilin isinya)…

O iya, yang perlu kamu perhatiin jugak, tentang konsep penyimpanannya. Konsepnya nimpa lhoh yah… bukan nambah2 data baru kayak penambahan row baris di database. Nimpa… alias replace. Jadi, tiap kamu jalanin kode di atas, isinya bakal nimpa sesuai yang kamu tulisin. Bukan nambah data di baris paling bawahnya.

Kalo buat ngebaca file-nya di program java… uhmmm… postingan berikutnya aja yak… Gw lagi males nulisin. Ditunggu ajah… 😀 Ja naaa… moga ngebantu yak…

Sumber: how-to-write-an-object-to-file-in-java/
Valid: Yap!
Kadaluarsa: Sampe method terkait dinyatain deprecated.

Mengakses Field Date pada Database Oracle

As always… ini tulisan rekues! Sebenernya udah lama c yah… dan orangnya yang ngerikues udah nerima jawabannya. Tinggal jawaban balik buat gw dibolehin apa enggak mosting yang dia tanyain di sini… Dan jawabannya, “terserah ajah”. Berhubung kemaren2 gw lagi di luar kota, nih tulisan baru jadi sekarang. 😀

Apapun prolog di atas, intinya si Aa’ nanya ke gw, gimana caranya kerja pake database Oracle, terus di database itu ada field yang tipe-nya Date. Kalo ajah dia nyari tutorialnya di stackoverflow, percayalah… itu jawaban bakal langsung nemu! Tapi, berhubung nih si Aa’ males ngeliat apapun, jadi dia tanya gw ajah. Katanya gw kan mantan asisten OOP. Hhhh… baiklah. (-_-)

Gimana caranya ngakses field itu? Gw tulisin jawabannya singkat ajah yak… Intinya, kalo insert, pake kuerinya gini:

String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,to_date(?,'DD-MM-YYYY','NLS_DATE_LANGUAGE = American'),?)";

Itu si Aa’ pake PreparedStatement, makanya ada tanda tanya gitu… intinya c pas masukin tanggal, bisa masukin pake format DD-MM-YYYY pas nulisinnya. Terus pas di ResultSet pake kode:

ps.setString(3,"27-05-2014");

Atau kalau kamu gak keberatan pake format “YYYY-DD-MM”, bisa pake java.sql.Date… caranya gini:

Date d = Date.valueOf("2014-11-15");
ps.setDate(3,d);

Yang paling penting dari hal di atas, kelas Date di sana diambil untuk class Date dari package java.sql… bukan java.util, yah. Si Aa’ berkali-kali gagal nyoba, gara2 dia ngira tipe Date di atas itu tipe Date dari java.util. Dan yang paling penting jugak buat kamu ketahui, kedua class ini walo namanya sama, mereka gak bisa di-casting gitu ajah. Boleh ajah kamu berhasil ngelakuin casting… tapi tolong kasi kodenya di kotak komentar yak. Gw jugak pengen tau… 😛

Teruuuuss… kalo kamu mau tau gimana caranya ngambil sysdate (tanggal dari system), kamu bisa pake bantuan dari class Date dari package java.util. Di sini, kamu bisa mengkolaborasikan kedua class Date itu. Caranya:

java.util.Date d1 = new java.util.Date();
Date d = new Date(d1.getTime());
ps.setDate(3,d);

Intinya, kamu bikin objek java.sql.Date dengan bantuan dari objek java.util.Date, tepatnya untuk memanggil method “getTime()”, yang bisa ngambil sysdate…

Dan…. trik terakhir, kalo kamu mau ngambil tipe Date dari ResultSet, dan kamu maunya nampilin pake format “dd-MM-YYYY”, ada class yang namanya “SimpleDateFormat”. Pake class itu, kamu bisa atur format tanggalnya. Caranya gini:

Date d = rs.getDate(3);
SimpleDateFormat sm = new SimpleDateFormat("dd-MM-YYYY");
System.out.println("Tanggal: "+sm.format(d));

Dan begitulah….

Kalau kamu mau tau penggalan kode di atas sebenernya lengkapnya tuh gimana… boleh disimak kode di bawah ini:

Untuk kelas Koneksi (KoneksiDB.java)… kelas ini buat ngecek JDBC ama ngembaliin objek class Connection. Kelas ini kebiasaan aja digunain pas kuliah dulu. Gak harus c, cuma ya itu… udah kebiasa… makanya adaan.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class KoneksiDB{
	private Connection conn;
	private final String DB_DRIVER="oracle.jdbc.driver.OracleDriver";
	private final String DB_URL="jdbc:oracle:thin:@localhost:1521/XE";
	private final String USERNAME="";
	private final String PASSWORD="";
	
	public void bukaKoneksi(){
		boolean flag = false;
		try{
			Class.forName(DB_DRIVER);
		}catch(ClassNotFoundException ex){
			System.out.println(ex.getMessage());
			flag = true;
		}
		if(!flag){
			try{
				conn = DriverManager.getConnection(DB_URL,USERNAME,PASSWORD);
			}catch(SQLException ex){
				System.out.println(ex.getMessage());
			}
		}
	}
	public Connection getConn(){
		return this.conn;
	}
}

Kelas Main yang digunain buat INSERT database:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,to_date(?,'DD-MM-YYYY','NLS_DATE_LANGUAGE = American'),?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG04");
			ps.setString(2,"Tisu Kering");
			ps.setString(3,"27-05-2014");
			ps.setInt(4,20);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

Kelas Main… contoh buat ngambil value dari string dengan format “YYYY-MM-DD”:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,?,?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG03");
			ps.setString(2,"Sabun Cuci");
			Date d = Date.valueOf("2014-11-15");
			ps.setDate(3,d);
			ps.setInt(4,100);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

Kelas Main yang dibikin buat ngambil sysdate:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,?,?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG03");
			ps.setString(2,"Sabun Cuci");
			java.util.Date d1 = new java.util.Date();
			Date d = new Date(d1.getTime());
        	ps.setDate(3,d);
			ps.setInt(4,100);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

dan terakhir…. kelas Main buat nampilin tanggal pake format “dd-MM-YYYY”:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		
		String kueri="SELECT * FROM pergudangan";
		ResultSet rs = null;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			rs = ps.executeQuery();
			while(rs.next()){
				System.out.println("ID Barang: "+rs.getString(1));
				System.out.println("Nama Barang: "+rs.getString(2));
				Date d = rs.getDate(3);
				System.out.println("Tanggal Masuk: "+rs.getString(3));
				SimpleDateFormat sm = new SimpleDateFormat("dd-MM-YYYY");
				
				System.out.println("Tanggal: "+sm.format(d));
				System.out.println("Stok: "+rs.getInt(4)+"\n");
			}
		}catch(SQLException ex){
			System.out.println(ex);
		}
		
	}
}

Begitulaaahhh~~ moga ngebantu yah, guyz….

Valid?: Banget.
Masa Kadaluarsa: Gak tau.
Sumber: stackoverflow, pribadi.

Membuat .jar File dari Kode Java

Jadi gini… lagi2 ada yang nanya… Kalo diliat polanya, pas mosting yang agak serius, itu pasti karena requirement dari seseorang. Entah itu temen, si Aa’, atau sapa lhah… Seolah gw gak bisa bikin sesuatu yang serius, kecuali berupa tanggapan. Huweeee….

Apapun itu, intinya ada yang nanya ke gw, gimana cara bikin file berekstensi jar dari codingan java yang udah dia bikin. Hmmm, gimana yah… Kalo gw biasanya nyuruh dia pake IDE, terus coding pake Netbeans, trus kalo dah selesai, klik kanan di project Netbeans-nya, pilih “Build”. Ntar bakal ada folder “dist” kebentuk dalam folder project, dan itu bisa dijalanin gitu ajah, asal mesinnya keinstal JRE. Tapi, requirement-nya dia lagi gak make Netbeans dan emang cuma pake editor sederhana, yang gak bisa generate IDE-nya langsung.

Okeh… permintaan di atas, mirip2 sama tugas kuliah… Tapi baiklah, berhubung gw baik… jadi gw jelasin aja di mari. Buat yang gak tau apa itu file berekstensi jar, gw jugak bakal jelasin di mari. Ekstensi jar merupakan file java archive. Jadi kayak kamu ngegabungin beberapa file menjadi sebuah file lain. Pernah nge-compress beberapa file jadi 1 file zip/rar? Kalo pernah, yaaa yang kamu lakuin mirip2 ama compress itu. Bedanya, file jar ini bukan berfungsi buat nge-compress, tapi buat ngegabungin semua file class (hasil compile file java) yang udah kamu buat supaya bisa jalan dan jadi sistem yang utuh, walau kesebar di beberapa file codingan. Intinya, file .jar itu merupakan executable file yang terdiri dari satu atau beberapa file yang kamu gunakan untuk membuat sebuah aplikasi berbasis java.

Cara gampang untuk meng-generate file jar yaitu dengan menggunakan editor IDE kayak Eclipse atau Netbeans. Caranya kayak yang udah gw jelasin di atas. Ada cara gampang, ada juga cara native pastinya… Cara native ini kemungkinan yang dilakukan banyak programmer sebelum IDE diciptakan oleh mereka. Cara native-nya pake command “jar” di terminal/console/command prompt. Berhubung sekarang lagi ngetik di komputer berbasis  Windows, jadi gw praktekkin di windows, yak. Yang linux sama ajah… gak ada beda.

Sebelumnya, gw bakal ngasi tau kalo command jar punya beberapa opsi, diantaranya c, m, f, x, t dll. Penjelasannya gini:

  1. c: buat “create” file jar
  2. m: buat memodifikasi file MANIFEST.MF yang ada di folder META-INF
  3. f: untuk merujuk ke sebuah file yang diberikan, jadi keluarannya bukan stdout gitu
  4. x: buat nge”eXtract” file jar
  5. t: buat melihat isi dari file jar yang dimaksud

Contoh? Oke.. gini, pertama, bikin dulu file java yang ada “public static void main(String args[])”-nya biar bisa di-running.

public class Main{
	public static void main(String args[]){
		System.out.println("Hello World");
	}
}

Kompile dan run file java itu…

1. Eksekusi dan Jalankan

Yang perlu kamu ketahui, setiap kamu nge-running java, sebenernya yang kamu jalanin adalah file .class-nya, dan bukan file java-nya. Jadi, dalam jar, kamu cukup masukin file .class yang kamu butuhin… gak usah semuanya jugak. Tapi kalo kamu mau masukin semuanya, juga gak masalah. Kamu tinggal pake command “*” ajah… Gak usah pilih2…

Jadi… langkah selanjutnya, kamu masukin file Main.class ke dalam sebuah file jar, pake command jar

2. Bentuk Jar

Command itu gak usah gw jelasin yah maksud “cf”-nya. Kan udah di atas… Kalo hai.jar, itu nama file jar yang kamu mau, dan setelahnya ada Main.class… itu file class yang mau dimasukin ke file jar-nya. File jar ini, seharusnya udah bisa kamu jalanin… tapi biasanya, yang terjadi c belum bisa dijalanin. Cobain deh gini:

3. Jalankan Jar

Bilangnya, belum ada “main” di manifest sebagai atribut. Mungkin kamu bingung, dan gw lebih bingung lagi ngejelasinnya. Tapi intinya, pas kamu bikin file jar tersebut, ada file MANIFEST.MF dari folder META-INF yang di-generate secara default oleh sistemnya, karena file ini emang dibutuhin sama si file jar-nya. Bentuk default-nya kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)

Isi dari file MANIFEST.MF itu belum lengkap, karena kita gak specified class yang punya “public static void main(String args[])” tuh yang mana. Makanya error-nya gitu. Uhhmmm… nangkep kan maksud gw?! Okeh, nangkep atau enggak, gw bakal kasi tau solusinya. Kamu extract dulu file jar yang tadi pake command gini:

4. Jar Salah

Dan nanti, ada file tambahan di folder tempat kamu nge-ekstract file hai.jar.

5. Struktur File

Ada folder META-INF. Di dalamnya ada MANIFEST.MF. Ubah isi file MANIFEST.MF pake editor favorit kamu (bisa gedit/notepad++/notepad) jadi kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)
Main-Class: Main

Yang gw merahin merupakan nama Class yang bisa di-running (ada public static void main(String args[])). Kalo Class gw kan namanya Main.class, jadi gw bikinnya “Main”. Save, dan tutup editornya. Gak ditutup juga gak papa c. Terus, kamu bikin lagi file jar pake MANIFEST yang udah kamu ubah isinya tadi dan running. Caranya gini:

6. Bentuk Jar

Yang perlu kamu perhatiin, kamu harus nambahin satu karakter kosong sehabis kamu ngubah file MANIFEST.MF, jangan kayak gini:

7. Manifest Salah

Kenapa?! karena kalo gak, yaaa bakal jadi kayak gini kalo kamu running, hal ini lah yang bakal kamu temuin:

8. Jar Salah

Jadi bikinnya, paling gak ada karakter space kayak gini (space lhoh yah… whitespace juga gak ngaruh):

9. Manifest Benar

Dan buat kamu yang bertanya-tanya, kenapa ngejalaninnya pake “java -jar”, bukannya klik dua kali… kan executable?? Gak ada yang bisa gw jawab kecuali “yaaa.. karena tipe aplikasi yang dibikin itu sifatnya console-based”. Jadi jalaninnya tetap di console/terminal/command prompt/cmd. Kalo kamu bikin aplikasi GUI, ntar juga bisa dijalanin pake klik 2x. Dan begitulaaahhhh…. Pertanyaan dan saran, boleh langsung di kotak komentar, yak…

PS: kalo ada yang nanya, buat library eksternal kayak JDBC kalo mau di-running, daftarinnya gimana… Jawabannya gini: “tinggal kamu tambahin atribut Class-Path di file MANIFEST.MF”. Contohnya gini:

10. Manifest dengan Path

Dan struktur folder-nya gini:

11. Bentuk Jar

Kalo library lain ada lagi yang mau ditambahin, tinggal dikasi spasi ajah kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)
Main-Class: Main
Class-Path: lib1.jar lib2.jar lib3.jar

PPS: Kalo ada yang nanya lagi, “itu… file MANIFEST.MF sebenernya buat apa dan harus kayak di atas bikinnya? Generate dulu, extract, baru pake yang ada?” sebenernya enggak. Jawabannya: “gw gak tau yah buat apa sebenernya, tapi kayaknya buat spesifikasi pas nge-running java…kan ada atribut Main-Class gitu, terus kalo harus gitu bikinnya… enggak c yah. Kamu bisa bikin sendiri file MANIFEST.MF itu pake editor biasa, asalkan encoding-nya pake UTF-8”. Contohnya, gini.. gw bikin sendiri MANIFEST.MF kayak di atas, terus gw generate lagi kayak gini:

12. Akhir

Dan selesai… Begitulah caranya.. Moga membantu…

Valid: Iyap!
Kadaluarsa: Gak tau
Sumber: situs oracle, stackoverflow.com sama dok pribadi

Set Classpath Library JDBC

Kemaren si Aa’ nanya ke gw tentang koneksi dari java ke oracle. Sebenernya inih gampang c yah. Tinggal pake IDE terus tambahin library, trus bikin class buat buka koneksi. Sayangnya rekuesan yang gw terima, gak boleh pake IDE. Gak tau apa maunya si Aa’, tapi ya sudahlah… Sebagai adek yang baek, gw kasih tau caranya. Dan ternyata, gw juga gagal!

Kesalahan yang gw lakukan adalah, gw gak tau caranya nge-set classpath jdbc di library java. Dan kalo udah berhasil nge-set classpath, nanti juga berhasil.

Sebenernya ada beberapa cara yang gw lakukan terkait hal ini… yaitu:

1. Download jdbc di situs oracle.

Downloadnya di situs ini. Sebenernya, kalo windows, ini bisa diambil langsung… di tempat instal oracle, terus ke direktori tertentu. Anggap kamu nginstall oracle 11g rilis 2 di drive D:, alamat library-nya ada di D:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib. Di folder tersebut, ada 2 versi ojdbc. Satunya ojdbc6.jar, satunya lagi ojdbc6_g.jar. Sebenernya 2 itu sama ajah c, cuma ada bedanya… gw juga lupa apa. Masalah compile gitu? Entah apapun itu, gw pakenya yang gak pake huruf g. Kalo di linux, gw gak tau… Makanya gw download, bukan nyari di tempat nginstallnya.

2. Bikin class koneksi sebagai berikut:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
 
public class Koneksi{ 
   private final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
   private final String DB_URL="jdbc:oracle:thin:@//localhost:1521/XE"; 
   private final String USER ="uname"; 
   private final String PASSWORD="pwd"; 
   private Connection conn = null; 
   
   public void bukaKoneksi(){ 
       boolean flag = false; 
       try{ 
	  Class.forName(JDBC_DRIVER); 
       }catch(Exception e){ 
	  System.out.println("Error: "+e); 
          flag = true; 
       } 
       /*if(!flag){ 
	  try{ 
	     conn = DriverManager.getConnection(DB_URL,USER,PASSWORD); 
	  }catch(Exception e){ 
	     System.out.println(e.getMessage()); 
          } 
	  
       }*/ 
   } 
   public Connection getConn(){ 
	return conn; 
   } 
}

Standar kan yah?! Iya! Standar… Jadi gw coba compile, terus bikin class buat ngejalanin gini:

public class Main{ 
   public static void main(String args[]){ 
      Koneksi k = new Koneksi(); 
      k.bukaKoneksi(); 
   } 
}

Dan ternyata, yang gw dapetin adalah Error… ClassNotFoundException! Driver-nya gak kebaca, sodara2! Gw nyari2, kalo di windows, ternyata bisa copy-in di bagian lib\ext dari direktori penginstalan Java. Jadi kalo kamu punya java 64 bit di mesin kamu (Windows 7), kemungkinan letaknya di “C:\Program Files\Java\jdk1.7.0_55\jre\lib\ext“. Kalo udah gini, program kamu bakal berhasil dijalanin tanpa error. Tapi… sayangnya, ini gak berlaku di linux. Gw gak ngerti kenapa.

Walopun gitu, terlepas dari bisa atau gak, cara di atas sebaiknya gak kamu lakuin yah… Karena library dari compiler sebaiknya gak kamu tambahin apapun. Yang perlu dilakukan yaitu nambahin classpath dengan value berupa path direktori tempat peletakan library jdbc-nya (ojdbc6.jar yang tadi). Kalo di linux yang gw lakukan gini:

di terminal, ketikin:

sudo gedit ~/.bash_profile

dan kebuka sebuah file, tambahin baris gini

CLASSPATH=$CLASSPATH:/home/user/Documents/jdbc/ojdbc6.jar 
export CLASSPATH

Yang “/home/user/Documents/jdbc/ojdbc6.jar”, itu merupakan path tempat peletakan si library jdbc. Terus save, keluar deh… Kalo di windows, bisa pake:

set classpath=E:\JDBC\ojdbc6.jar;.

Jangan lupa buat nambahin titik koma sama titik di akhirnya, yah. Gw coba di komputer Aa’, dan kelupaan ngasi titik, jadinya gak bisaan gitu. Lebih jelasnya, kamu bisa liat di link video ini. Kalo dah ngatur kayak gitu, kamu bisa compile kode java kamu dengan nyaman… Kayak biasa ajah compile sama nge-run Nya.

PS: Pastiin classpath-nya bener pake command “echo $CLASSPATH”. Untuk nama variabel, sifatnya case sensitive lhoh yah.. Jadi jangan sampe salah.

Menampilkan 2 Angka Belakang Koma dengan Java

Beberapa hari yang lalu, ada yang nanyain ke gw tentang cara nampilin sebuah hasil pembagian biar jadi 2 angka belakang koma di java. Well, sebenernya ini hal dasar yang musti diketahui pas pertama kali belajar java. Minimal nyentuh bahasa pemrograman java lhah… Tapi tampak para dosen jaman sekarang lebih focus berkutat sama logika dan proses pembelajaran dibandingkan hasil akhir, jadilah akhirnya pas nemu kasus beneran, ada ajah pertanyaan “lucu” kayak gitu.

Eh tapi gw gak maksud memojokkan dosen jaman sekarang lhoh yah… Buktinya masih ada kok yang gak gitu. Contoh aja senpai gw yang baru lulus S2. Kata senpai gw, di era digital dengan keberadaan internet di mana semua  source bisa didapatin dengan gampang, yang diperluin ama mahasiswanya itu skill buat ngebaca dokumentasi atau paling gak, tahu keyword buat nyari di stackoverflow atau google.

Balik lagi ke kasus awal kita… Sebenernya ada beberapa cara buat nampilin 2 angka belakang koma. Beberapa di antaranya yaitu:

1. Menggunakan decimal format

import java.text.DecimalFormat;

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.println(df.format(x));
    }
}

Hasil akhir:

1. Hasil Decimal Format

Angka signifikan di belakang koma bisa kamu ganti di parameter dalam konstruktor DecimalFormat (yang ada karate pagar—baris warna merah). Contohnya, kalo kamu mau ganti 3 angka belakang koma, bisa pake format (#.###).

2. Menggunakan format String (String.format).

Contoh:

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        System.out.println(String.format("%.2f", x));
    }
}

Hasil akhir bakal sama kayak di atas, dan kalo kamu butuh penambahan angka signifikan, tinggal ganti parameter di method format dari class String. Jadi kalo butuh 3 angka belakang koma, ubah baris buat nampilin jadi kayak gini: “System.out.println(String.format(“%.3f”, x));”. Parameter %.2f itu maksudnya, tampilkan sebuah float dengan angka belakang koma sebanyak 2, dan ikutin aja polanya. Seandainya butuh 5 angka belakang koma, kamu bisa kasih parameter %.5f.

3. System.out.printf (Favorit gw)

Contoh:

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        System.out.printf("%.2f",x);
    }
}

Hasilnya sama ama kayak di atas, dan pola parameter juga sama. Kalo mau digabung sama string lain juga gampang. Anggap kamu mau nampilin variabel x jadi gini: “Hasil: 0.928”, kamu bisa ubah baris printf jadi kayak gini: “System.out.printf(“Hasil: %.3f \n”,x);”. Kalo karakter \n itu maksudnya buat nambah baris baru.

4. Membulatkan isi/nilai variabel

Hal-hal sebelumnya dimaksudkan biar kita bisa nampilin bilangan berkoma banyak jadi tampil dengan beberapa angka signifikan belakang koma. Tapi, kalo ternyata yang kamu mau itu gak cuma sekedar menampilkan, tapi juga mengubah isi variabel menjadi bentuk pembulatan, kamu bisa ngelakuin trik semacam ini:

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        int angkaSignifikan = 2;
        double temp = Math.pow(10, angkaSignifikan);
        double y = (double) Math.round(x*temp)/temp;
        System.out.println("Sebelum Pembulatan: "+x);
        System.out.println("Setelah Pembulatan: "+y);
    }
}

Hasilnya jadi kayak gini:

2. Pembulatan

Kalo kamu mau ngubah jumlah angka signifikan belakang koma, kamu bisa ubah2 nilai di variabel angkaSignifikan.

Valid: Yap
Masa Kadaluarsa: Teruji di Java 1.7.0_55
Sumber:
– http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java
– http://stackoverflow.com/questions/16408253/rounding-off-2-decimal-places-in-java-for-whole-number

Menambahkan window Login pada Netbeans Platform

Pertanyaan yang sering gw denger terkait netbeans platform yaitu… “bisa gak dikasi security aplikasinya?” Dan jawaban gw… “Tergantung!”… Yuhu~~~ tergantung ama jenis security apa yang kamu maksud. Kalo maksudnya biar ada halaman login sebelum aplikasinya dijalanin… yaaa bisa banget! Yang perlu kamu lakuin ngikutin tutorial dari netbeans platform tentang installer.

Buat 1 netbeans module di 1 NPA (Netbeans Platform Application) kayak gini (Untuk NPA-nya, bikin sendiri yak… pake yang ada jugak boleh, gak musti bikin NPA baru dari awal. Module jugak sama, Cuma gw bikin module baru khusus Installer)…

Klik kanan bagian module di NPA, pilih “Add New…”.

1. Module Baru

Masukin “LoginModule” buat namanya…

2. Nama Module Baru

Buat code name base-nya terserah… Cuma kamu bisa masukin kayak gw (“org.login”)

3. Code Base Module baru

Bakal muncul 1 netbeans module yang baru bernama “LoginModule”, breakdown ajah (tekan tanda tambah-nya) terus di package “org.login” klik kanan pilih “Other”.

4. Login Module

Bakal muncul 1 window baru, pilih “Module Development” di sebelah kiri, pilih “Installer/Activator” di sebelah kanan.

5. Installer

Installer ini merupakan hal yang pertama kali dijalankan ama NPA. Kalo gak salah, Cuma ada 1 Installer per netbeans module. Kalo gak salah lhoh yah… Jadi, kamu bakal nemuin error kalo punya lebih dari 1 installer per module. Tapi… 1 NPA boleh punya lebih 1 module kan yah… Kalo kamu mau letakin 1 Installer untuk tiap module-nya, yaaa boleh2 ajah…  Cuma pastiin kalo tiap Installer itu gak bentrok algoritmanya satu sama lain…

Intinya, bakal kebentuk 1 Installer… dan isinya tuh gini:

package org.login;

import org.openide.modules.ModuleInstall;

public class Installer extends ModuleInstall {

    @Override
    public void restored() {
        // TODO
        
    }

}

Yup! Simple yah…. Di bagian body method restored(), kamu bisa tambahin apapun yang bakal ngejalanin kode itu pertama kali pas NPA dijalanin. Coba ajah tambahin gini:

package org.login;

import org.openide.modules.ModuleInstall;

public class Installer extends ModuleInstall {

    @Override
    public void restored() {
        System.out.println("Hello World");
    }

}

Dan nanti, pas NPA dijalanin… jadinya gini:

6. Eksekusi Installer

Muncul “Hello World” gitu…

Hal ini yang bakal kita manfaatin buat munculin login window pas ngejalanin NPA. Jadi… udah nangkep yah apa yang mau kita bikin… Minimal, tempat untuk pertama kali modul dijalanin udah ada.. Sekarang, bikin form login-nya.

Masih di module yang pertama kita bikin tadi, klik kanan di package org.login, pilih New → Other.

7. New Panel

Di sebelah kiri pilih “Swing GUI Forms”, di sebelah kanan pilih “JPanel Form”. Di bagian nama, masukin ajah “LoginForm”. Bebas c yah… Suka2 kamu ajah.

Kenapa pilih JPanel bukan JFrame Form?! Coz kita gak bikin satu aplikasi sendiri teman2… kita bikin sebuah panel yang jadi bagian dari NPA-nya. Jadi, GUI dasar tetap dari NPA. Makanya pake JPanel. Mungkin itulah yang dibilang Netbeans di tutorialnya kalo kamu bertanya2 kenapa gak bikin JFrame Form sekalian.

8. New Panel-2

Sekarang, bisa design panel-nya suka2 kamu. Mau pake layout apapun boleh. Gw c gini:

9. Design Panel

Tambahkan method untuk me-return isi dari text field username sama password:

    public String getUsername(){
        return this.jTextField1.getText();
    }
    
    public char[] getPass(){
        return this.jPasswordField1.getPassword();
    }

Ada 2 label, 1 text field sama 1 password field. Di sini, GUI tempat nampung username sama password udah muncul. Tinggal dipanggil ajah di bagian Installer. Tapi… seperti yang kamu tau, JPanel bukanlah komponen yang biasa ditampilkan secara langsung. JPanel kan sifatnya lebih ke container, bukan sebagai pane. Kalo gak salah c yah. Atau gw kebalik?

Tapi bukan itu intinya… Intinya adalah gimana cara nampilin si JPanel di NPA. Kita bisa pake NotifyDescriptor yang ada di module “Dialogs API”. Jadi, caranya… klik kanan di bagian “Libraries”, pilih “Add Module Dependency”. Di bagian Filter tulis “NotifyDescriptor” atau “Dialogs API”.

10. Dependency

Dan nantinya, ada 1 library tambahan di bagian “LoginModule”.

11. Libraries

Ubah isi dari Installer dengan memanggi si JPanel yang sudah dibuat sebelumnya:

import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.modules.ModuleInstall;

public class Installer extends ModuleInstall {

    LoginForm lf = new LoginForm();
    @Override
    public void restored() {
        NotifyDescriptor nd = new NotifyDescriptor.Confirmation(lf, "Login");
        DialogDisplayer.getDefault().notifyLater(nd);
    }
}

Dan… setelah clean & build, terus di-run, NPA kamu bakal ngehasilin tampilan kayak gini:

12. Login Window

Ada login-nya sodara2!! Hohohoho…

Tapi… sayangnya, kamu mau tekan tombol apapun, hasilnya sama ajah.. pasti ngeluarin aplikasi NPA-nya gak pake kendala.

Untuk melakukan pengecekan username dan password yang sesuai, ubah codingan di Installer kayak gini:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Arrays;
import javax.swing.JButton;
import org.openide.DialogDisplayer;
import org.openide.LifecycleManager;
import org.openide.NotifyDescriptor;
import org.openide.modules.ModuleInstall;

public class Installer extends ModuleInstall {

    LoginForm lf = new LoginForm();

    @Override
    public void restored() {
        bikinForm();
    }

    private void bikinForm() {
        JButton ok = new JButton();
        ok.setText("OK");

        JButton cancel = new JButton();
        cancel.setText("Cancel");

        cancel.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                exit();
            }
        });

        ok.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                authenticate();
            }
        });
        
        NotifyDescriptor nd = new NotifyDescriptor.Confirmation(lf, "Login");
        DialogDisplayer.getDefault().notifyLater(nd);
        nd.setOptions(new Object[] {ok,cancel});
        
        nd.addPropertyChangeListener(new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent pce) {
                if (NotifyDescriptor.CLOSED_OPTION.equals(pce.getNewValue())) {
                    exit();
                }
            }
        });
    }

    private void exit() {
        LifecycleManager.getDefault().exit();
    }
    
    private void authenticate(){
        String uname = lf.getUsername();
        char[] pwd = lf.getPass();
        if(uname.equals("Arby")){
           if(cekPwd(pwd)){
               
           }else{
               exit();
           }
        }else{
            exit();
        }
        
    }
    
    private boolean cekPwd(char[] input){
        boolean benar;
        char[] pass = {'p','e','s','a','n'};
        if(input.length != pass.length){
            benar = false;
        }else{
            benar = Arrays.equals(pass, input);
        }
        Arrays.fill(pass,'0');
        return benar;
    }
}

Moga kamu gak bingung c yah ama kode di atas… Intinya, kode warna biru untuk ngebikin panel-nya. Jadi yang awalnya ada 3 tombol, sekarang ada 2 tombol. Masing2 tombol punya action sendiri… yaitu exit() sama authenticate(). Itu kode yang gw tandain pake warna merah. Terus ada method “cekPwd()” yang digunain buat ngecek password. Method itu dipanggil di method authenticate().

Yah… gitu lah…

Sekarang, kalo di-run udah jalan mintak uname ama password. Uname-nya “Arby” passwordnya “pesan”. Itu case sensitive lhoh yah… Kalo salah masukin, yaaa… selesai… Kalo kamu bingung mau ngubah uname ama password ada di mana, yaaa… itu masalah kamu! Hehehe 😀

Eh… enggak kok, gw gak kejam. Adanya di baris yang gw pakein bold ama underline…

Begitulaaahhh~~ moga bantu yak.

Valid: Yap
Kadaluarsa: Sejauh ini teruji mulai 7.2 sampe nb 8
Sumber: Situs netpla+dok pribadi

Menggunakan MD5 di Java

Kamu tau fungsi hash?? Hmmm.. mustinya tau yah, jadi gw gak usah nulisin lagi di mari. Intinya, fungsi hash itu fungsi satu arah buat ngubah suatu string. Fungsi ini banyak digunain buat nyimpen password di database. Jadi, sebelum passwordnya dimasukin ke database, diubah dulu bentuknya pake fungsi hash, baru disimpen. Jadi… bahkan orang yang punya akses database-nya gak bakal tau password dari user terkait. Dan fungsi hash paling dikenal itu… MD5! Kenapa?? Gak ngerti jugak deh. Mungkin ada hubungannya sama pemanggilannya yang gampang di php. Kamu tinggal gunain:

string md5 ( string $str [, bool $raw_output = false ] )

Contohnya,

<?php
$str = 'apple';

if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
    echo "Would you like a green or red apple?";
}
?>

Tapi… berhubung gw lagi gak bicarain php, jadi… kita ganti bahasa! Di postingan ini, gw bakal tulisin contoh pemakaian md5 di java. Di java sendiri, pemakaiannya jugak gak sulit2 amat coz kamu gak usah bikin fungsi md5 dari awal. Ada class MessageDigest dari package “java.security”yang bisa kamu gunain di sini. Sayangnya, masukan dari fungsi md5 bukan string… jadi musti convert dulu ke dalam bentuk array of byte.

Dan pemakaiannya kira2 pake kode gini:

import java.security.MessageDigest;
…
String pesan = “pesan kamu”;
byte[] bytePesan = pesan.getBytes();
MessageDigest md = null;
try {
      md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException ex) {
      Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
byte[] hasil = md.digest(bytePesan);

Dan “hasil” merupakan bentuk md5 dari pesan kamu. Cuma ajah, masih dalam bentuk byte. Hasil ini bisa kamu ubah ke dalam bentuk String pake method “toString” yang (kemungkinan) bakal nampilin alamat dari si array of byte. Atau kamu bisa ubah ke dalam bentuk string lagi pake kode:

byte[] hasil = md.digest(bytePesan);
String pwd = new String(hasil);

Tapi… sayangnya, ini gak bisa kamu lakuin… coz hasilnya bakal jadi gini:

1. Hasil Password

Jadi… gimana caranya supaya string dari hasil fungsi md5 itu muncul?? Caranya ngerubah bentuk byte itu ke dalam format hexa. Gampangnya, sediain 1 fungsi dengan masukan byte dan keluaran String:

    private static String byteArrToString(byte[] b) {
        
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i < b.length; i++) {
            int j = b[i] & 0xff;
            if (j < 16) {
                sb.append('0');
            }
            sb.append(Integer.toHexString(j));
        }
        String res = sb.toString();
        return res.toUpperCase();
    }

Dan bisa digunain gini:

        byte[] hasil = md.digest(bytePesan);
        String password = byteArrToString(hasil);

2. Hasil Fungsi Hash

Lengkapnya:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Arby
 */
public class Main {

    public static void main(String[] args) {
        Scanner x = new Scanner(System.in);
        System.out.print("Masukkan kata: ");
        String pesan = x.nextLine();

        byte[] bytePesan = pesan.getBytes();
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        byte[] hasil = md.digest(bytePesan);
        
        String password = byteArrToString(hasil);
        System.out.println(password);
    }

    private static String byteArrToString(byte[] b) {
        
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i < b.length; i++) {
            int j = b[i] & 0xff;
            if (j < 16) {
                sb.append('0');
            }
            sb.append(Integer.toHexString(j));
        }
        String res = sb.toString();
        return res.toUpperCase();
    }
}

Sumber:
http://stackoverflow.com/questions/415953/generate-md5-hash-in-java
https://platform.netbeans.org/tutorials/60/nbm-login.html

Valid: Yap…
Kadaluarsa: Sampe method dari class MessageDigest dinyatain deprecated

Membuka Window dari Node Bean Tree pada Netbeans Platform

Pengen buka window dari suatu node?! Simple, pake ajah kode:

TopComponent tc = new NamaTopComponentYangDibuka();

Atau, karena top component udah di-set sebagai suatu singleton ama netbeans platform, manggilnya bisa gini:

TopComponent tc = WindowManager.getDefault().findTopComponent("NamaTopComponentYangDibuka ");

Dan jangan lupa nambahin kode:

tc.open();

Begitulaaahh~~ gampang kan?! Tambahin kode2 di atas di aksi yang udah dibikin sebelumnya.

Tulisan Terkait:

  1. Bean Tree View
  2. Aksi Bean Tree View

Valid: Yap!
Kadaluarsa: Teruji efektif di versi 7.4-8.0; Diyakinkan jalan di versi 6.9 ke atas.
Sumber:
Milis Netbeans
Situs Geertjan