Anda di halaman 1dari 129

MATERI PELATIHAN

Java Desktop
Java Desktop
Ifnu Bima
ifnu@artivisi.com
http://ifnu.artivisi.com
http://www.artivisi.com
Jakarta, 2008
Daftar Isi
Java Foundation Class.......................................................................................................1
Feature JFC...................................................................................................................1
Swing Package..............................................................................................................2
Swing HelloWorld........................................................................................................3
Install Java Development Kit...................................................................................3
Membuat program HelloWorld ...............................................................................3
Melakukan kompilasi program HelloWorld............................................................4
Menjalankan program HelloWorld..........................................................................4
Membuat Swing HelloWorld dengan Netbeans 6.1......................................................5
Komponen Swing ............................................................................................................7
Struktur Komponen Swing...........................................................................................7
Bekerja dengan JLabel, JTextField dan JButton...........................................................8
Bekerja dengan JCheckBox dan JRadioButton..........................................................11
Bekerja dengan JList dan JComboBox ......................................................................15
Bekerja dengan Menu, Popup Menu dan Toolbar......................................................18
Membuat Menu......................................................................................................19
Membuat Popup Menu .........................................................................................24
Membuat Toolbar...................................................................................................25
Membuat Dialog dan JFileChooser.............................................................................29
Membuat pre-defined dialog dengan JOptionPane................................................30
Membuat JFileChooser..........................................................................................35
Konsep MVC...................................................................................................................38
Model dalam Komponen Swing ................................................................................39
TableModel.................................................................................................................41
ListModel ...................................................................................................................42
Menangani Event.............................................................................................................44
Event Listener dalam Swing ......................................................................................45
ActionListener.............................................................................................................48
KeyListener.................................................................................................................50
HALAMAN III
MouseListener dan MouseMotionListener.................................................................52
Koneksi Database Dengan JDBC....................................................................................55
Mengenal JDBC..........................................................................................................55
Database Driver...........................................................................................................56
Membuat Koneksi.......................................................................................................56
Mengambil dan Memanipulasi Data dari Database....................................................58
Menggunakan PreparedStatement...............................................................................60
Batch Execution..........................................................................................................62
Menangani Transaction...............................................................................................62
DAO dan Service Pattern............................................................................................63
Java Persistence API (JPA).............................................................................................71
Perbedaan dialek SQL............................................................................................71
Perbedaan konsep relasional dan object-oriented..................................................72
Peningkatan kinerja................................................................................................73
Persiapan.....................................................................................................................74
Instalasi ..................................................................................................................74
Aplikasi Blog..........................................................................................................75
Fungsionalitas Aplikasi..........................................................................................75
Dasar-dasar ORM.......................................................................................................75
Mapping Sederhana................................................................................................75
Konfigurasi JPA.....................................................................................................76
Menyimpan dan Mengambil Object.......................................................................78
EntityManagerFactory............................................................................................79
Menyimpan object ke database..............................................................................79
Mengambil data dari database................................................................................80
Membuat skema database.......................................................................................81
Membuat CategoryDao..........................................................................................81
Menggunakan EntityManager................................................................................82
Client Code.............................................................................................................82
Pemetaan Relasi..........................................................................................................83
Pertimbangan dalam pemetaan...................................................................................85
Kasta.......................................................................................................................86
HALAMAN IV
Navigasi..................................................................................................................89
Jenis Collection......................................................................................................90
Optionality..............................................................................................................91
Transitive Persistence ............................................................................................92
Enum Type..................................................................................................................93
Value Type..................................................................................................................94
One to One .................................................................................................................95
Many to One................................................................................................................95
One to Many ...............................................................................................................96
List dengan order by...............................................................................................96
Many to Many ............................................................................................................99
Parent-Child..............................................................................................................100
Mengambil Objek dari Database...............................................................................101
JPA Query Language (JPAQL).................................................................................101
Query Sederhana..................................................................................................101
Pagination.............................................................................................................102
Parameter Binding................................................................................................102
Named Query.......................................................................................................103
Restriction............................................................................................................104
Query untuk Collection........................................................................................106
Projection ............................................................................................................106
Join ......................................................................................................................106
Report Query........................................................................................................107
Subquery...............................................................................................................107
Native SQL...............................................................................................................108
Jasper Report.................................................................................................................109
Pengenalan................................................................................................................109
Instalasi ....................................................................................................................109
Alur Proses JasperReport..........................................................................................110
Istilah Umum dalam JasperReport............................................................................110
iReport sebagai Visual Designer ..............................................................................111
Konfigurasi Koneksi Database dalam iReport..........................................................112
HALAMAN V
Menampilkan Data dalam Report.............................................................................113
Kompilasi Report dengan Ant...................................................................................114
Integrasi JasperReport dengan Swing.......................................................................116
Menampilkan Report Menggunakan DataSource.....................................................117
Mengirim Parameter.................................................................................................120
Menggunakan Scriptlet.............................................................................................120
Penutup..........................................................................................................................122
Referensi dan Bacaan Lebih Lanjut...............................................................................123
HALAMAN VI
JAVA FOUNDATION CLASS | HALAMAN 1
Java Foundation Class
Java Foundation Class (JFC) merupakan sekumpulan class-class
Java yan diunakan untuk menem!ankan perankat lunak
!er!asis "#$ ("raphical #ser $nterface). %elain itu& JFC 'ua
mempunyai class-class yan diunakan untuk menam!ahkan
funsi dan kemampuan interaksi yan variatif dari pemroraman
Java. (ari definisi ini& JFC tidak hanya !erisi class-class "#$ sa'a
tetapi 'ua class-class lain yan dapat meninkatkan kemampuan
pemroraman Java !aik dari sei funsionalitasnya maupun dari
sei kemampuan interaksi pemroraman Java yan sanat kaya.
Feature JFC
Fitur-fitur yang dipunyai oleh JFC
Fitur Deskripsi
Komponen
Swing
Memuat semua class-class yang dibutuhkan untuk
membuat aplikasi berbasis G!" dari tombol" table"
tab" menu" toolbar dan sebagainya
#ook and
Feel $#aF%
Memberikan kemampuan kepada program Ja&a yang
dikembangkan menggunakan library swing untuk
memilih tema tampilan' Misalnya sebuah program
yang sama dapat mempunyai tampilan windows #aF
atau Ja&a #aF" atau #aF lain yang dikembangkan oleh
komunitas seperti JGoodies'
(ccessibility
()!
Faslititas untuk mengembangkan aplikasi bagi
penyandang cacat" misalnya dukungan untuk
membuat huruf braile" kemampuan mengambil input
dari layar sentuh dan sebagainya'
Ja&a *D ()! +erisi kumpulan class-class yang dapat digunakan
untuk memanipulasi ob,ect-ob,ect * dimensi" sperti
garis" kotak" lingkaran" kur&a dan lain sebagainya'
Selain itu Ja&a *D ()! ,uga memberikan kemampuan
program yang ditulis menggunakan Ja&a untuk
mencetak output ke alat pencetak seperti printer'
Drag-and-
drop
Menyediakan kemampuan drag-and-drop antara
program Ja&a dan program lain yang ditulis spesifik
untuk suatu platform sistem operasi tertentu'
HALAMAN 2 | JAVA SWING
!nternational
i-ation $i./n%
Membantu pengembang perangkat lunak untuk
membangun aplikasi yang dapat mendukung semua
bahasa dan huruf yang ada di dunia'
)a!el Feature JFC
*odul ini akan !erkonsentrasi untuk mem!ahas komponen swin.
+emilihan komponen dan li!rary swin yan tepat dapat
mempenaruhi kualitas proram yan kita !uat secara sinifikan.
,al ini dikarenakan& dalam dunia Java %tandard -dition& le!ih
spesifik lai aplikasi Java yan di!anun menunakan swin&
!elum ada framework yan !enar-!enar komprehensif
mem!im!in penem!an untuk mem!uat aplikasi yan
!erkualitas.
+ada umumnya aplikasi yan dikem!ankan denan %win
mempunyai kode yan sanat .kotor.& dimana kode yan !erisi
penendalian terhadap event komponen swin !ercampur aduk
denan kode yan !erisi aturan !isnis dan kode yan !erisi
manipulasi terhadap data.
Swing Package
%win /+$ sanat !aus dan lenkap& Java 0.1 menyertakan
setidaknya tu'uh !elas (23) !uah packae yan !erisi class-class
swin yan siap diunakan.
,a&a0'accessibility ,a&a0'swing'plaf ,a&a0'swing'te0t
,a&a0'swing ,a&a0'swing'plaf'basic ,a&a0'swing'te0t'html
,a&a0'swing'border ,a&a0'swing'plaf'metal ,a&a0'swing'te0t'rtf
,a&a0'swing'colorchooser ,a&a0'swing'plaf'multi ,a&a0'swing'table
,a&a0'swing'e&ent ,a&a0'swing'plaf'synth ,a&a0'swing'tree
,a&a0'swing'filechooser ,a&a0'swing'undo
#tunnya kita tidak akan menunakan semua class-class dalam
packae swin& hanya se!aian kecil sa'a dari class-class terse!ut
yan nantinya akan !enar-!enar kita unakan. %ehina kita !isa
!erkonsentrasi untuk memahami !e!erapa komponen pentin sa'a.
(alam modul ini nanti kita hanya akan menunakan !e!erapa
class komponen swin yan pentin sa'a. 4e!erapa kelas ini sudah
cukup se!aai !ahan pemem!uat perankat lunak !erkualitas.
5omunitas Java 'ua menyediakan !anyak sekali li!rary swin&
antara lain dari %win6 dan J"oodies yan menem!ankan
JAVA FOUNDATION CLASS | HALAMAN 3
li!rary standard swin denan menam!ahkan !er!aai macam
feature menarik. %edankan komunitas dari 'avadesktop.or
menem!ankan !anyak sekali li!rary swin untuk keperluan
khusus. 7yaris semua komponen yan kita perlukan !aik
komponen umum hina komponen untuk tu'uan khusus !anyak
tersedia di internet& kita tinal mencari dan menunakan.
+raktek yan !aik dalam memilih komponen apa yan tepat adalah
denan mencari dahulu informasi di internet. ,al ini sanat
!ermanfaat untuk menurani waktu kita menem!ankan
komponen& sehina kita !isa le!ih !anyak !erkonsentrasi untuk
menem!ankan sisi !isnis dan usa!ility dari software yan kita
kem!ankan. %e!aik apapun softeware yan kita !uat tapi tidak
mem!erikan nilai tam!ah terhadap masalah yan dihadapi adalah
kesia-siaan !elaka. 4anyak sekali software yan dianap aal
mem!erikan nilai tam!ah terhadap masalah yan dihadapi hanya
karena tampilan "#$-nya sanat susah dipahami dan tidak intuitif.
Swing HelloWorld
*enunakan contoh lansun adalah cara yan tepat untuk
memulai proses !ela'ar. Cara ini mem!erikan am!aran konkrit
tentan su!'ect yan akan dipela'ari& sehina proses !ela'ar le!ih
cepat diserap. #ntuk tu'uan ini& kita akan mem!uat se!uah
proram kecil yan menampilkan kata 8,ello9orld: menunakan
komponen swin. 4erikut ini adalah lankah-lankah yan harus
anda lakukan untuk mem!uat proram 8,ello9orld: !er!asis
komponen swin:
2. $nstall Java (evelopment 5it (J(5)
;. *em!uat proram ,ello9orld itu sendiri
<. *elakukan kompilasi proram ,ello9orld
=. *en'alankan proram ,ello9orld
Install Java Development Kit
>an perlu kita lakukan dalam lankah ini hanyalah mendownload
J(5 dari we!site 'ava.sun.com. kemudian 'alankan proram
instalasinya dan ikuti perintah-perintah dalam lankah-lankah
instalasi terse!ut. %etelah proses instalasi selesai& kita siap untuk
mem!uat proram Java.
Membuat program HelloWorld
HALAMAN 4 | JAVA SWING
+roram Java denan tampilan seperti di atas dapat di!uat denan
dua cara. Cara yan pertama adalah denan menunakan te6t
editor dan menetik kode proram. Cara yan kedua adalah
denan menunakan 7et!eans *atisse "#$ 4uilder.
?akukan lankah-lankah !erikut ini untuk mem!uat proram
diatas menunakan te6t editor:
2. 4uka te6t editor kesayanan anda.
;. 5etikkan kode proram di !awah ini dan simpan denan nama
file ,ello9orld.'ava :
public class HelloWorld {
public HelloWorld(){ }
public void display(){
JFrame.setDefaultLookAndFeelDecorated(true);
JLabel label = new JLabel("HelloWorld");
JFrame frame = new JFrame();
frame.getContentPane().add(label);
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] str){
HelloWorld hello = new HelloWorld();
hello.display();
}
}
Melakukan kompilasi program HelloWorld
5ompilasi proram terse!ut denan cara men'alankan proram
'avac ('ava compiler). Jika anda !eker'a di linkunan windows
!uka command prompt& kemudian ketik proram !erikut ini :
c:\latihan> javac HelloWorld.java
Jika anda !eker'a di linkunan "7#/linu6& !uka console dan
ketikkan perintah !erikut ini :
shell$ javac HelloWorld.java
Menjalankan program HelloWorld
+roses kompilasi akan menhasilkan file yan !erekstensi .class&
file inilah yan akan kita eksekusi. Jika anda !eker'a di linkunan
windows lakukan perintah !erikut ini:
JAVA FOUNDATION CLASS | HALAMAN 5
c:\latihan> java HelloWorld
Jika anda !ekerka di linkunan "7#/?inu6 'alankan perintah
!erikut ini:
shell$ java HelloWorld
Membuat Swing HelloWorld dengan
Netbeans 6.1
7et!eans 0.2 dilenkapi denan "#$ !uilder yan dikenal denan
*atisse. (alam modul ini selan'utnya& *atisse akan diunakan
untuk menye!ut 7et!eans "#$ 4uilder. )ools ini sanat powerful
dan produktif dalam mem!uat komponen "#$. ?ankah-lankah
yan harus anda lakukan untuk mem!uat %win ,ello9orld
denan *atisse adalah se!aai !erikut:
2. 4uat pro'ect !aru dalam 7et!eans& caranya pilih menu :
File > New Project
;. ?ankah !erikutnya anda harus menentukan kateori pro'ect
yan akan anda !uat& caranya pilih :
General > Java Application
/nda akan di!awa ke dialo untuk menentukan nama pro'ect
dan folder dimana anda meletakkan pro'ect terse!ut& pilih
folder sesuai keininan anda.
<. 5lik kanan di pro'ect yan !aru anda !uat& popup menu akan
muncul& kemudian pilihlah menu :
New > JFrame Form...
5emudian masukkan nama class JFrame yan akan di!uat&
misalnya ,elloworld.'ava& klik finish.
=. )ampilan 7et!eans akan !eranti denan tampilan "#$
!uilder& dimana di sisi kanan akan terlihat %win +allet. 5lik
item ?a!el di %win +allet kemudian klik di atas JFrame&
se!uah J?a!el akan di!uat.
HALAMAN 6 | JAVA SWING
Jendela (esin dan +allete 7et!eans *atisse
@. #ntuk memenuhi tu'uan kita mem!uat %win ,ello9orld& kita
akan memasukkan strin 8,ello9orld: ke dalam J?a!el yan
!aru sa'a kita !uat. Caranya& do!el klik di atas J?a!el terse!ut&
kursor muncul !ersama te6t field dan ketikkan 8,elloworld:.
0. 5lik kanan di file ,ello9orld.'ava pada 'endela e6plorer di
se!elah kiri& pilih menu Run File... untuk mencompile dan
men'alankan class ,ello9orld.'ava atau tekan tom!ol %,$F) A
F0.
*atisse mempunyai sistem ?ayoutin yan sanat fleksi!le& sistem
layout yan diunakan oleh *atisse adalah "roup?ayout. (alam
chapter !erikutnya kita akan !ela'ar !aaimana menunakan
"roup?ayout ini denan !enar dan memanfaatkan keunulanya
dalam menata component "#$ denan sanat rapi.
%win helloworld ini hanya se!aian kecil sa'a dari peker'aan yan
harus dilakukan dalam mem!anun aplikasi desktop !er!asis Java.
%elan'utnya kita akan mem!ahas penunaan J?a!el& J4utton&
JCheck4o6& J)e6tField dan JBadio4utton untuk mem!uat aplikasi
"#$ sederhana denan menunakan *atisse.
KOMPONEN SWING | HALAMAN 7
Komponen Swing
%win toolkit menyediakan !anyak sekali komponen untuk
mem!anun aplikasi "#$ desktop. %win toolkit 'ua menyediakan
class-class untuk menanani interaksi antara aplikasi dan user
menunakan standard input seperti key!oard dan mouse.
5omponen-komponen yan disediakan swin mencakup semua "#$
toolkit yan laCim diunakan dalam apilasi desktop& seperti :
J)a!el& J?ist& J)ree& J4utton& J?a!el dan masih !anyak komponen-
komponen lainnya yan sudah teru'i dan siap pakai.
%elain komponen "#$& swin 'ua menyediakan fasilitas untuk
proses undo& komponen untuk menolah te6t& internationaliCation&
5omponen "#$ yan mendukun penyandan cacat (accessi!ility
support) dan fasilitas dra-and-drop.
?ook and Feel merupakan fasilitas yan unik dalam swin. (enan
fasilitas ?ook and Feel ini kita !isa denan mudah meru!ah
tampilan dari proram kita sesuai denan keininan dan tu'uan
kita. *isalnya& aar proram terlihat fancy atau aar proram
terlihat konsisten dalam seala keadaan.
%win 'ua menyediakan li!rary Java ;( untuk penolahan data
secara visual& seperti menolah am!ar& o!'ect ;(& !ahkan
animasi. %win?a!s.or menyediakan li!ary %win +ainter yan
merupakan penem!anan dari Java ;(& %win +ainter ini
memunkinkan aplikasi swin mempunyai tampilan yan indah dan
terlihat profesional.
Java 0.1 menam!ahkan !anyak sekali fitur-fitur !aru ke dalam
packae swin& termasuk dukunan untuk li!rary Dpen"?
menunakan JD"?& )ray $con dan 9e! %ervice. (enan adanya
dukunan ini swin men'adi le!ih poweful dan mempunyai masa
depan yan cerah.
Struktur Komponen Swing
%ecara arsitektur& %win di!anun diatas arsitektur /9) (/!stract
9indows )oolkit). /9) adalah "#$ toolkit yan dikem!ankan oleh
%un enineer se!elum swin muncul. 5elemahan utama /9)
adalah fleksi!ilitas tampilan "#$& seperti paintin method yan
masih sanat primitif.
%win dimaksudkan untuk memper!aiki kekuranan dari /9)
tanpa harus mem!uan teknoloi yan sudah di!uat dan mem!uat
HALAMAN 8 | JAVA SWING
"#$ toolkit !aru dari nol.
5omponen /9) diletakkan dalam satu packae yaitu 'ava.awt&
didalamnya terdapat komponen-komponen "#$ dasar& salah
satunya adalah Component. Class Component adalah moyan dari
se!aian !esar komponen /9) maupun %win. Check4o6& ?a!el&
4utton dan !e!erapa komponen /9) lainnya adalah turunan
lansun dari class Component. 7amun dalam kenyataanya
arsitektur demikian tidak mem!erikan fleksi!ilitas yan cukup
memadai untuk mem!uat !er!aai macam komponen !aru yan
di!utuhkan dalam desktop application.
%win muncul denan mem!awa teknoloi /9) yan telah
ditam!ahkan denan !anyak kemampuan. 7yaris semua komponen
"#$ dari swin merupakan turunan class Container dan class
Container adalah turunan dari class Component.
Bekerja dengan JLabel, JTextField dan
JButton
4eker'a denan komponen swin menunakan *atisse sanat
menyenankan dan mudah. "roup?ayout yan sanat fleksi!el
memunkinkan kita untuk mem!uat aplikasi denan tampilan
seperti yan kita harapkan.
?a!el& te6tfield dan tom!ol adalah komponen-komponen dasar yan
selalu ada dalam setiap aplikasi !er!asis desktop. 5etia komponen
ini mempunyai funsi yan sanat sederhana& te6tfield menyimpan
data !er!entuk te6t (strin) yan relatif pendek & la!el !anyak
diunakan untuk mem!erikan keteranan pen'elas terhadap
komponen lain dan tom!ol diunakan user untuk men'alankan satu
instruksi tertentu.
4erikut ini adalah contoh aplikasi sederhana yan melakukan
pen'umlahan dua !uah !ilanan.
Contoh proram menunakan J?a!el& J)e6tField dan J4utton
#ntuk mem!uat aplikasi ini menunakan *atisse& lakukan
lankah-lankah !erikut ini:
2. 4uat pro'ect !aru di 7et!eans (kalau sudah mem!uat pro'ect&
KOMPONEN SWING | HALAMAN 9
tidak perlu mem!uat lai) denan cara memilih menu :
File > New Project
5emudian ikuti petun'uk yan di!erikan dialo.
;. 4uat class JFrame !aru& caranya denan memilih menu :
File > New File
5emudian akan muncul dialo seperti di !awah ini :
Jendela dialo new file
<. +ilih kateori :
Java GUI Forms > JFrame Form
%eperti terlihat di dialo 7ew File dialo diatas& kemudian !eri
nama +en'umlahan.'ava
=. 4uat tampilan form seperti am!ar !awah ini& caranya denan
klik Jendela +allete di se!alah kanan untuk memilih komponen
apa yan akan di!uat& kemudian klik di 'endela (esin untuk
menempatkan komponen yan sudah dipilih tadi ke dalam
form. ,asilnya terlihat seperti pada am!ar di !awah ini:
Jendela desin 7et!ens *atisse
@. "anti nama setiap komponen aar mudah dikenali. 5lik kanan
diatas setiap komponen yan ada dalam Jendela (esin diatas&
kemudian pilih menu :
Jendela Design
menampilkan visualisasi
komponen GI!
Jendela Sour"e
menampilkan kode
program dari "lass #ang
sedang dibuka!
Jendela Swing $allete
berisikan komponen%
komponen swing #ang
bisa kita drag%and%drop
ke dalam jendela design!
Jendela $roperties
digunakan untuk
mengedit properti dari
komponen #ang sedang
akti& dalam jendela
design!
Jendela Inspe"tor
menampilkan semua
komponen swing dalam
"lass #ang sedang akti&
baik #ang keli'atan
se"ara visual di jendela
design atau tidak!
penting
HALAMAN 10 | JAVA SWING
Klik kanan > Change Variable Name ...
"anti nama komponen-komponen terse!ut (sesuai urutan dari
kiri ke kanan& atas ke !awah) men'adi : l!l5eteranan& t6t/&
l!l+lus& t6t4& !tn,itun& l!l,asil.
0. *enam!ahkan varia!le untuk menampun nilai yan akan
di'umlahkan. 5lik tom!ol %ource untuk mem!uka 'endela yan
menampilkan kode sum!er dari proram di atas kemudian
tam!ahkan kode di !awah ini tepat di!awah definisi dari class
+en'umlahan:
private String str = "Hasilnya adalah : ";
private int a, b;
3. *enanani penekanan tom!ol !tn,itun. 5lik kanan diatas
komponen !tn,itun kemudian pilih menu :
Events > Action > actionPerformed
/nda akan di!awa ke 'endela %ource& dan akan menemukan
kode proram seperti di !awah ini :
KOMPONEN SWING | HALAMAN 11
private void btnHitungActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
#!ah kode proram diatas men'adi :
private void btnHitungActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
a = Integer.parseInt(txtA.getText());
b = Integer.parseInt(txtB.getText());
int hasil = a + b;
lblHasil.setText(str + hasil);
}
E. Compile dan 'alankan proram. )ekan tom!ol %,$F) A F0& atau
klik kanan file +en'umlahan.'ava kemudian pilih menu Bun File.
Catatan :
*ethod $nteer.parse$nt diunakan untuk meru!ah %trin
men'adi $nteer.
*ethod !tn,itun/ction+erformed akan dipanil setiap kali
kita memencet tom!ol !tn,itun.
%ekaran anda !isa melihat !ahwa !eker'a denan J?a!el&
J)e6tField dan J4utton sanat sederhana. #ntuk latihan& silahkan
ru!ah funsi yan diunakan dalam proram diatas& misalnya
perkalian dua !ilanan atau penuranan dua !ilanan.
Bekerja dengan JCheckBox dan
JRadioButton
JCheck4o6 dan JBadio4utton hanya !isa mempunyai dua !uah
kemunkinan nilai& !enar atau salah. 5edua komponen ini
diunakan untuk merepresentasikan data yan !erupa pilihan.
JCheck4o6 diunakan 'ika pilihanya !erupa multiple selection&
sedankan JBadio4utton diunakan 'ika pilihanya !erupa sinle
selection.
JBadio4utton diunakan misalnya untuk merepresentasikan pilihan
'enis kelamin. JCheck4o6 diunakan misalnya untuk
merepresentasikan pilihan ho!!y.
4utton"roup diperlukan untuk menumpulkan JBadio4utton yan
mempunyai rup pilihan yan sama. *isalnya rup pilihan 'enis
kelamin diunakan untuk menumpulkan JBadio4utton yan
JC'e"k(o) dan
J*adio(utton sebaikn#a
digunakan 'an#a jika
item pili'an#a sedikit
dan tidak bersi&at
dinamis
penting
J+abel dan J,e)tField
mempun#ai met'od
get,e)t dan set,e)t
untuk mengambil dan
mengeset te)t #ang
ditampilkan!
penting
HALAMAN 12 | JAVA SWING
merepresentasikan pilihan laki-laki dan JBadio4utton yan
merepresentasikan pilihan perempuan dalam satu roup. Jika
JBadio4utton tidak diletakkan dalam satu roup& maka pilihan laki-
laki dan pilihan perempuan !isa dipilih !ersamaan.
%tatus dari JBadio4utton dan JCheck4o6 dapat diketahui denan
melihat nilai kem!alian dari method is%elected& 'ika dipilih maka
nilai kem!alian method is%elected adalah !enar& dan false 'ika
se!aliknya.
%etiap JBadio4utton dan JCheck4o6 mempunyai te6t yan
menerankan pilihan yan diwakilinya. *ethod et)e6t dan set)e6t
diunakan untuk memanipulasi te6t.
(i!awah ini adalah contoh proram yan menunakan JCheck4o6
dan JBadio4utton.
Contoh aplikasi menunakan JCheck4o6 dan JBadio4utton
(i !aian atas aplikasi ini& terdapat dua JBadio4utton untuk
merepresentasikan pilihan tipe warna& transparan atau !erwarna.
(i!awahnya terdapat pilihan warna yan dapat dipilih le!ih dari
satu !uah menunakan JCheck4o6.
#ntuk mem!uat proram diatas ikuti lankah-lankah !erikut ini:
2. 4uat class !aru !ertipe JFrame Form& kemudian !eri nama
+ilihan.'ava
;. 4uat tampilan diatas menunakan *atisse. komponen yan
harus di!uat adalah :
(ua o!'ect JBadio4utton : radio4erwarna dan
radio)ransparan.
%atu o!'ect 4utton"roup : roup)ipe9arna.
-mpat o!'ect JCheck4o6 : chk,i'au& chk4iru& chk*erah&
chk5unin.
%atu o!'ect J)e6t/rea : t6t9arna.
%atu o!'ect J%croll+ane : scroll9arna
KOMPONEN SWING | HALAMAN 13
#ntuk melihat semua komponen yan ada dalam Jendela
(esin& unakan Jendela $nspector di sisi kiri !awah.
<. *asukkan o!'ect radio4erwarna dan radio)ransparan ke dalam
o!'ect roup)ipe9arna. Caranya denan :
a) *emilih komponen radio4erwarna di Jendela (esin
!) 5lik ta! code di Jendela +roperties
c) +ilih properti : +ost-Creation Code
d) *asukkan kode !erikut ini kedalam dialo yan muncul :
groupTipeWarna.add(radioBerwarna);
?akukan lankah yan sama terhadap o!'ect radio)ransparan.
=. *enanani event ketika JBadio4utton diklik. Caranya denan :
a) *emilih komponen radio4erwarna di Jendela (esin
!) 5lik kanan komponen radio4erwarna& kemudian pilih menu:
Event > Action > actionPerformed
c) /nda akan di!awa ke dalam Jendela Code& dan menemukan
kode !erikut ini :
private void radioBerwarnaActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}
#!ahlah kode diatas men'adi :
private void radioBerwarnaActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
if(radioBerwarna.isSelected()){
lblTipeWarna.setText("Tipe warna : " +
radioBerwarna.getText());
}
}
?akukan lankah yan sama terhadap radio)ransparan.
@. 4uat se!uah private method untuk menanani event pemilihan
terhadap JCheck4o6. *ethod tampilkan9arna ini nantinya
akan dipanil setiap kali salah satu dari JCheck4o6 dipilih.
yan dilakukan oleh metod tampilkan9arna adalah menecek
status setiap JCheck4o6& apakah sedan dipilih atau tidak. Jika
sedan dipilih maka te6t dari JCheck4o6 terse!ut akan
ditampilkan dalam t6t9arna.
Class %trin4uffer diunakan untuk menampun nilai te6t dari
J*adio(utton #ang
mempun#ai group #ang
sama- 'arus dimasukkan
dalam sebua' obje"t
(uttonGroup #ang sama!
penting
HALAMAN 14 | JAVA SWING
JCheck4o6 yan statusnya terpilih.
private void tampilkanWarna(){
StringBuffer warna = new StringBuffer();
if(chkBiru.isSelected()){
warna.append(chkBiru.getText() + " ");
}
if(chkHijau.isSelected()){
warna.append(chkHijau.getText() + " ");
}
if(chkKuning.isSelected()){
warna.append(chkKuning.getText() + " ");
}
if(chkMerah.isSelected()){
warna.append(chkMerah.getText() + " ");
}
txtWarna.setText(warna.toString());
}
0. *enanani event pemilihan JCheck4o6. Caranya se!aai
!erikut :
a) +ilih komponen chk,i'au di Jendela (esin.
!) 5lik kanan komponen chk,i'au untuk memunculkan conte6t
(popup) menu.
c) +ilih menu :
Event > Action > actionPerformed
d) /nda akan di!awa ke Jendela Code& kemudian dalam
method chk,i'au/ction+erformed terse!ut panil method
tampilkan9arna. seperti di !awah ini :
private void chkHijauActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
tampilkanWarna();
}
?akukan hal ini untuk semua JCheck4o6.
3. Compile dan 'alankan proram denan menekan tom!ol %,$F)
A F0.
Cara lain dalam menampilkan pilihan adalah denan menunakan
J?ist dan JCom!o4o6. 5edua komponen ini mempunyai fleksi!ilitas
yan le!ih tini dan le!ih mudah diunakan 'ika o!'ect yan
dimasukkan dalam pilihan le!ih kompleks. J?ist dan JCom!o4o6
!isa mempunyai Component-ditor aar pilihan yan ditampilkan
tidak hanya !erupa te6t& !isa !erupa warna atau icon. 4aian
!erikutnya akan mem!ahas !aaimana !eker'a menunakan J?ist
Class String(u&&er
sangat dianjurkan untuk
digunakan sebagai "lass
untuk memanipulasi
String!
$enggabungan string
menggunakan operator .
sangat tidak dianjurkan-
apalagi jika ukuran
obje"t String%n#a suda'
"ukup besar!
penting
KOMPONEN SWING | HALAMAN 15
dan JCom!o4o6.
Bekerja dengan JList dan JComboBox
JCom!o4o6 memerlukan tempat yan minimalis di!andinkan
denan JBadio4utton& selain itu JCom!o4o6 mempunyai !entuk
Com!o4o6 yan dapat diedit& sehina memunkinkan user untuk
memilih pilihan yan tidak ada dalam item JCom!o4o6.
Contoh JCom!o4o6
J?ist memunkinkan multiple selection denan menekan tom!ol :
%,$F) A ?eft Click atau C)B? A ?eft Click. 5emampuan ini
mem!antu user 'ika harus melakukan multiple selection.
JCom!o4o6 dan J?ist sanat fleksi!el& kita dapat menam!ah dan
menhapus item di dalamnya denan sanat mudah. %ehina
cocok diunakan untuk merepresentasikan pilihan yan item
pilihannya !ersifat dinamis.
/plikasi di !awah ini adalah contoh penunaan JCom!o4o6 dan
J?ist.
Contoh proram menunakan JCom!o4o6 dan J?ist
4aian pertama proram ini terdapat se!uah JCom!o4o6 dan
J?a!el& setiap kali item di dalam JCom!o4o6 dipilih& J?a!el di
se!elahnya akan menampilkan item yan dipilih terse!ut.
JCombo(o) dan J+ist
digunakan jika item
pili'an bersi&at dinamis!
JCombo(o) dapat
mempun#ai bentuk #ang
dapat diedit se'ingga
user dapat memasukkan
pili'an #ang tidak ada
dalam da&tar!
J+ist dapat menerima
pili'an lebi' dari satu!
penting
HALAMAN 16 | JAVA SWING
4aian kedua proram ini terdapat se!uah J?ist dan J)e6t/rea.
%etiap kali item-item di dalam J?ist dipilih& J)e6t/rea akan
menampilkan item-item yan dipilih terse!ut dipisahkan denan
koma (&).
$kuti lankah-lankah !erikut ini untuk mem!uat proram di atas:
2. 4uatlah class JFrame Form !aru dan !eri nama
?ist/ndCom!o.'ava.
;. 4uat tampilan proram diatas menunakan *atisse& kemudian
tam!ahkan komponen-komponen:
a) -mpat !uah J?a!el : l!l+eker'aan& l!l+ilihan+eker'aan&
l!l,o!!y& l!l+ilihan,o!!y.
!) %atu !uah JCom!o4o6 : cm!+eker'aan
c) %atu !uah J?ist : lst,o!!y
d) %atu !uah Jte6t/rea : t6t+ilihan,o!!y
<. *eru!ah isi JCom!o4o6. #ntuk meru!ah isi dari JCom!o4o6
dan J?ist kita akan menunakan Jendela +roperties& Jendela
ini letaknya di se!elah kanan !awah& di!awah Jendela +allete
dan akan muncul hanya 'ika 'endela (esin yan dipilih.
Jendela +roperties
+ilih komponen JCom!o4o6 di Jendela (esin& Jendela
+roperties akan menampilkan properties dari JCom!o4o6.
+ada !aian model di dalam Jendela +roperties masukkan item
+ela'ar& *ahasiswa& +rorammer& )echnical 9riter dan )ester.
%etiap item dipisahkan denan koma (&).
=. *eru!ah isi J?ist. +ilih J?ist di Jendela (esin maka Jendela
+roperties untuk J?ist akan muncul. (i !aian model isikan
item : *em!aca& Dlahraa& )rekkin& Codin& *enonton Film&
4ersepeda dan *ena'ar. %etiap item dipisahkan denan koma
(&).
Jendela $roperties tidak
'an#a berisi properties
dari komponen swing
#ang sedang akti& tetapi
juga berisi ,ab /vents
dan ,ab Code!
,ab /vents digunakan
untuk memasukkan kode
#ang akan dieksekusi
ketika event tertentu
dikenakan ter'adap
komponen swing!
,ab Code digunakan
untuk mende&inisikan
kode apa #ang 'arus
dieksekusi dalam kondisi
tertentu- misaln#a
setela' obje"t komponen
swing diinisialisasi!
penting
KOMPONEN SWING | HALAMAN 17
@. *enanani pemilihan JCom!o4o6. 5lik kanan JCom!o4o6 di
Jendela (esin& kemudian pilih menu :
Events > Action > actionPerformed
Jendela Code akan ter!uka& tam!ahkan code seperti di !awah
ini :
private void cmbPekerjaanActionPerformed(
java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
lblPilihanPekerjaan.setText(
"Pekerjaan anda : " +
cmbPekerjaan.getSelectedItem());
}
method et%elected$tem dari JCom!o4o6 diunakan untuk
memperoleh item yan sedan di pilih dalam JCom!o4o6.
0. *enanani event pemilihan dari J?ist. -vent yan diunakan
untuk menanani pemilihan item dari J?ist !er!eda denan
JCom!o4o6. J?ist akan menaktifkan ?ist%election event ketika
user memilih item dalam J?ist. #ntuk menanani event ini&
lakukan lankah-lankah !erikut :
a) 5lik kanan pada J?ist di dalam Jendela (esin& kemudian
pilih menu :
Events > ListSelection > valueChanged
!) (alam 'endela kode yan ketik kode seperti !erikut ini :
HALAMAN 18 | JAVA SWING
private void lstHobbyValueChanged(
javax.swing.event.ListSelectionEvent evt) {
// TODO add your handling code here:
Object[] selectedItems =
lstHobby.getSelectedValues();
if(selectedItems == null ||
selectedItems.length == 0)
txtPilihanHobby.setText("");
else{
StringBuffer strValues = new
StringBuffer();
for(Object item : selectedItems){
strValues.append(item.toString() + ", ");
}
txtPilihanHobby.setText(
strValues.substring(0, strValues.length() -
2));
}
}
Catatan :
*ethod et%electedFalues dari J?ist menem!alikan item-item
yan terpilih.
Bekerja dengan Menu, Popup Menu dan
Toolbar
*enu& +opup menu dan )ool!ar diunakan untuk melakukan
naviasi dalam aplikasi. denan ketia komponen itu naviasi
dalam aplikasi men'adi le!ih fleksi!el dan mudah diunakan oleh
user. *enu dan )ool!ar pada umumnya diletakkan di !aian atas
dari aplikasi aar mudah ditemukan oleh user. %edankan +opup
*enu !isa muncul di mana sa'a sesuai denan konteks aplikasi.
J*enu4ar adalah class yan diunakan untuk menampun J*enu.
J*enu dapat menampun satu atau le!ih J*enu$tem. J*enu$tem
merupakan !aian terluar dari struktur menu yan tidak !isa
mempunyai child. J%eparatordiunakan untuk memisahkan antara
satu menu item dan menu item yan lain. Jika didalam menu
terdapat su! menu& unakan J*enu untuk menampun su! menu
terse!ut. %elain J*enu$tem& J*enu 'ua dapat menerima class
JCheck4o6*enu$tem dan JBadio4utton*enu$tem.
J+opup*enu mempunyai !anyak kesamaan di!andinkan denan
J*enu4ar. +er!edaan utamanya adalah : J*enu4ar hanya !isa
JMenu(ar dan J,ool(ar
'an#a bisa ditamba'kan
ke dalam JFrame!
JMenuItem adala'
struktur terluar dari
Menu #ang tidak bisa
mempun#ai "'ild!
J,ool(ar pada umumn#a
menampung J(utton
#ang diberi I"on dan
mempun#ai ba"kground
transparan!
penting
KOMPONEN SWING | HALAMAN 19
!erada di atas se!uah 'endela JFrame. %edankan J+opup*enu
!isa muncul di mana sa'a sesuai denan konteks dari aplikasi.
+er!edaan lainnya terletak di dalam penunaan umum keduanya.
J*enu4ar !erisikan menu/instruksi yan !ersifat umum dan
!erlaku untuk semua keadaan dalam aplikasi. %edankan
J+opup*enu akan mempunyai menu/instruksi yan !er!eda-!eda
!erdasarkan dari konteks aplikasi. Dleh karena itu J+opup*enu
terkadan dise!ut 'ua se!aai konteks menu.
)ool!ar mem!erikan cara yan le!ih praktis di!andinkan menu&
!ahkan !isa dikatakan !ahwa tool!ar adalah cara cepat untuk
menakses menu. Dleh karena itu& setiap item dalam
tool!ar!iasanya 'ua tersedia dalam menu. +ada umumnya tool!ar
diwakili hanya denan am!ar/icon yan melam!ankan perintah
dari tool!arnya. (i internet !anyak tersedia tool!ar icon ratis
yan dapat kita unakan.
4er!eda denan J*enu4ar dan J+opup*enu yan hanya !isa
menerima menu item& J)ool4ar dapat menampun J4utton atau
control lainya. %eperti contohnya : JCheck4o6& JBadio4utton&
Jtole4utton dan lainya. 7ormalnya& J)ool4ar akan diisi denan
J4utton yan dihilankan te6t-nya dan dianti denan icon. 5ita
'ua perlu meru!ah dekorasi J4utton aar tampilannya terlihat
cantik dan menarik.
Contoh proram denan *enu& +opup *enu dan )ool!ar
#ntuk mem!uat proram seperti di atas& ada !e!erapa tahap yan
perlu dilakukan. )ahap pertama adalah mem!uat *enu& yan
kedua adalah mem!uat +opup *enu dan yan ketia adalah
mem!uat )ool!ar.
Membuat Menu
4eker'a denan *enu dalam Java meli!atkan enam komponen
swin& antara lain :
2. J*enu4ar : Class yan menampun semua menu& hanya !isa
menampun J*enu se!aai child.
;. J*enu : Class yan mempunyai child menu item. 4iasanya
J*enu ini yan 'adi child lansun denan J*enu4ar
HALAMAN 20 | JAVA SWING
<. J*enu$tem : #'un dari menu& disinilah o!'ect /ction
diletakkan& sehina ketika kita memilih J*enu$tem ada action
tertentu yan di'alankan aplikasi.
=. JCheck4o6*enu$tem : #'un dari menu& namun !entuknya
le!ih mirip JCheck4o6.
@. JBadio4utton*enu$tem : #'un dari menu& namun !entuknya
le!ih mirip J4utton.
0. J%eparator : pemisah antar J*enu$tem atau antar J*enu
%etiap komponen menu mempunyai funsi dan keunaan masin-
masin. Jika kita perhatikan& menu dalam aplikasi umumnya
mempunyai shortcut untuk menakses menu tanpa menunakan
!antuan mouse. *isalnya menu File !iasanya dapat diakses
menunakan tom!ol /?) A F& menu Format dapat diakses denan
/?) A D. Fasilitas shortcut menu ini dise!ut se!aai 5ey!oard
*nemonic. File mempunyai mnemonic F& Format mempunyai
mnemonic o& dan seterusnya. +ada umumnya tampilan mnemonic
dari se!uah menu diwakili denan huruf yan !eraris !awah.
*atisse mempunyai fasilitas yan sanat D5 untuk !eker'a denan
*enu& fasilitas dra-and-dropnya mem!antu !anyak peker'aan
mem!anun aplikasi !ar!asis "#$ secara sinifikan.
(alam proram diatas kita akan mem!uat struktur menu se!aai
!erikut:
%truktur menu dari aplikasi
$kuti lankah-lankah !erikut ini untuk mem!uat struktur menu
seperti diatas:
2. 4uat se!uah class JFrame dan !eri nama )ool!ar*enu.'ava
;. *enam!ahkan J*enu4ar ke dalam JFrame. +ilih komponen
Jendela Inspe"tor akan
memperli'atkan semua
komponen swing baik
#ang terli'at atau tidak
terli'at dalam jendela
design!
Jendela Inspe"tor sangat
berguna ketika kita
bekerja dengan Menu!
$roses penamba'an-
pengurangan dan
pengaturan posisi menu
semua dilaksanakan dari
Jendela Inspe"tor
penting
KOMPONEN SWING | HALAMAN 21
*enu 4ar dari Jendela +allete kemudian klik JFrame di Jendela
(esin. %e!uah class J*enu4ar akan ditam!ahkan di dalam
JFrame. "anti namanya men'adi menu4ar.
<. *enam!ahkan J*enu ke dalam J*enu4ar. 5lik kanan
J*enu4ar yan !aru sa'a kita !uat di Jendela $nspector&
kemudian pilih menu :
Add > JMenu
"anti nama J*enu terse!ut men'adi menuFile. 5emudian
alihkan perhatian anda ke Jendela +roperties
Jendela +roperties dari class J*enu
$si properti te6t denan strin 8File:. 5emudian set isi properti
mnemonic denan strin 8f:& hal ini akan menye!a!kan
tampilanya menuFile men'adi File dan user dapat menekan
tom!ol /?) A F untuk menaktifkan menu menuFile.
=. *enam!ahkan J*enu$tem. ?ankah !erikutnya adalah
menam!ahkan J*enu$tem ke dalam J*enu menuFile yan
telah di!uat di lankah se!elumnya. caranya& klik kanan di
J*enu menuFile di Jendela $nspector& kemudian pilih menu :
Add > JMenuItem
)am!ahkan !erturut-turut menu7ew& menuDpen dan
menu%ave. +ilih J*enu$tem dari Jendela $nspector& kemudian
untuk masin-masin J*enu$tem set te6t dan mnemonic yan
sesuai dari Jendela +roperties.
@. *enam!ahkan J%eparator. (alam struktur menu yan !aus&
menu yan mempunyai funsi serupa diletakkan dalam urutan
!erderdekatan dan dipisahkan denan separator (pemisah).
?ankah menam!ahkan J%eparatortidak !er!eda denan
lankah menam!ahkan J*enu$tem& klik kanan di J*enu
menuFile kemudian pilih menu:
HALAMAN 22 | JAVA SWING
Add > JSeparator
0. *enam!ahkan J*enu. 4erikutnya kita akan menam!ahkan
J*enu !aru ke dalam J*enu menuFile. J*enu yan !aru ini
akan !ertindak se!aai su! menu. Caranya 'ua sama : klik
kanan di J*enu menuFile kemudian pilih menu :
Add > JMenu
4eri nama menu%ettin& set te6t dan mnemonic yan sesuai
pada Jendela +roperties.
3. *enam!ahkan JCheck4o6*enu$tem. +erilaku
JCheck4o6*enu$tem tidak !er!eda 'auh denan JCheck4o6
!iasa& !edanya hanyalah JCheck4o6*enu$tem !erada dalam
struktur menu. Cara menam!ahkan JCheck4o6*enu$tem sama
denan komponen lain : klik kanan J*enu menu%ettin
kemudian pilih menu :
Add > JCheckBoxMenuItem
4eri nama chk?ine7um!er& set te6t dan mnemonic yan sesuai
pada Jendela +roperties.
JCheck4o6*enu$tem sedikit sepesial di!andinkan denan
J*enu$tem& karena JCheck4o6*enu$tem memiliki properties
selected. +roperties selected ini diunakan untuk menentukan
apakah JCheck4o6*enu$tem dalam keadaan terpilih atau tidak.
E. *enam!ahkan JBadio4utton*enu$tem. (alam contoh ini kita
akan mempunyai dua !uah JBadio4utton*enu$tem& radio4inary
dan radio)e6t. 5eduanya di!uat denan lankah yan sama
denan komponen lain& klik kanan di J*enu menu%ettin&
kemudian pilih menu :
Add > JRadioButtonMenuItem
%et te6t dan mnemonic yan sesuai dari Jendela +roperties.
G. *enam!ahkan 4utton"roup. %eperti halnya JBadio4utton&
JBadio4utton*enu$tem 'ua memerlukan 4utton"roup aar
hanya satu !uah JBadio4utton*enu$tem yan !isa dipilih. Cara
menam!ahkan 4utton"roup sanat mudah& klik item
4utton"roup dari Jendela +allete kemudian klik Jendela (esin&
maka otomatis 4utton"roup akan ditam!ahkan. "anti namanya
men'adi roupDpen*ethod.
(alam Jendela $nspector& 4utton"roup yan !aru di!uat tadi
akan !erada dalam kateori Dther Components& seperti terlihat
dalam am!ar di !awah ini :
H
KOMPONEN SWING | HALAMAN 23
4utton"roup !erada dalam kateori Dther Components
21. *enam!ahkan JBadio4utton*enu$tem ke dalam 4utton"roup.
+ilih masin-masin JBadio4utton*enu$tem dari Jendela
$nspector& kemudian perahatikan Jendela +roperties dari
JBadio4utton*enu$tem terse!ut& pada !aian roup4utton
pilih item roupDpen*ethod& seperti terlihat dalam am!ar di
!awah ini :
+roperties dari JBadio4utton*enu$tem
22. Compile dan 'alankan class )ool!ar*enu.'ava. 5lik kanan class
)ool!ar*enu dari Jendela (esin kemudaian pilih menu Bun
File atau tekan tom!ol %,$F) A F0.
4eker'a denan *enu menunakan *atisse sanatlah
menyenankan dan produktif. ,al ini !er!eda sekali 'ika harus
menetik satu demi satu kode untuk menyusun struktur menu
seperti contoh proram diatas.
*em!uat +opup *enu menunakan *atisse 'ua sama
mudahnya. ,anya sa'a kita harus menentukan dimana dan denan
HALAMAN 24 | JAVA SWING
cara apa popup menu itu muncul& apakah denan penekanan
tom!ol tertentu dari key!oard atau ketika tom!ol mouse ditekan.
Membuat $opup Menu
+opup menu pada dasarnya tidak 'auh !er!eda di!andinkan
denan menu !iasa& hanya sa'a popup menu dapat muncul di mana
sa'a& tidak hanya di !aian atas JFrame seperti halnya J*enu4ar.
%elain itu kita harus menentukan kapan popup muncul& pada
umumnya popup akan muncul ketika user melakukan klik kanan
terhadap suatu komponen swin. *isalnya& ketika suatu ta!le di
klik kanan terdapat popup yan muncul& dan se!aainya.
+opup menu terutama diunakan se!aai 8conte6t sensitive menu:&
dimana menu yan ditampilkan oleh popup menu terantun
konteks dari aplikasi& semisal : komponen apa yan dikenai aksi
klik kanan& !aaimana keadaan data dalam komponen terse!ut dan
se!aainya.
/plikasi yan memerlukan interaksi yan sanat intens denan
user se!aiknya menunakan popup menu untuk memudahkan
user menakses action tertentu. ,al ini 'auh le!ih praktis
di!andin user harus menakses menu dalam J*enu4ar di !aian
atas JFrame.
+opup menu dalam contoh proram diatas akan muncul ketika user
melakukan klik kanan terhadap JFrame. menu yan ditampilkanya
pun hanya ada tia !uah: cut& copy dan paste.
$kuti lankah-lankah !eritkut ini untuk mem!uat +opup menu :
2. 4uka class )ool!ar*enu.'ava& yan telah di!uat dalam lankah
se!elumnya& dalam Jendela (esin.
;. 5lik Jendela +allete dan pilih J+opup*enu& kemudian klik
Jendela (esin. %ecara otomatis J+opup*enu akan
ditam!ahkan dalam class )ool!ar*enu.'ava. J+opup*enu tidak
terlihat dalam Jendela (esin& namun anda !isa menkasesnya
melalui Jendela $nspector.
<. *enam!ahkan J*enu$tem. %eperti halnya J*enu4ar&
J+opup*enu dapat memiliki child !erupa J*enu& J*enu$tem&
JCheck4o6*enu$tem& JBadio4utton*enu$tem dan J%eparator.
*enam!ahkan J*enu$tem ke dalam J+opup*enu sanat
sederhana& caranya : klik kanan pada J+opup*enu di Jendela
(esin& kemudian pilih menu :
Add > JMenuitem
"anti nama o!'ectnya men'adi menuCut& !eralihlah ke Jendela
+roperties kemudian set te6t dan mnemonic yan sesuai.
?akukan lankah ini untuk J*enu$tem yan lain& menuCopy
KOMPONEN SWING | HALAMAN 25
dan menu+aste.
=. *emunculkan J+opup*enu. 5etika tom!ol kanan mouse di klik
diatas JFrame& J+opup*enu akan tampil. /ar !ehavior
terse!ut !er'alan& kita perlu menanani event mouseClick
terhadap JFrame. Caranya :
a) 5lik kanan JFrame di Jendela (esin& kemudian pilih menu :
Events > Mouse > mouseClicked
!) (i dalam 'endela source yan ter!uka masukkan kode
!erikut ini :
private void formMouseClicked(
java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(evt.getButton() == MouseEvent.BUTTON3){
popUpMenu.show(
(Component)evt.getSource(),
evt.getX(),evt.getY());
}
}
5ondisi if diatas diunakan apakah tom!ol yan diklik
mouse adalah tom!ol se!elah kanan& 'ika nilai kem!alian
method et4utton sama denan nilai 4#))D7< maka !enar
tom!ol kanan yan ditekan.
*ethod show diunakan untuk memunculkan popup menu&
parameter pertama diisi denan Component dimana
nantinya popup menu akan ditampilkan& sedankan
parameter kedua dan ketia diisi denan letak koordinat
popup menu akan ditampilkan.
@. %impan file )ool!ar*enu.'ava& compile dan 'alankan. 5emudian
co!a munculkan popup menu denan menklik kanan JFrame.
+opup menu sanat !eruna 'ika aplikasi yan kita kem!ankan
mem!utuhkan interaksi yan intensif denan user. +opup menu
menyediakan cara mudah untuk menakses menu/action yan
sesuai denan konteks dari aplikasi.
Membuat ,oolbar
)ool!ar mem!erikan dimensi lain dalam menakses menu
d!andinkan menu ataupun popup menu. +ada umumnya )ool!ar
merupakan cara sinkat untuk menakses menu. *enu yan
diwakili tool!ar adalah menu yan !ersifat umum dan tidak terikat
pada konteks tertentu.
5eunaan lain dari tool!ar adalah mempercantik tampilan aplikasi&
karena tool!ar !iasanya adalah tom!ol yan didekorasi denan
HALAMAN 26 | JAVA SWING
icon yan menarik. %elain itu tool!ar 'ua mem!erikan kesempatan
kepada user untuk menkustomisasi tampilan dari aplikasi. 5arena
layout tool!ar sanat fleksi!el& user !isa memindah-mindahkan
letak tool!ar di dalam aplikasi& di atas& di!awah atau disampin&
atau !ahkan menam!an (floatin) diatas 'endela yan sedan
aktif.
(alam contoh proram diatas kita akan mem!uat se!uah J)ool4ar
denan dua !uah J4utton yan telah didekorasi denan icon cantik.
$con yan diunakan !anyak tersedia di internet& format file yan
dipilih adalah .pn& karena format file ini palin !aus dalam
menanani transparasi komponen.
%e!elum mulai mem!uat J)ool4ar& kita perlu mempersiapkan
terle!ih dahulu icon yan akan diunakan se!aai dekorasi
J4utton. $kuti lankah-lankah !erikut ini :
2. 4uatlah se!uah 'ava packae !aru untuk menampun semua
icon yan akan diunakan. caranya klik kanan di 'endela
+ro'ects !aian nama pro'ect& pilih menu :
New > Java Package
4eri nama imaes untuk 'ava packae yan !aru sa'a kita !uka.
;. *emasukkan $con ke dalam packae. #ntuk memasukkan
imae ke dalam packae kita perlu tahu dimana pro'ect
disimpan& misalkan pro'ect disimpan dalam folder :
c:\javaswing
4uka file e6plorer& kemudian naviasi ke folder
c:\javaswing\src\images
Copy semua icon yan diperlukan ke dalam folder diatas.
<. 4uild pro'ect. ?ankah ini diperlukan untuk mencompile
semua file .'ava men'adi file .class. %elain itu proses ini 'ua
akan menkopi file selain file .'ava (termasuk file icon) ke
dalam folder !uildHclasses. Jika proses ini tidak dilaksanakan&
maka ketika proram di'alankan& file icon tidak akan ditemukan
dan proram men'adi error .
%etelah proses persiapan selesai& lakukan lankah-lankah !erikut
ini untuk mem!uat )ool!ar :
2. 4uka class )ool!ar*enu.'ava yan sudah di!uat di lankah
se!elumnya.
;. 4uat se!uah o!'ect J)ool4ar& caranya : klik item J)ool4ar dari
Jendela +allete& kemudian klik JFrame di Jendela (esin.
%ecara otomatis se!uah o!'ect J)ool4ar akan dimasukkan ke
dalam JFrame. "anti namanya men'adi tool4ar.
(uild $roje"t akan
ber'asil jika tidak ada
satupun error dalam
kode program!
Sebelum melakukan
build proje"t pastikan
terlebi' da'ulu tidak ada
error dalam kode!
+akukan build setiap kali
menamba'kan &ile non%
java ke dalam &older
sour"e &ile! 0gar &ile
tersebut ikut ter"op# ke
dalam &older
build1"lasses
penting
KOMPONEN SWING | HALAMAN 27
<. *enam!ahkan J4utton dalam J)ool4ar. 5lik item J4utton dalam
Jendela +allete kemudian klik komponen J)ool4ar yan !aru
sa'a kita !uat tadi. J4utton !aru akan diletakkan diatas
J)ool4ar& anti nama J4utton terse!ut men'adi !tn7ew.
?etakkan lai satu !uah J4utton diatas J)ool4ar dan !eri nama
!tn*a6imiCe.
=. *endekorasi )ampilan J4utton. /ar tampilan J4utton terlihat
cantik& kita perlu meneset !e!erapa nilai dari properti
J4utton& seperti terlihat pada am!ar di !awah ini :
Jendela +roperties J4utton
a) )e6t& hapus nilai te6tnya.
!) 4order& pilih !ordernya men'adi empty !order dan set nilai
!ordernya men'adi I@&@&@&@J. )u'uan pem!erian empty
!order ini aar tom!ol !erukuran le!ih !esar di!andinkan
denan icon yan akan diunakan nanti& dan setiap mouse
melewati J4utton& ada efek transisi yan cantik.
#ntuk menedit !order dari J4utton& *atisse menyediakan
Jendela 4order untuk memilih !order yan kita ininkan
untuk J!utton. 4order yan dipilih !isa sinle !order& atau
composite !order yan terdiri dari !e!erapa !order.
HALAMAN 28 | JAVA SWING
Jendela 4order -ditor dari J4utton
c) DpaKue& uncheck nilai opaKue. 4ertu'uan aar tom!olnya
!erwarna transparan& sehina mempunyai warna
!ackround yan sama denan !ackround J)ool4ar.
d) $con& anti iconya denan icon yan telah disiapkan. #ntuk
memasukkan icon ke dalam J4utton& tekan tom!ol di
sampin pilihan $con di dalam Jendela +roperties& kemudian
akan muncul (ialo $con -ditor seperti di !awah ini :
Jendela icon editor
+ilih radio !utton Classpath& kemudian tekan tom!ol %elect
File dan pilih salah satu icon yan telah disiapkan. )ekan
D5. ?akukan lankah-lankah yan sama terhadap J4utton
yan lain.
@. Compile dan 'alankan class )ool!ar*enu untuk melihat
hasilnya.
KOMPONEN SWING | HALAMAN 29
Membuat Dialog dan JFileChooser
(ialo memerankan peran yan pentin dalam aplikasi !er!asis
desktop. $nteraksi antara user denan aplikasi terkadan tidak
!er'alan denan !aik karena user mem!erikan aksi yan tidak valid
kepada aplikasi. 5etika hal terse!ut ter'adi& aplikasi harus
mem!eritahukan kepada user apa yan telah ter'adi dan
!aaimana seharusnya user memper!aikinya. *odel interaksi
seperti ini tepat dilaksanakan menunakan dialo.
%kenario lain adalah ketika aplikasi memerlukan input dari user
aar aplikasi !isa terus melaksanakan tuasnya& misalnya meminta
konfirmasi apakah user yakin akan melaksanakan se!uah aksi
pentin terhadap aplikasi seperti delete& update atau add data.
(ialo 'ua mem!erikan pem!atasan kepada user& se!elum dialo
selesai diproses& user tidak akan !isa !erinteraksi denan !aian
aplikasi lainya. (ialo menceah hal ini ter'adi denan memastikan
!ahwa 'endela yan !isa diaktifkan hanyalah 'endela dialo&
sedankan 'endela aplikasi yan lain tidak dapat diaktifkan selama
'endela dialo masih aktif.
/plikasi sanat serin menunakan dialo untuk !erinteraksi
denan user& tetapi 'enis interaksinya selalu seraam dan !erulan-
HALAMAN 30 | JAVA SWING
ulan. %win menyediakan dialo yan didesin untuk keperluan
yan serin muncul dalam aplikasi& seperti JDption+ane dan
JFileChooser. %win 'ua menyediakan class J(ialo 'ika kita inin
mem!uat dialo custom sesuai keininan kita.
Membuat pre%de&ined dialog dengan J2ption$ane
JDption+ane menyediakan !e!erapa dialo yan siap pakai dan
serin diunakan dalam aplikasi. JDption+ane sanat memudahkan
kita dalam meminta user suatu input tertentu atau mem!eritahu
user apa yan ter'adi dalam aplikasi.
JDption+ane mempunyai !anyak static method untuk menampilkan
popup dialo denan mudah. )erdapat empat method utama yan
dapat kita unakan se!aai landasan mem!uat dialo. 5eempat
method terse!ut secara rinci diam!arkan dalam ta!le !erikut ini:
*ethod (eskripsi
showConfirm(ialo *eminta konfirmasi daru user& seperti yes/no/cancel
show$nput(ialo *eminta input dari user& !aik !erupa input te6t
menunakan J)e6tField maupun pilihan
menunakan JCom!o4o6
show*essae(ialo *em!eritahukan user tentan apa yan !aru sa'a
ter'adi
showDption(ialo "a!unan dari ketia 'enis dialo diatas
)a!le method JDption+ane
%win 'ua menyediakan method show$nternalLLL yan diunakan
'ika kita !eker'a denan J$nternalFrame.
+arameter dari keempat method terse!ut menikuti pola yan
konsisten. )erurut dari kiri ke kanan& !erikut ini parameter-
parameter yan !isa diterima oleh method-method dalam class
JDption+ane:
2. parentComponent
*endefisikan komponen yan akan men'adi parent dari dialo
!o6 ini. Frame dari parent component terse!ut akan men'adi
frame dari dialo dan dialo akan ditampilkan di tenah-tenah
parent component. Jika nilai dari parentComponent diset null&
maka dialo akan menunakan frame default dan dialo akan
diletakkan ditenah-tenah layar monitor (terantun ?MF).
;. messae
+esan yan deskriptif menerankan perihal dialo yan
muncul. +ada umumnya messae !erupa pesan %trin yan
akan diletakkan dalam dialo& namun 'enis o!'ect lain 'ua
dii'inkan diunakan se!aai messae. D!'ect-o!'ect yan
KOMPONEN SWING | HALAMAN 31
dii'inkan akan diperlakukan !er!eda& o!'ect-o!'ect terse!ut
antara lain
a) D!'ectIJ
%etiap o!'ect akan ditampilkan dalam dialo !erurut dari
atas ke !awah. /turan ini !erlaku rekursif untuk semua
o!'ect didalam array.
!) Component
Jika o!'ect yan dimasukkan se!aai messae !ertipe
Component& maka Component terse!ut akan ditampilkan
ditenah-tenah dialo.
c) $con
$con akan dimasukkan ke dalam se!uah J?a!el kemudian
ditampilkan di se!elah kiri dari dialo.
d) others
D!'ect lainya akan ditampilkan dalam dialo denan
menam!il nilai kem!alian dari method to%trin dari setiap
o!'ect.
<. messae)ype
*endefisikan 'enis dari pesan. +ada umumnya mem!erikan
custom icon untuk setiap 'enis pesan. %etiap ?MF manaer
akan memperlakukan setiap 'enis pesan denan !er!eda&
namun per!edaanya tidak akan terlalu mencolok. +ilihan yan
munkin dan icon yan mewakilinya adalah:
a) -BBDBN*-%%/"-
!) $7FDB*/)$D7N*-%%/"-
c) 9/B7$7"N*-%%/"-
d) +?/$7N*-%%/"- (tanpa icon)
=. option)ype
*endefisikan tom!ol-tom!ol yan akan ditampilkan di !aian
!awah dari dialo.
a) (-F/#?)ND+)$D7
!) >-%N7DND+)$D7
c) >-%N7DNC/7C-?ND+)$D7
d) D5NC/7C-?ND+)$D7
7amun kita tidak di!atasi untuk hanya menunakan empat
'enis set tom!ol diatas& kita dapat mendefisikan tom!ol-tom!ol
HALAMAN 32 | JAVA SWING
yan akan muncul sesuai ke!utuhan.
@. options
(eskripsi yan le!ih detail dari set tom!ol yan diunakan
dialo. 7ilai yan laCim adalah se!uah array %trin !erisi te6t
yan akan ditampilkan di setiap tom!ol. 7amun D!'ect lain
'ua dapat diterima& antara lain:
a) Component
Component akan diletakkan dalam !aris tom!ol secara
lansun.
!) $con
%e!uah J4utton akan di!uat dan didekorasi denan icon ini.
c) other
D!'ect denan tipe selainnya akan diru!ah ke dalam !entuk
%trin denan menam!il nilai kem!alian dari method
to%trin dari o!'ect terse!ut.
0. icon
$con yan diunakan untuk mendekorasi dialo. Jika icon ini
didefinisikan maka akan menimpa icon default yan
didefinisikan oleh messae)ype.
3. title
Judul dari dialo yan diletakkan di !aian palin atas dari
dialo.
E. initialFalue
7ilai default dari pilihan yan munkin ada dalam dialo.
#ntuk le!ih 'elasnya& !erikut ini !e!erapa contoh kode penunaan
JDption+ane !eserta hasil tampilanya :
JOptionPane.showMessageDialog(null,
"Simple plain dialog","Plain dialig",
JOptionPane.PLAIN_MESSAGE);

)ampilan dialo sederhana
KOMPONEN SWING | HALAMAN 33
JOptionPane.showMessageDialog(null,
"Your action was succeed, +
you can proceed to next assigment",
"Information dialog",
JOptionPane.INFORMATION_MESSAGE);
)ampilan dialo denan tipe dialo $nformation
JOptionPane.showMessageDialog(null,
"You neet to be sure to do this action!",
"Dialog Peringatan", JOptionPane.WARNING_MESSAGE);
(ialo denan tipe 9arnin
JOptionPane.showMessageDialog(null,
"Something goes wrong and generate error message",
"Error Dialog", JOptionPane.ERROR_MESSAGE);
(ialo denan tipe -rror
JOptionPane.showConfirmDialog(null,
"Choose yes or no","Confirmation Dialog",
JOptionPane.YES_NO_OPTION,
JoptionPane.WARNING_MESSAGE);

HALAMAN 34 | JAVA SWING
Dption dialo denan tipe $nformation dan pilihan >-%N7D
JOptionPane.showConfirmDialog(null,
"Choose yes, no or cancel","Confirmation Dialog",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.PLAIN_MESSAGE);

Dption(ialo
JOptionPane.showInputDialog(null,
"Input your name here","Input Dialog",
JOptionPane.INFORMATION_MESSAGE);

$nput(ialo denan tipe messae $nformation
String[] options = {"Apple","Mango","Grape","Guava"};
JOptionPane.showInputDialog(null,
"Choose this one Option","Input dialog",
JOptionPane.WARNING_MESSAGE,null,options,"Apple");
$nput(ialo dialo denan tipe 9arnin& Dptions !erupa array of
%trin dan initialFalue O ./pple.
KOMPONEN SWING | HALAMAN 35
Membuat JFileC'ooser
JFileChooser diunakan untuk !ernaviasi dalam file system&
kemudian memilih satu atau le!ih file atau folder dari list file dan
folder. JFileChooser pada dasarnya adalah penem!anan dari
dialo yan dapat diunakan untuk memilih file. JFileChooser dapat
diunakan se!aai dialo untuk menyimpan file atau untuk
mem!uka file.
JFileChooser hanya mem!erikan fasilitas untuk memilih file atau
folder& sedankan mekanisme untuk menyimpan atau mem!uka file
dilakukan sendiri menunakan li!rary $/D.
/plikasi !erikut ini adalah contoh penunaan JFileChooser untuk
mem!uka dan menyimpan file.
Contoh proram menunakan JFileChooser
)ampilan JFileChooser ketika tom!ol open ditekan adalah seperti di
!awah ini :
)ampilan JFileChooser
#ntuk mem!uat aplikasi diatas lakukan lankah-lankah !erikut ini
:
2. 4uat class JFrame Form !aru& !eri nama Chooser.'ava
;. *asukkan dua !uah J)e6tField : t6tDpen dan t6t%ave& dua !uah
HALAMAN 36 | JAVA SWING
J!utton : !tnDpen dan !tn save& se!uah J?a!el : l!l%tatus.
%esuaikan penataan komponen sesuai denan am!ar diatas.
<. )am!ahkan se!uah o!'ect JFileChooser se!aai field dari class
Chooser& !eri nama chooser.
public class Chooser{
JFileChooser chooser = new JFileChooser();
//kode lain di sini
}
=. File7ame-6tentionFilter diunakan se!aai file filter dalam
JFileChooser. *etode filterinnya adalah mencocokkan
ekstensi file dalam file system denan ekstensi yan ada dalam
File7ame-6tentionFilter. Contoh kode di !awah ini akan
menye!a!kan JFileChooser mempunyai pilihan 8J+-" File:& dan
'ika pilihan terse!ut dipilih& maka file denan ekstensi 8'p:&
8'pe:&:J+": atau8J+-": sa'a yan akan ditampilkan oleh
JFileChooser.
FileNameExtensionFilter JPEGFilter =
new FileNameExtensionFilter(
"JPEG File","jpg","jpeg",JPG,JPEG);
chooser.addChoosableFileFilter(JPEGFilter);
@. %et direktori yan akan ditu'u oleh JFileChooser. #ntuk
menetahui dimana direktori aktif aplikasi& kita !isa
menunakan system property 8user.dir:. 5ode !erikut ini akan
menye!a!kan JFileChooser di!uka pada direktori aktif
aplikasi :
String dir = System.getProperty("user.dir");
chooser.setCurrentDirectory(new File(dir));
0. *enhandle event penekanan tom!ol !tn%ave. 5etika tom!ol
!tn%ave ditekan& chooser akan menampilkan dialo save file&
kemudian menam!il nama file yan dipilih dan
menampilkannya dalam t6t%ave& serta menampilkanya dalam
l!l%tatus. 4erikut ini kodenya :
KOMPONEN SWING | HALAMAN 37
private void btnSaveActionPerformed(ActionEvent evt) {
// TODO add your handling code here:
int ret = chooser.showSaveDialog(this);
if(ret == JFileChooser.APPROVE_OPTION){
File f = chooser.getSelectedFile();
lblStatus.setText("Status : saving file" +
f.getAbsolutePath());
txtSave.setText(f.getAbsolutePath());
}
}
3. *enhandle penekanan tom!ol !tnDpen. 5ode untuk
menanani penekanan tom!ol !tnDpen mirip denan kode
untuk menanani penenakan tom!ol !tn%ave& per!edaanya
adalah !tnDpen akan menampilkan dialo open file& !erikit ini
kodenya :
private void btnBrowseActionPerformed(ActionEvent evt){
// TODO add your handling code here:
int ret = chooser.showOpenDialog(this);
if(ret == JFileChooser.APPROVE_OPTION){
File f = chooser.getSelectedFile();
lblStatus.setText("Status : opening file" +
f.getAbsolutePath());
txtOpen.setText(f.getAbsolutePath());
}
}
E. Compile dan 'alankan aplikasinya denan menekan tom!ol
%,$F) A F0
4eker'a denan JDption+ane dan denan JFileChooser sanat
sederhana. 5eduanya menunakan modal dialo untuk menam!il
input dari user. *odal dialo akan menceah user menakses
!aian aplikasi lain se!elum dialo ditutup& atau dalam hal ini
memutuskan pilihan apa yan diam!il oleh user.
*asih !anyak lai komponen swin yan disediakan oleh J(5& anda
tinal melan'utkan mem!aca dari referensi yan di!erikan modul
ini pada !aian akhir untuk melan'utkan pem!ela'aran anda
tentan Java desktop.
HALAMAN 38 | JAVA SWING
Konsep M3C
*FC adalah arsitektur aplikasi yan memisahkan kode-kode
aplikasi dalam tia lapisan& *odel& Fiew dan Control. *FC
termasuk dalam arsitektural desin pattern yan menhendaki
oranisasi kode yan terstruktur dan tidak !ercampur aduk. 5etika
aplikasi sudah sanat !esar dan menanani struktur data yan
kompleks& harus ada pemisahan yan 'elas antara domain model&
komponen view dan kontroler yan menatur penampilan model
dalam view.
/rsitektur *FC ini memunkinkan adanya peru!ahan dalam
domain model tanpa harus menu!ah code untuk menampilkan
domain model terse!ut. ,al ini sanat !ermanfaat ketika aplikasi
mempunyai domain model dan view komponen sanat !esar dan
kompleks.
(iaram interaksi antar komponen dalam arsitektur *FC
(9ikipedia.or)
*odel adalah representasi dari o!'ect yan sedan diolah oleh
aplikasi& dalam Java& model ini !iasanya direpresesentasikan
se!aai Java 4ean. Java 4ean adalah class Java !iasa atau +DJD
(+lain Dld Java D!'ect). %yarat se!uah +DJD dianap se!aai Java
4ean adalah :
2. *empunyai constructor default& constructor yan tidak
mempunyai parameter.
;. %emua field-field yan !isa diakses dilenkapi denan etter
dan setter method.
?e!ih 'elasnya lihat kode dari class +erson di !awah ini :
KONSEP MVC | HALAMAN 39
public class Person {
private int id;
private String name;
private String email;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setNama(String name) { this.name = name;}
//getter dan setter method untuk field lainnya di sini
}
5ode diatas adalah representasi *odel dalam Java untuk -ntity
+erson. 4e!erapa oran terkadan salah menartikan model ini
se!aai data akses domain. (imana data dari sum!er data&
misalnya data!ase& diam!il dan diolah. +ada hakekatnya *odel
adalah representasi data dari o!'ect se!enarnya& !ukan kumpulan
kode untuk menakses data dari data!ase.
+endekatan ter!aik adalah memisahkan kode untuk melakukan
akses sum!er data ke dalam lapisan tersendiri& lapisan ini !iasanya
dise!ut se!aai service. %ervice diimplementasikan dalam !entuk
class-class yan dise!ut se!aai manaer& misalnya %P?*anaer&
+rint*anaer& Beport*anaer& L*?*anaer& 9e!%ervice*anaer
dan seterusnya. (enan !eitu kode akan men'adi le!ih rapi dan
terstruktur. *anfaat palin terasa adalah kemudahan pencarian
kesalahan dan penam!ahan modul-modul !aru tidak harus
merom!ak seluruh struktur aplikasi.
Fiew adalah komponen untuk merepresentasikan *odel dalam
!entuk visual. %emisal komponen swin& seperti : J)a!le& J?ist&
JCom!o4o6 dan se!aainya. Fiew 'ua !ertanun 'awa! untuk
menankap interaksi user terhadap sistem& semisal : klik mouse&
penekanan tom!ol key!oard& !arcode scannin dan se!aainya.
Controller se!enarnya hanya sekumpulan kode-kode untuk
mensinkronisasi keadaan *odel dan Fiew. Jika ada peru!ahan data
dari *odel& Controller harus menupdate tampilan Fiew. (an
se!aliknya 'ika user mem!erikan event terhadap Fiew& Controller
harus menupdate *odel sesuai denan hasil interaksi user
terhadap Fiew.
Model dalam Komponen Swing
%e!aaian !esar komponen swin mempunyai model. J4utton
mempunyai model yaitu 4utton*odel yan memean .state. dari
J4utton Q apa key!oard mnemonicnya& apakah J4utton terse!ut
sedan dipilih atau tidak dan seterusnya. /da pula komponen
swin yan mempunyai le!ih dari satu model. J?ist mempunyai
HALAMAN 40 | JAVA SWING
?ist*odel yan memean isi dari J?ist dan ?ist%election*odel
untuk mencatat item J?ist yan sedan dipilih.
+ada !anyak kasus normal kita tidak perlu pusin memikirkan
model ini. %emisal kita tidak perlu memikirkan model dari J4utton
karena pada kasus umum kita tidak perlu memodifikasi model dari
J4utton.
?alu& kenapa model komponen swin di!uatR /lasan utamanya
adalah fleksi!ilitas untuk menentukan !aaimana data disimpan
dan diam!il dari komponen swin. *isalnya kita mempunyai
aplikasi spreadsheet yan menunakan komponen J)a!le&
karakteristik utama spreadsheet adalah !anyak cell yan koson&
denan !eitu kita !isa memilih model data yan sesuai denan
karakteristik terse!ut.
Contoh lainnya adalah J)a!le yan diunakan untuk menampilkan
data dari data!ase denan 'umlah !aris luar !iasa !anyak. 5ita !isa
menatur aar tampilan J)a!le di!uat halaman-per-halaman dalam
menampilkan !aris data& tidak semua data ditampilkan dalam satu
halaman& hal ini ditu'ukan untuk efisiensi dan mempertahankan
aar aplikasi tetap responsif walau !eker'a denan data yan
!esar.
*odel dalam komponen swin 'ua mempunyai keuntunan lain&
yaitu tidak perlu ada dua data terpisah& untuk struktur data aplikasi
dan untuk komponen swin.
5eunaan *odel yan cukup pentin 'ua adalah adanya konsep
event-listener& dimana 'ika ter'adi event peru!ahan data dalam
model& semua listener yan terdaftar dalam model terse!ut akan
di!eritahu dan tindakan yan tepat dapat diam!il untuk menanani
event yan muncul. %e!aai contoh& untuk menam!ahkan item
dalam J?ist kita !isa memanil method add$tem dari J?$st.
+enam!ahan item dalam J?ist ini akan menaki!atkan ?ist*odel
memicu event dalam J?ist dan listener lainnya. 5omponen swinS
dalam hal ini J?istSakan diupdate tampilanya untuk merefleksikan
peru!ahan item dalam ?ist*odel.
9alaupun terkadan !anyak yan menye!ut arsetektur komponen
swin se!aai *FC& tetapi pada dasarnya arsitektur komponen
swin tidak sepenuhnya *FC. 5omponen swin secara umum
di!uat aar Fiew dan Controller diletakkan dalam satu tempat
(class) yaitu class #$ yan disediakan oleh ?ook-and-Feel.
/rsitektur komponen swin le!ih tepat dise!ut se!aai 8/rsitektur
denan *odel yan terpisah:.
%elan'utnya kita akan mem!ahas !e!erapa model yan serinkali
harus kita kustomisasi sesuai denan ke!utuhan. %edankan model
yan nyaris tidak pernah kita ru!ahS4utton*odelStidak di!ahas
dalam !aian ini.
KONSEP MVC | HALAMAN 41
TableModel
)a!le*odel adalah class model yan palin serin dikustomisasi.
5arakteristik data dari J)a!le yan !er!entuk koleksi data dua
dimensi mem!utuhkan perhatian khusus aar efisien diunakan
dalam aplikasi. Jika kita tidak hati-hati& maka aplikasi kita !isa
men'adi sanat lam!at dan tidak efisien.
)a!le*odel adalah interface yan diunakan oleh J)a!le untuk
mendefinisikan ciri-ciri dari data ta!ular yan akan ditampilkan
oleh J)a!le. *isalnya : 'umlah kolom& nama kolom& class dari o!'ect
dalam kolom& 'umlah !aris dan nilai setiap cell. (enan adanya
data-data ini J)a!le dapat secara efisien menentukan !aaimana
menampilkan data terse!ut.
4erikut ini adalah kode untuk menampilkan koleksi o!'ect +erson.
Class /rray?istT+ersonU adalah implementasi dari enerics&
konsep dalam Java yan diunakan untuk mendefinisikan isi dari
koleksi. /rray?istT+ersonU artinya adalah mem!uat se!uah o!'ect
koleksi /rray?ist yan harus diisi oleh o!'ect +erson dan tidak !isa
diisi oleh o!'ect lainya& misalnya %trin.
public class PersonTableModel extends AbstractTableModel{
private List<Person> persons;
public PersonTableModel(List<Person> persons) {
this.persons = persons;
}
public int getRowCount() {
return persons.size();
}
public int getColumnCount() {
return 3;
}
public Object getValueAt(int rowIndex, int
columnIndex) {
Person p = persons.get(rowIndex);
switch(columnIndex){
case 0 : return p.getId();
case 1 : return p.getName();
case 2 : return p.getEmail();
default : return "";
}
}

HALAMAN 42 | JAVA SWING
@Override
public String getColumnName(int column) {
switch(column){
case 0 : return "ID";
case 1 : return "NAME";
case 2 : return "EMAIL";
default : return "";
}
}
}
>an perlu diperhatikan !ahwa dalam /!strac)a!le*odel& method
isCell-dita!le selalu menem!alikan nilai false& artinya semua cell
tidak dapat diedit. 5emudian method setFalue/t adalah method
koson !elaka& artinya 'ika kita memanil method ini tidak akan
ter'adi apa-apa.
Class kedua adalah (efault)a!le*odel yan telah
menimplementasi semua method a!stract dari interface
)a!le*odel. Bepresentasi data (efault)a!le*odel menunakan
dua 'enis data ta!ular& yaitu array dua dimensi& D!'ectIJIJ& dan
Fector dari Fector& FectorTFectorTD!'ectUU. Jika kita mempunyai
struktur data selain kedua 'enis terse!ut kita harus melakukan
konversi data ke dalam salah satu !entuk struktur data terse!ut.
Cara yan le!ih cerdas adalah mendefinisikan sendiri class yan
menimplement interface )a!le*odel seperti class
Customer)a!le*odel diatas.
%etelah )a!le*odel selesai didefinisikan kita tinal memanil
method set)a!le*odel dari o!'ect J)a!le& atau mem!uat o!'ect
J)a!le !aru menunakan constructor yan menerima arumen
)a!le*odel. Contohnya seperti potonan kode di !awah ini :
JTable table = new JTable(new DefaultTableModel());
JTable table1 = new JTable();
table1.setModel(new DefaultTableModel());
ListModel
J?ist adalah komponen swin yan mempunyai dua model
sekalius& ?ist*odel dan ?ist%election*odel. ?ist*odel diunakan
untuk mendefinisikan item/element yan dikandun oleh J?ist.
%edankan ?ist%election*odel diunakan untuk mendefinisikan
!aaimana representasi data 'ika ter'adi proses pemilihan di J?ist.
%eperti halnya )a!le*odel& ?ist*odel mempunyai dua class yan
menimplement ?ist*odel& /!stract?ist*odel dan
(efault?ist*odel. 5ita !isa menunakan salah satu dari tia tipe
KONSEP MVC | HALAMAN 43
terse!ut untuk mem!uat o!'ect ?ist*odel. Cara pertama denan
mem!uat class !aru yan menimplement ?ist*odel. Cara kedua
denan mem!uat class !aru yan mene6tends /!stract?ist*odel
dan cara ketia denan lansun menunakan (efault?ist*odel.
%truktur data J?ist tidak terlalu rumit seperti J)a!le& dan pada
umumnya& cukup hanya denan menunakan (efault?ist*odel
sudah memenuhi se!aaian !esar ke!utuhan penunaan J?ist.
4erikut ini contoh !aaimana mem!uat ?ist*odel untuk data
customer& contoh ini menunakan cara kedua untuk mem!uat
o!e'ct ?ist*odel& yaitu denan cara mem!uat class !aru yan
mene6tends /!stract?ist*odel :
public class CustomerListModel extends AbstractListModel{
private ArrayList<Person> customer =
new ArrayList<Person>();
public CustomerListModel(List<Person> cust){
customers.addAll(cust);
}
public Object getValueAt(int index) {
return customers.get(index);
}
public int getSize() { return customers.size(); }
}
$mplementasi ?ist*odel sanat mudah dan tidak serumit
)a!le*odel& namun implementasi dari ?ist%election*odel sanat
rumit& karena kita harus menimplementasi dua puluh !uah
method. ?e!ih !aik menunakan implementasi standard dari
?ist%election*odel yaitu (efault?ist%election*odel.
HALAMAN 44 | JAVA SWING
Menangani /vent
-vent dan ?istener adalah implementasi dari pattern D!server
dalam Java. +attern D!server sanat !eruna diunakan untuk
mendesin komunikasi yan konsisten antara o!'ect yan !erdiri
sendiri dan o!'ect-o!'ect yan !erantun padanya.
D!server desin pattern meli!atkan dua o!'ect utama& o!'ect
pertama !erlaku se!ai %u!'ect dan o!'ect lainya !erlaku se!aai
D!server. D!'ect %u!'ect merupakan pusat perhatian dari o!'ect
D!server& peru!ahan keadaan dari o!'ect %u!'ect selalu dipantau
oleh D!server.
D!server dapat melakukan reister-unreister terhadap %u!'ect.
Jika D!server tertarik denan perilaku dan keadaan dari %u!'ect&
D!server dapat mereister dirinya kepada %u!'ect. 4eitu 'ua
se!aliknya 'ika D!server tidak tertarik terhadap keadaan atau
perilaku %u!'ect& D!server tidak perlu melakukan resistrasi atau
kalau sudah terlan'ur reuister dapat melakukan unreister.
%u!'ect mempunyai !anyak aspek perilaku dan keadaan yan dapat
dipantau oleh D!server. #ntuk setiap aspek& %u!'ect menyediakan
method untuk reister-unreister dan menyediakan interface yan
harus diimplement oleh D!server yan inin memantau aspek
terse!ut.
+ada satu titik tertentu& %u!'ect akan mem!eritahu (notify)
D!server tentan perilaku atau keadaanya. %u!'ect akan
menumpulkan informasi tentan keadaan atau perilakunya
kemudian menirimkan pesan kepada D!server lewat interface
yan telah disepakati keduanya& pola ini dikenal 'ua se!ai -vent-
+assin.
+attern D!server dimaksudkan untuk menurani keterantunan
satu o!'ect terhadap o!'ect lain& istilah kerennya adalah
(ecouplin. (enan mekanisme reister-unreister& D!server
dapat secara le!ih leluasa memutuskan untuk memantau %u!'ect
tertentu atau tidak. *ekanisme notify memudahkan %u!'ect
mem!eritahu keadaan dan perilakunya kepada D!server yan
sedan memantaunya.
(i !aian !erikutnya kita akan melihat !aaimana pattern
D!server diimplementasikan dalam swin. /kan di'elaskan pula
!aaimana swin menimplementasikan mekanisme reister-
unreister dan notify dalam menanani interaksi user terhadap
komponen swin.
MENANGANI EVENT | HALAMAN 45
Event Listener dalam Swing
+attern D!server meli!atkan dua o!'ect %u!'ect dan D!server&
dalam swin D!server dikenal se!aai ?istener. 5emudian& ketika
%u!'ect akan mem!eritahu (notify) D!server tentan apa yan
sedan ter'adi dalam o!'ect %u!'ect& ada satu informasi yan akan
di-passin oleh %u!'ect ke D!server& informasi ini dise!ut se!aai
-vent o!'ect. %edankan ke'adian ketika %u!'ect melakukan notify
kepada D!server dise!ut se!aai -vent trierin.
/ar pen'elasan diatas mudah dipahami& kita akan mem!uat
aplikasi sederhana yan menimplementasikan pattern D!server.
/plikasi sederhana ini terdiri dari dua class utama yaitu %u!'ect
dan D!server.
Class %u!'ect akan men'alankan se!uah loop tanpa !atas& di dalam
loop terse!ut %u!'ect akan meminta input dari user !erupa se!uah
kata yan diakhiri denan penekanan enter. 5etika user menekan
enter& %u!'ect akan menotify D!server. (alam proses notifikasi
terse!ut& %u!'ect menumpulkan informasi tentan event
pemasukan kata oleh user& informasi terse!ut !erupa : kata apa
yan dimaksukkan dan o!'ect su!'ect dimana event pemasukan
kata terse!ut ter'adi (source). 5emudian D!server akan menerima
informasi dari %u!'ect dan mencetak informasi terse!ut ke
standard output. 4erikut ini tampilan dari aplikasi sederhana ini :
type a word : ifnu
print from observer : first observer
event from : subject observed
key presed is ifnu
%u!'ect akan mencetak strin 8type a word :: dan menunu user
untuk memasukkan satu kata dan menekan enter. *isalnya dalam
contoh diatas 8ifnu:. 5emudian %u!'ect akan menhimpun
informasi tentan sum!er event (%u!'ect itu sendiri) dan kata yan
diketikkan user (ifnu). %etelah itu& %u!'ect mem!eritahu (notify)
D!server !ahwa telah ter'adi event pemasukan kata denan
menyertakan informasi yan telah dihimpun %u!'ect.
D!server menerima informasi dari %u!'ect !ahwa telah ter'adi
event pemasukan kata oleh user& selan'utnya D!server akan
men'alankan tindakan-tindakan untuk menanani event terse!ut.
)indakan terse!ut adalah : mencetak informasi D!server& source&
dan kata yan dimasukkan oleh user.
(i dalam class %u!'ect terdapat field
2. 5oleksi D!server (listeners)
;. 7ama (name)
<. 5ata yan dimasukkan user (word-ntered)
5emudian ada 'ua method :
HALAMAN 46 | JAVA SWING
2. Constructor yan menerima parameter %trin& parameter ini
diunakan se!aai penenal (name) dari o!'ect %u!'ect.
;. Beister-unreister D!server (reister?istener&
remove?istener)
<. *ethod private untuk menotify D!server (trier?istener)
=. *ethod untuk menerima input kata dari user (run+roram)
4erikut ini kode lenkapnya :
public class Subject {
private Set<KeyboardPressedListener> listeners =
new HashSet<KeyboardPressedListener>();
private String wordEntered;
private String name;
public Subject(String subjectName){
name = subjectName;
}
public void runProgram(){
while(true){
Console c = System.console();
wordEntered = c.readLine("type a word : ");
if(wordEntered.equals("exit"))
break;
else
triggerListener();
}
}
private void triggerListener(){
KeyboardPressedEvent event =
new KeyboardPressedEvent();
event.setSource(this);
event.setWord(wordEntered);
for(KeyboardPressedListener l : listeners){
l.keyPressed(event);
}
}
public void registerObserver(
KeyboardPressedListener l){ listeners.add(l); }
public void removeObserver(
KeyboardPressedListener l){
listeners.remove(l);
}
public String toString(){ return name; }
}
$nterface 5ey!oard+ressed?istener diunakan se!aai 8kontrak:
antara %u!'ect dan D!server. $nterface ini men'amin !ahwa
D!server yan akan memantau event pemasukan kata dari user
dalam %u!'ect mempunyai method key+ressed. *ethod key+ressed
MENANGANI EVENT | HALAMAN 47
ini nanti yan akan dipanil oleh %u!'ect ketika event pemasukan
kata oleh user ter'adi di %u!'ect.
public interface KeyboardPressedListener {
public void keyPressed(KeyboardPressedEvent e);
}
Class D!server menimplement interface 5ey!oard+ressed?istener
dan nantinya akan didaftarkan ke su!'ect se!aai D!server.
*ethod key+ressed diimplementasikan denan mencetak informasi
yan diperoleh dari %u!'ect ke standard output.
public class Observer implements KeyboardPressedListener{
private String name;
public Observer(String name){ this.name = name; }
public void keyPressed(KeyboardPressedEvent e) {
System.out.println("print from observer : " +
name + "\n\tevent from : " + e.getSource()
+ "\n\tkey presed is " + e.getWord() );}}
Class 5ey!oard+ressed-vent adalah Java 4ean !iasa yan
menyimpan informasi ke'adian pemasukan kata oleh user&
didalamnya hanya ada field source dan word serta etter-setter
method untuk kedua field terse!ut.
public class KeyboardPressedEvent {
private Object source;
private String word;
public Object getSource() { return source; }
public void setSource(Object src) { source = src;}
public String getWord() { return word; }
public void setWord(String wrd) { word = wrd; }
}
%ampai disini& class-class diatas masih !erdiri sendiri dan !elum
ada class yan mempunyai method main. 7ah& disinilah kode class
*ainClass untuk menyatukan semua o!'ect diatas men'adi aplikasi
utuh.
HALAMAN 48 | JAVA SWING
public class MainClass {
public static void main(String[] str){
Subject subject =
new Subject("subject observed");
Observer observer =
new Observer("first observer");
subject.registerObserver(observer);
subject.runProgram();
}
}
?ankah-lankah dalam menunakan pattern D!server ini
adalah :
2. *em!uat o!'ect su!'ect dari class %u!'ect
Subject subject = new Subject("subject observed");
;. *em!uat o!'ect o!server dari class D!server
Observer observer = new Observer("first observer");
<. (aftarkan o!'ect o!server ke o!'ect su!'ect
subject.registerObserver(observer);
=. Jalankan proram utamanya
subject.runProgram();
+attern D!server ini diunakan secara intensif dalam komponen
swin. )erutama untuk menanani event dari input peripheralS
key!oard& mouse& !arcode readerSyan ter'adi di komponen swin
SJ)e6tField& J4utton& J)a!leS. (alam !aian-!aian selan'utnya
kita akan !ela'ar !aaimana menanani event pada komponen
swin.
ActionListener
/ction?istener diunakan untuk mendenarkan action dari event :
5lik terhadap J4utton
+emilihan menu item
+enekanan tom!ol enter dalam J)e6tField
*ethod dalam /ction?istener hanya satu yaitu action+erformed
yan menerima arumen o!'ect /ction-vent. /ction-vent !erisi
informasi-informasi pentin ketika /ction event ter'adi& termasuk
tom!ol modifiers apa yan sedan ditekan. )om!ol modifiers
antara lain : C)B?& /?)& *-)/ dan %,$F). *ethod untuk
menentukan tom!ol modifiers apa yan sedan aktif adalah
MENANGANI EVENT | HALAMAN 49
et*odifiers. *ethod et/ctionCommand diunakan untuk
menam!il command strin yan didefinisikan oleh J4utton.
(i !aian se!elumnya kita telah !eker'a menunakan komponen
swin& dan sudah !erlatih !aaimana menanani event klik mouse
terhadap J4utton. *ari kita lihat lai aplikasi sederhana !erikut :
Contoh aplikasi sederhana yan menanani event action-vent
pada J4utton
*enanani klik mouse pada J4utton dalam 7et!eans cukup denan
memilih J4utton di Jendela (esin kemudian klik kanan dan pilih
menu :
Events > Action > ActionPerformed
%etelah itu anda akan di!awa ke 'endela kode dan !aris !erikut ini
akan di!uat secara otomatis oleh 7et!eans :
private void btnHitungActionPerformed(
java.awt.event.ActionEvent evt) {
}
5emudian kita akan menempatkan kode untuk menanani
penekanan tom!ol di !aian !awah !aris //)D(D. %e!enarnya
7et!eans men-enerate !e!erapa lai kode di !aian yan tidak
dapat diedit& !erikut ini cuplikanya :
btnHitung.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt){
btnHitungActionPerformed(evt);
}
});
*ethod add/ction?isterner ini mempunyai funsi yan sama
denan method reister?istener pada class %u!'ect yan kita !ahas
di !aian se!elumnya. add/ction?isterner !erfunsi untuk
mendaftarkan D!server ke %u!'ect. +er!edaan ter!esar disini
adalah 7et!eans tidak mem!uat pu!lic class D!server !aru untuk
menimplementasi interface /ction?istener. )etapi 7et!eans
mem!uat anonymous innerclass yan menimplement interface
/ction?istener.
+erhatikan petikan kode !erikut ini :
HALAMAN 50 | JAVA SWING
new ActionListener() {
public void actionPerformed(ActionEvent evt){
btnHitungActionPerformed(evt);
}
>an dilakukan oleh kode diatas se!enarnya adalah:
2. *em!uat Class !aru yan tidak punya nama (anonymous)
;. Class !aru terse!ut turunan dari D!'ect dan menimplement
interface /ction?istener
<. *enimplementasi method a!strac action+erformed
=. *ethod action+erformed dari class tak !ernama ini akan
memanil method !tn,itun/ction+erformed dari class
parentnya.
%ecara umum 7et!eans akan mem!uat se!uah anonymous
innerclass seperti diatas untuk setiap penananan event. (ari sisi
kerapian kode metode ini sanat !aus& karena 7et!eans
menyem!unyikan kerumitan kode untuk menanani event seperti
diatas. 5ita tidak perlu susah-susah mem!uat se!uah pu!lic class
D!server tersendiri untuk menanani event. Cukup denan
anonymous innerclass.
KeyListener
5ey?istener akan mendenarkan penekanan tom!ol oleh komponen
yan !erada dalam keadaan fokus. %emua komponen swin dapat
menerima 5ey?istener se!aai D!server. 5ey?istener dapat
mendenarkan tia event !er!eda : penekanan tom!ol& pelepasan
tom!ol dan penetikan tom!ol. 5etianya ditanani oleh method
yan !er!eda-!eda& yaitu :
key+ressed : dipanil ketika ter'adi penekanan tom!ol
key!oard.
keyBeleased : dipanil ketika tom!ol key!oard dilepaskan.
key)yped : dipanil ketika tom!ol diketikkan& alias ditekan
kemudian dilepaskan. *ethod ini dipanil 'ika tom!ol yan
ditekan mempunyai representasi karakter unicode& seperti
tom!ol anka dan tom!ol huruf. %edankan penekanan tom!ol
modifiers seperti /?)& C)B?& /BBD9& C/+%?DC5& 7#*?DC5&
$7% dan lainnya tidak akan menaki!atkan method ini
dipanil.
5etia method diatas menerima parameter 5ey-vent. #ntuk
menetes tom!ol apakah yan ditekan oleh user& diunakan
method et5eyCode. 5emudian hasil kem!alian method
et5eyCode di!andinkan denan field static kepunyaan class
5ey-vent yan diawali denan huruf F5& seperti : F5N-7)-B&
F5N/& F5N4& F5N2& F5N?-F)N/BBD9 dan seterusnya.
MENANGANI EVENT | HALAMAN 51
*ethod et5eyChar diunakan untuk menentukan karakter apa
yan diwakili oleh tom!ol yan ditekan. Jika tom!ol yan ditekan
adalah tom!ol modifiers maka method et5eyChar akan
menem!alikan karakter 5ey-vent.C,/BN#7(-F$7-(.
/plikasi sederhana yan menanani penekanan tom!ol key!oard
#ntuk mem!uat aplikasi yan mendenarkan penekanan tom!ol
key!oard seperti diatas lakukan lankah-lankah !erikut ini :
2. 4uat class JFrame !aru& !eri nama Frame5ey+ressed.
;. )am!ahkan dua !uah J?a!el& !eri nama l!l%tatus dan
l!l5ey)yped.
<. l!l%tatus diunakan untuk menandakan adanya event
key+ressed dan keyBeleased yan ter'adi !erurutan
=. l!l5ey)yped diunakan untuk menandakan adanya tom!ol yan
diketik.
@. +ilih JFrame di Jendela (esin& klik kanan& dan pilih menu :
Events > Key > keyPressed
0. Jendela Code akan ter!uka& modifikasi method form5ey+ressed
men'adi seperti !erikut ini :
private void formKeyPressed(KeyEvent evt) {
// TODO add your handling code here:
if(evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED)
lblStatus.setText(
"Anda menekan tombol : CHAR_UNDEFINED");
else
lblStatus.setText("Anda menekan tombol : " +
evt.getKeyChar());
}
3. +ilih JFrame di Jendela (esin& klik kanan& dan pilih menu :
HALAMAN 52 | JAVA SWING
Events > Key > keyReleased
E. Jendela Code akan ter!uka& modfikasi method form5eyBeleased
men'adi seperti !erikut ini :
private void formKeyReleased(KeyEvent evt) {
// TODO add your handling code here:
if(evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED)
lblStatus.setText(
"Anda melepaskan tombol : CHAR_UNDEFINED");
else
lblStatus.setText("Anda melepaskan tombol : " +
evt.getKeyChar());
}
G. +ilih JFrame di Jendela (esin& klik kanan& dan pilih menu :
Events > Key > keyTyped
21. Jendela Code akan ter!uka& modfikasi method form5ey)yped
men'adi seperti !erikut ini :
private void formKeyTyped(KeyEvent evt) {
// TODO add your handling code here:
lblKeyType.setText("Anda mengetikkan tombol : " +
evt.getKeyChar());
}
MouseListener dan
MouseMotionListener
*ouse?istener mendenarkan interaksi mouse terhadap komponen
swin. *ouse?istener dapat didaftarkan pada semua komponen
swin. *ouse?istener mendenarkan event :
mouse+ressed : event ini ter'adi ketika user menekan salah
satu tom!ol mouse diatas komponen swin.
mouseBeleased : setelah tom!ol ditekan& komponen swin akan
menerima pelepasan tom!ol mouse. )etapi 'ika tom!ol mouse
dilepaskan pada saat pointer mouse tidak !erada diatas
komponen swin& maka event ini tidak akan ter'adi.
mouseClicked : event ini muncul ketika user melakukan click
tom!ol mouse diatas komponen swin.
mouse-ntered : ketika mouse memasuki area diatas komponen
swin& event ini akan dipicu.
mouse-6ited : muncul ketika mouse akan meninalkan area
diatas komponen swin
5etika user menekan tom!ol mouse (click)& event mouse+ressed
di!uat& kemudian mouseBeleased dan akhirnya mouseClicked
MENANGANI EVENT | HALAMAN 53
muncul terakhir.
*ouse*otion?istener 'ua dapat didaftarkan se!aai listener pada
semua komponen swin. *ouse*otion?istener dipisahkan dari
*ouse?istener karena penananan event mouse*ove yan le!ih
!erat dan intensif. *ouse*otion?istener mendenarkan dua
envent:
mouse*oved : ter'adi ketika user menerakkan mouse diatas
komponen swin
mouse(raed : ter'adi ketika user menekan tom!ol mouse
sekalius menerakkanya diatas komponen swin
%emua method diatas menerima arumen !erupa class
*ouse-vent. *ethod etClickCount diunakan untuk menentukan
'umlah click yan ter'adi dalam waktu yan !erdekatan. *ethod
etClickCount 'ua diunakan untuk menentukan apakah klik yan
ter'adi adalah sinle klik atau dou!le klik.
*ethod et4utton diunakan untuk menentukan tom!ol mana yan
ditekan oleh user. +ada umumnya mouse yan tersedia di pasaran
mempunyai tia tim!ol yan dapat di klik& tom!ol kiri& tom!ol
tenah dan tom!ol kanan. *ethod et4utton akan menem!alikan
nilai *ouse-vent.4#))D72 'ika tom!ol kiri ditekan&
*ouse-vent.4#))D7; 'ika tom!ol tenah ditekan dan
*ouse-vent.4#))D7< 'ika tom!ol kanan ditekan.
*ethod etL dan et> akan menem!alikan koordinat dimana
*ouse-vent ter'adi. 5oordinat yan diunakan adalah koordinat
relatif. 5oordinat (1&1) !erada di po'ok kiri atas dari komponen
swin& semakin ke!awah nilai > semakin !esar dan semakin ke
kanan nilai L semakin !esar. 7ilai koordinatnya dinyatakan dalam
satuan pi6el.
/plikasi di !awah ini adalah se!uah JFrame yan mempunyai
J?a!el di dalamnya. 5etika ter'adi event mouseClick dan
mouse*ove& J?a!el akan menampilkan dimana event terse!ut
ter'adi. Jika event klik yan muncul& maka te6t dari J?a!el akan
!erisi 8clicked at (6&y):& sedankan event move hanya akan
memunculkan koordinat 8(6&y): sa'a.
Contoh aplikasi sederhana yan menani *ouse-vent
?akukan lankah-lankah !erikut ini untuk mem!uat aplikasi
seperti diatas :
HALAMAN 54 | JAVA SWING
2. 4uat class JFrame !aru& !eri nama Frame*ouse*otion.
;. ?etakkan se!uah J?a!el !aru& !eri nama l!l%tatus.
<. +ilih JFrame di Jendela (esiner& klik kanan dan pilih menu :
Set Layout > Null Layout
?ankah ini !ertu'uan untuk mem!uat aar JFrame
menunakan null layout. 5alau tidak menunakan null layout
kita tidak !isa meletakkan J?a!el pada sem!aran posisi.
=. +ilih kem!ali JFrame& klik kanan dan pilih menu
Events > Mouse > mouseClicked
@. modifikasi kode pada Jendela Code yan tampil men'adi seperti
di !awah ini :
private void formMouseClicked(MouseEvent evt) {
lblStatus.setText("clicked at (" + evt.getX() +
"," + evt.getY() + ")");
lblStatus.setLocation(evt.getX(),evt.getY());
}
5ode diatas menanani penekanan tom!ol mouse& kemudian
menu!ah te6t J?a!el dan memindahkan J?a!el ke posisi
dimana event mouseClicked ter'adi.
0. +ilih JFrame lai di Jendela (esin& klik kanan dan pilih menu :
Events > MouseMotion > mouseMoved
3. *odifikasi kode yan muncul pada Jendela Code men'adi
seperti di !awah ini :
private void formMouseMoved(MouseEvent evt) {
lblStatus.setText("(" + evt.getX() + "," +
evt.getY() + ")");
lblStatus.setLocation(evt.getX(),evt.getY());
}
E. Compile dan 'alankan aplikasi di atas.
*asih !anyak lai -vent-?istener yan disediakan oleh J(5. (ari
!a! di atas kita sudah dapat menerti denan !aik konsep -vent-
?istener dan pattern D!server yan mendasarinya. (enan
kemampuan ini kita !isa denan mudah menerti !aaimana
event-listener yan lain !eker'a.
-vent-?istener 'ua dapat di'alankan terhadap Java 4ean
menunakan +ropertyChane?istener dan +roperty-vent. 5onsep
ini dapat diunakan untuk menamati peru!ahan pada field Java
4ean.
KONEKSI DATABASE DENGAN JDBC | HALAMAN 55
Koneksi Database Dengan
JD(C
Mengenal JDBC
Java (ata!ase Connectivity adalah /+$ yan diunakan Java untuk
melakukan koneksi denan aplikasi lain atau denan !er!aai
macam data!ase. J(4C memunkinkan kita untuk mem!uat
aplikasi Java yan melakukan tia hal: konek ke sum!er data&
menirimkan Kuery dan statement ke data!ase& menerima dan
menolah resultset yan diperoleh dari data!ase.
J(4C mempunyai empat komponen :
2. J(4C /+$
J(4C /+$ menyediakan metode akses yan sederhana ke
sum!er data relational (B(4*%) menunakan pemroraman
Java. denan menunakan J(4C /+$& kita !isa mem!uat
proram yan dapat meneksekusi %P?& menerima hasil
Besult%et& dan menu!ah data dalam data!ase. J(4C /+$ 'ua
mempunyai kemampuan untuk !erinteraksi denan linkunan
terdistri!usi dari 'enis sum!er data yan !er!eda-!eda.
J(4C /+$ adalah !aian dari Java +latform yan disertakan
dalam li!rary J(5 maupun JB-. J(4C /+$ sekaran ini sudah
mencapai versi =.1 yan disertakan dalan J(5 0.1. J(4C /+$
=.1 di!ai dalam dua packae yaitu : 'ava.sKl dan 'ava6.sKl.
;. J(4C (river *anaer
Class (river*anaer dari J(4C !ertuas untuk mendefisikan
o!'ect-o!'ect yan dapat diunakan untuk melakukan koneksi
ke se!uah sum!er data. %ecara tradisional (river*anaer
telah men'adi tulan punun arsitektur J(4C.
<. J(4C )est %uite
J(4C )est %uite mem!antu kita untuk mencara driver mana
yan cocok diunakan untuk melakukan se!uah koneksi ke
sum!er data tertentu. )es yan dilakukan tidak memerlukan
resource !esar ataupun tes yan komprehensif& namun cukup
tes-tes sederhana yan memastikan fitur-fitur pentin J(4C
dapat !er'alan denan lancar.
=. J(4C-D(4C 4ride
HALAMAN 56 | JAVA SWING
4rie ini menyediakan fasilitas J(4C untuk melakukan koneksi
ke sum!er data menunakan D(4C (Dpen (ata4ase
Connectivity) driver. %e!aai catatan& anda perlu meload driver
D(4C di setiap komputer client untuk dapat menunakan
!ride ini. %e!aai konsekuensinya& cara ini hanya cocok
dilakukan di linkunan intranet dimana isu instalasi tidak
men'adi masalah.
(enan keempat komponen yan dipunyainya& J(4C men'adi tools
yan dapat diandalkan untuk melakukan koneksi& menam!il data
dan meru!ah data dari !er!aai macam sum!er data. *odul ini
hanya akan mem!ahas dua komponen pertama dari keempat
komponen yan dipunyai oleh J(4C& yaitu J(4C /+$ dan
(river*anaer. %um!er data yan diunakan adalah Belational
(ata!ase.
Database Driver
J(4C memerlukan data!ase driver untuk melakukan koneksi ke
suatu sum!er data. (ata!ase driver ini !ersifat spesifik untuk
setiap 'enis sum!er data. (ata!ase driver !iasanya di!uat oleh
pihak pem!uat sum!er datanya& namun tidak 'aran 'ua
komunitas atau pihak ketia menyediakan data!ase driver untuk
se!uah sum!er data tertentu.
+erlu dipahami sekali lai !ahwa data!ase driver !ersifat spesifik
untuk setiap 'enis sum!er data. *isalnya& (ata!ase (river *y%Kl
hanya !isa diunakan untuk melakukan koneksi ke data!ase *y%Kl
dan !eitu 'ua data!ase driver untuk +ostre %P? 'ua hanya !isa
diunakan untuk melakukan koneksi ke data!ase +ostre %P?.
(ata!ase driver untuk setiap (4*% pada umumnya dapat
didownload dari we!site pem!uat (4*% terse!ut. 4e!erapa
vendor (4*% menye!ut (ata!ase driver ini denan se!utan Java
Connector (J/Connector). (ata!ase driver !iasanya di!unkus
dalam file yan !erekstensi 'ar. %etiap data!ase driver harus
menimplement interface 'ava.sKl.(river.
Membuat Koneksi
*elakukan koneksi ke data!ase meli!atkan dua lankah: *eload
driver dan mem!uat koneksi itu sendiri. Cara meload driver sanat
mudah& pertama letakkan file 'ar data!ase driver ke dalam
classpath. 5emudian load driver denan menam!ahkan kode
!erikut ini:
KONEKSI DATABASE DENGAN JDBC | HALAMAN 57
Class.forName(com.mysql.jdbc.Driver);
7ama class data!ase driver untuk setiap (4*% !er!eda& anda !isa
menemukan nama class terse!ut dalam dokumentasi driver
data!ase yan anda unakan. (alam contoh ini& nama class
data!ase driver dari *y%Kl adalah com.mysKl.'d!c.(river.
*emanil method Class.for7ame secara otomatis mem!uat
instance dari data!ase driver& class (river*anaer secara otomatis
'ua dipanil untuk menelola class data!ase driver ini. Jadi anda
tidak perlu menunakan statement new untuk mem!uat instance
dari class data!ase driver terse!ut.
?ankah !erikutnya adalah mem!uat koneksi ke data!ase
menunakan data!ase driver yan sudah diload tadi. Class
(river*anaer !eker'a sama denan interface (river untuk
menelola driver-driver yan diload oleh aplikasi& 'adi dalam satu
sesi anda !isa meload !e!erapa data!ase driver yan !er!eda.
5etika kita !enar-!enar melakukan koneksi& J(4C )est %uite akan
melakukan serankaian tes untuk menentukan driver mana yan
akan diunakan. +arameter yan diunakan untuk menentukan
driver yan sesuai adalah #B?. /plikasi yan akan melakukan
koneksi ke data!ase menyediakan #B? penenal dari server
data!se terse!ut. %e!aai contoh adalah #B? yan diunakan
untuk melakukan koneksi ke *y%Kl :
jdbc:mysql://[host]:[port]/[schema]
contoh konkritnya :
jdbc:mysql://localhost:3306/latihan
%etiap vendor (4*% akan menyertakan cara untuk menentukan
#B? ini di dalam dokumentasi. /nda tinal mem!aca dokumentasi
terse!ut tanpa harus khawatir tidak menemukan informasi yan
anda perlukan.
*ethod (river*anaer.etConnection !ertuas untuk mem!uat
koneksi:
Connection conn =
DriverManager.getConnection(
jdbc:mysql://localhost:3306/latihan);
(alam ke!anyakan kasus anda 'ua harus memasukkan parameter
username dan password untuk dapat melakukan koneksi ke dalam
data!ase. *ethod etConnection menerima #sername se!aai
parameter kedua dan pasword se!aai parameter ketia& sehina
kode diatas dapat diru!ah men'adi :
HALAMAN 58 | JAVA SWING
Connection conn =
DriverManager.getConnection(
jdbc:mysql://localhost:3306/latihan,
root,);
Jika salah satu dari driver yan diload !erhasil diunakan untuk
melakukan koneksi denan #B? terse!ut& maka koneksi ke
data!ase !erhasil dilaksanakan. Class Connection akan memean
informasi koneksi ke data!ase yan didefinisikan oleh #B?
terse!ut.
%etelah sukses melakukan koneksi ke data!ase& kita dapat
menam!il data dari data!ase menunakan perintah Kuery
ataupun melakukan peru!ahan terhadap data!ase. !aian !erikut
ini akan menerankan !aaimana cara menam!il dan
memanipulasi data dari data!ase.
Mengambil dan Memanipulasi Data dari
Database
+roses penam!ilan data dari data!ase memerlukan suatu class
untuk menampun data yan !erhasil diam!il& class terse!ut harus
menimplement interface Besult%et.
D!'ect yan !ertipe Besult%et dapat mempunyai level
funsionalitas yan !er!eda& hal ini terantun dari tipe dari
result set. ?evel funsionalitas dari setiap tipe result set di!edakan
!erdasarkan dua area:
(enan cara !aaimana result set itu dapat dimanipulasi
4aaimana result set itu menanani peru!ahan data yan
dilakukan oleh proses lain secara !ersamaan (concurrent).
J(4C menyediakan tia tipe result set untuk tu'uan !er!eda:
2. )>+-NFDB9/B(ND7?> : result set terse!ut tidak !isa !er'alan
mundur& reslut set hanya !isa !er'alan ma'u dari !aris pertama
hina !aris terakhir. result set hanya menam!arkan
keadaan data ketika Kuery di'alankan atau ketika data diterima
oleh resul set. Jika setelah itu ada peru!ahan data dalam
data!ase& result set tidak akan diupdate alias tidak ada
peru!ahan dalam result set tipe ini.
;. )>+-N%CBD??N$7%-7%$)$F- : result set dapat !er'alan ma'u
mundur. result set dapat !er'alan ma'u dari row pertama
hina terakhir atau !ererak !e!as !erdasarkan posisi relatif
atau a!solute.
KONEKSI DATABASE DENGAN JDBC | HALAMAN 59
<. )>+-N%CBD??N%-7%$)$F- : result set dapat !er'alan ma'u
mundur. result set dapat !er'alan ma'u dari row pertama
hina terakhir atau !ererak !e!as !erdasarkan posisi relatif
atau a!solute.
$nstance dari o!'ect !ertipe Besult%et diperlukan untuk
menampun hasil kem!alian data dari data!ase. %e!elum kita !isa
memperoleh instance dari Besult%et& kita harus mem!uat instance
dari class %tatement. Class %tatement mempunyai method
e6ecutePuery yan diunakan untuk men'alankan perintah Kuery
dalam data!ase kemudian menem!alikan data hasil eksekusi
Kuery ke dalam o!'ect Besult%et.
4erikut ini adalah contoh kode untuk mem!uat instance class
%tatement& kemudian men'alankan Kuery untuk menam!il data
dari data!ase yan hasilnya dipean oleh Besult%et :
Statement statement =
conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResulSet rs =
statement.executeQuery(select * from Customers);
Besult%et akan meletakkan kursornya (posisi pem!acaan !aris) di
se!uah posisi se!elum !aris pertama. #ntuk menerakkan kursor
ma'u& mundur& ke suatu posisi relatif atau ke suatu posisi a!solute
tertentu& unakan method-method dari Besult%et:
ne6t() -- menarahkan kursor ma'u satu !aris.
previous() -- menarahkan kursor mundur satu !aris.
first() -- menarahkan kursor ke !aris pertama.
last() -- menarahkan kursor ke !aris terakhir.
!eforeFirst() -- menarahkan kursor ke se!elum !aris pertama.
after?ast() -- menarahkan kursor ke setelah !aris terakhir.
relative(int rows) -- menarahkan kursor relatif dari posisinya
yan sekaran. %et nilai rows denan nilai positif untuk ma'u&
dan nilai neatif untuk mundur.
a!solute(int row7um!er) Q menarahkan kursor ke posisi
tertentu sesuai denan nilai row7um!er& dan tentu sa'a
nilainya harus positif.
$nterface Besult%et menyediakan method etter untuk menakses
nilai dari setiap kolom dalam !aris yan sedan aktif. +arameter
funsi etter !isa menerima nilai inde6 dari kolom ataupun nama
kolomnya. 7amun !eitu& penunaan nilai inde6 le!ih efisien
di!andin menunakan nama kolom.
HALAMAN 60 | JAVA SWING
7ilai inde6 dimulai denan satu hina !anyaknya kolom.
+enunaan nama kolom adalah case insensitive& artinya huruf
kecil atau huruf !esar tidak men'adi masalah.
et%trin diunakan untuk menam!il kolom denan tiper data
char& varchar atau tipe data strin lainya. et$nt diunakan untuk
menam!il kolom denan tipe data inteer.
4erikut ini dalah contoh proram lenkap dari melakukan koneksi
hina menam!il data dari data!ase.
Class.forName(com.mysql.jdbc.Driver);
Connection conn =
DriverManager.getConnection(
jdbc:mysql://localhost:3306/latihan,
root,);
Statement statement =
conn.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResulSet rs =
statement.executeQuery(select * from Customers);
while(rs.next()){
System.out.println(rs.getInt(id));
System.out.println(rs.getString(Nama));
}
*ethod e6ecutePuery hanya dapat men'alankan perintah %P?
select& unakan method e6ecute#pdate untuk men'alankan
perintah insert& update dan delete. ,asil dari eksekusi insert&
update dan delete tidak menem!alikan result set& tetapi
menem!alikan se!uah nilai inteer yan merepresentasikan
status hasil eksekusi method e6ecute#pdate.
4erikut ini contoh insert& update dan delete :
result = statement.executeUpdate(
"update Customers set nama ='roby' where
nama='andy'");
result = statement.executeUpdate(
"delete Customers where nama='andy'");
*enunakan e6ecutePuery dan e6ecute#pdate sanat mudah dan
fleksi!le& namun sanat tidak efisien& +repared%tatement
menawarkan keunulan dalam !entuk efisiensi.
Menggunakan PreparedStatement
*emanil method e6ecute#pdate !erulan-ulan& misalnya
melakukan insert ratusan atau ri!uan !aris& sanat tidak efisien.
KONEKSI DATABASE DENGAN JDBC | HALAMAN 61
,al ini dise!a!kan karena (4*% harus memproses setiap Kuery
yan dikirimkan dalam !e!erapa lankah: memparsin Kuery&
mencompile Kuery dan kemudian !aru meneksekusi Kuery
terse!ut.
+repared%tatement menawarkan solusi yan le!ih !aik dalam
menanani keadaan terse!ut. +repared%tatement menyaratkan
Kuery yan akan dieksekusi didefinisikan terle!ih dahulu ketika
+repared%tatement di!uat. 5emudian Kuery terse!ut dikirimkan ke
dalam data!ase untuk dicompile terle!ih dahulu se!elum
diunakan. 5onsekuensinya& +repared%tatement !ukan hanya
mempunyai Kuery& tetapi mempunyai Kuery yan sudah dicompile.
5etika +repared%tatement di'alankan& (4*% tidak perlu
melakukan kompilasi ulan terhadap Kuery yan di'alankan
+repared%tatement. ,al inilah yan menye!a!kan
+repared%tatement 'auh le!ih efisien di!andinkan menunakan
method %tatement.e6ecute#pdate.
4erikut ini contoh pem!uatan +repared%tatement menunakan
class Connection yan telah di!uat se!elumnya :
PreparedStatement ps = conn.prepareStatement(
update T_PERSON set name = ? where name = ?);
+erhatikan tanda R yan ada dalam Kuery diatas& tanda R dise!ut
se!aai parameter. 5ita !isa mem!erikan nilai yan !er!eda ke
dalam parameter dalam setiap pemanilan +repared%tatement.
*ethod set%trin& setFloat& set$nt dan !e!erapa method lain
diunakan untuk memasukkan nilai dari setiap parameter. *ethod
terse!ut mempunyai dua parameter& parameter pertama adalah int
yan diunakan untuk menentukan parameter +repared%tatement
mana yan akan di!eri nilai. +arameter kedua adalah nilai yan
akan dimasukkan ke dalam +repared%tatement& tipe data dari
parameter kedua terantun dari method yan diunakan.
4erdasarkan kode diatas& !erikut ini contoh penunaan method
+repared%tatement.set%trin :
ps.setString(1,andy);
ps.setString(2,rizal);
5ode diatas mem!erikan contoh !aaimana memasukkan nilai ke
dalam parameter +repared%tatement. 4aris pertama memasukkan
%trin 8andy: ke dalam parameter pertama dan !aris kedua
memasukkan %trin 8riCal: ke parameter kedua. %ehina
pemanilan Kuery oleh +repared%tatement !erdasarkan kode
diatas sama denan Kuery statement di !awah ini :
update T_PERSON set name = 'andy' where name = 'rizal'
4erikut ini contoh lenkap penunaan +repared%tatement untuk
melakukan update dan insert data :
HALAMAN 62 | JAVA SWING
PreparedStatement pInsert = conn.prepareStatement(
"insert into Person(name) values(?)");
pInsert.setString(1,"dian");
pInsert.executeUpdate();
PreparedStatement pUpdate = conn.prepareStatement(
"update Person set name=? where name=?");
pUpdate.setString(1,"andry");
pUpdate.setString(2,"andri");
pUpdate.executeUpdate();
(alam contoh diatas& insert dan update data hanya dilaksanakan
sekali sa'a& hal ini tidak mem!erikan am!aran yan tepat untuk
melihat keunulan +repared%tatement di!andinkan
%tatement.e6ecute#pdate.
Batch Execution
*isalnya kita inin men-insert seratus !aris data dalam se!uah
loop& kita !isa menunakan fasilitas !atc e6ecution dari
+repared%tatement. !atch e6ecution menumpulkan semua
eksekusi proram yan akan dilaksanakan& setelah semuanya
terkumpul !atch e6ecution kemudian menirimkan kumpulan
eksekusi proram secara !ersamaan ke (4*% dalam satu
kesatuan. *etode ini sanat efisien karena menurani overhead
yan diperlukan proram untuk !erkomunikasi denan (4*%.
(alam contoh di !awah ini kita akan menunakan !atch e6ecution
untuk melakukan insert data se!anyak seratus kali.
PreparedStatement pInsert = conn.prepareStatement(
"insert into Person(nama) values(?)");
for(int i=0;i<100;i++){
pInsert.setString(1,"user ke " + i);
pInsert.addBatch();
}
pInsert.executeBatch();
%etiap kali iterasi& method set%trin dipanil untuk menisikan
se!uah strin ke dalam +repared%tatement& kemudian method
add4atch dipanil untuk menumpulkan !atch dalam satu wadah.
%etelah iterasi selesai& method e6ecute4atch dipanil untuk
melaksanakan semua keseratus instruksi insert secara !erurut
denan sekali sa'a melaksanakan koneksi ke data!ase.
Menangani Transaction
(ukunan transaction oleh J(4C terantun denan (ata!asenya&
KONEKSI DATABASE DENGAN JDBC | HALAMAN 63
karena ada data!ase yan mendukun transaction dan ada pula
data!ase yan tidak mendukun transaction. *y%P? mendukun
transaction 'ika kita menunakan $nno(4 se!aai sistem ta!lenya&
kalau kita menunakan *y$%/* maka transaction tidak
didukun.
)ransaction merupakan konsep pentin dari data!ase. )ransaction
memastikan peru!ahan data dilaksanakan denan kaidah /C$(
(/tomicity& Consistency& $solation& (ura!ility). 5aidah ini
memastikan semua proses peru!ahan data !er'alan secara !enar&
'ika ada yan salah maka semua peru!ahan dalam satu kesatuan
loika harus di!atalkan (roll!ack).
*ari kita evaluasi kode diatas aar menunakan transaction&
sehina 'ika satu proses insert aal& maka semua insert yan
dilaksanakan se!elumnya akan di!atalkan :
try{
connection.setAutoCommit(false);
PreparedStatement pInsert = conn.prepareStatement(
"insert into Person(nama) values(?)");
for(int i=0;i<100;i++){
pInsert.setString(1,"user ke " + i);
pInsert.addBatch();
}
pInsert.executeBatch();
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException ex) {
try{
connection.rollback();
}catch(SQLException e){
}
}
DAO dan Service Pattern
/kses terhadap data!ase merupakan !aian yan sanat pentin
dari aplikasi data!ase. +enunaan pattern yan sesuai dapat
mem!erikan manfaat sanat !esar. +attern yan serin diunakan
dalam akses data!ase adalah (/D ((ata /ccess D!'ect) dan
%ervice/Facade pattern.
5edua pattern ini diunakan untuk menerapkan 8separation of
concern: atau pemisahan kode proram !erdasarkan funsi kode
proram. %emua kode untuk akses data harus dipisahkan denan
kode untuk penaturan user inteface. ,al ini memunkinkan kode
akses data yan di!uat untuk aplikasi desktop& denan mudah
HALAMAN 64 | JAVA SWING
diunakan untuk aplikasi we!.
+enerapan konsep separation of concern secara disiplin& dapat
menhasilkan kode proram yan dapat dites secara otomatis
menunakan J#nit atau (4#nit. #nit testin merupakan
paramater utama dalam menentukan apakah kode proram yan
kita hasilkan mempunyai mutu yan tini atau tidak. Coverae
unit testin yan tini mencerminkan kode proram yan
!erkualitas tini pula.
(ao pattern !erisi semua kode untuk menakses data& seperti
Kuery. %emua kode yan sepesifik terhadap implementasi akses
data !erhenti di sini& lapisan le!ih atas tidak !oleh tahu !aaimana
akses data diterapkan& apakah menunakan J(4C murni atau
,i!ernate atau J+/. ?apisan lainya hanya perlu tahu funsionalitas
dari suatu method di dalam (/D class& tidak perlu tahu !aimana
method terse!ut diimplementasikan. Class (/D akan mempunyai
method seperti save& delete& et4y$d atau et/ll. +raktek yan
laCim diunakan adalah satu !uah -ntity/)a!le akan mempunyai
satu !uah class (/D.
(i !awah ini adalah contoh Class (/D menunakan J(4C untuk
ta!le )NC/)-"DB> :
KONEKSI DATABASE DENGAN JDBC | HALAMAN 65
public class CategoryDaoJdbc {
private Connection connection;
private PreparedStatement insertStatement;
private PreparedStatement updateStatement;
private PreparedStatement deleteStatement;
private PreparedStatement getByIdStatement;
private PreparedStatement getAllStatement;
private final String insertQuery =
"insert into T_CATEGORY(name,description)" +
" values(?,?)";
private final String updateQuery =
"update T_CATEGORY set name=?, description=? " +
" where id=?";
private final String deleteQuery =
"delete from T_CATEGORY where id=?";
private final String getByIdQuery =
"select * from T_CATEGORY where id =?";
private final String getAllQuery =
"select * from T_CATEGORY";
public void setConnection(Connection connection) {
try {
this.connection = connection;
insertStatement =
this.connection.prepareStatement(
insertQuery,Statement.RETURN_GENERATED_KEYS);
HALAMAN 66 | JAVA SWING
updateStatement =
this.connection.prepareStatement(
updateQuery);
deleteStatement =
this.connection.prepareStatement(
deleteQuery);
getByIdStatement =
this.connection.prepareStatement(
getByIdQuery);
getAllStatement =
this.connection.prepareStatement(
getAllQuery);
} catch (SQLException ex) {
}
}
public void save(Category category) {
try {
if (category.getId() == null) {
insertStatement.setString(1,
KONEKSI DATABASE DENGAN JDBC | HALAMAN 67
category.getName());
insertStatement.setString(2,
category.getDescription());
int id = insertStatement.executeUpdate();
category.setId(id);
} else {
updateStatement.setString(1,
category.getName());
updateStatement.setString(2,
category.getDescription());
updateStatement.setInt(3, category.getId());
updateStatement.executeUpdate();
}
} catch (SQLException ex) {
}
}
public void delete(Category category) {
try {
deleteStatement.setInt(1, category.getId());
deleteStatement.executeUpdate();
} catch (SQLException ex) {
}
}
public Category getById(Long id) {
try {
getByIdStatement.setLong(1, id);
ResultSet rs = getByIdStatement.executeQuery();
//proses mapping dari relational ke object
if (rs.next()) {
Category category = new Category();
category.setId(rs.getInt("id"));
category.setName(rs.getString("name"));
category.setDescription(
rs.getString("description"));
return category;
}
} catch (SQLException ex) {
}
return null;
}
public List<Category> getAll() {
try {
List<Category> categories =
new ArrayList<Category>();
HALAMAN 68 | JAVA SWING
ResultSet rs = getAllStatement.executeQuery();
while(rs.next()){
Category category = new Category();
category.setId(rs.getInt("id"));
category.setName(rs.getString("name"));
category.setDescription(
rs.getString("description"));
categories.add(category);
}
return categories;
} catch (SQLException ex) {
}
return null;
}
}
%ervice pattern diunakan utamanya untuk menyederhanakan
class-class (/D yan ada& misalnya kita mempunyai @1 !uah ta!le
maka laCimnya akan ada @1 !uah class (/D. Class (/D terse!ut
perlu disederhanakan& caranya adalah denan menelompokkan
class-class (/D dalam satu modul aplikasi ke class %ervice.
*isalnya (/D yan !erhu!unan denan user manaement ke
dalam class #ser%ervice.
)ransaction diatur dalam class %ervice& praktek yan laCim
diunakan adalah satu method dalam class service adalah satu
scoop transaction. Jadi ketika method dalam service mulai
dieksekusi transaction akan dimulai (!ein)& ketika method akan
!erakhir& transaction akan dicommit.
4erikut ini adalah contoh class %ervice :
KONEKSI DATABASE DENGAN JDBC | HALAMAN 69
public class ServiceJdbc {
private CategoryDaoJdbc categoryDao;
private Connection connection;

public void setDataSource(DataSource dataSource){
try {
connection = dataSource.getConnection();
categoryDao = new CategoryDaoJdbc();
categoryDao.setConnection(connection);
} catch (SQLException ex) {
}
}

public void save(Category category){
try {
connection.setAutoCommit(false);
categoryDao.save(category);
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException ex) {
try{
connection.rollback();
}catch(SQLException e){
}
}
}
public void delete(Category category){
try {
connection.setAutoCommit(false);
categoryDao.save(category);
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException ex) {
try{
connection.rollback();
}catch(SQLException e){
}
}
}

public Category getGroup(Long id){
return categoryDao.getById(id);
}

public List<Category> getGroups(){
HALAMAN 70 | JAVA SWING
return categoryDao.getAll();
}
}
%etelah class (/D dan service !erhasil di!uat& mari kita lihat
!aaimana cara menunakannya :
public class MainJdbc {
public static void main(String[] args) {
MysqlDataSource dataSource =
new MysqlDataSource();
dataSource.setUser("root");
dataSource.setPassword("admin");
dataSource.setDatabaseName("latihan");
dataSource.setServerName("localhost");
dataSource.setPortNumber(1527);

ServiceJdbc service = new ServiceJdbc();
service.setDataSource(dataSource);

Category category = new Category();
category.setName("administrator");
service.save(category);

System.out.println("id : " + category.getId());
System.out.println("name : " +
category.getName());

try {
dataSource.getConnection().close();
} catch (SQLException ex) {
}
}
}
%etelah menenal J(4C& kita akan mem!ahas cara menakses
data!ase yan le!ih !aik denan manunakan J+/. (enan
menunakan J+/ kode proram yan akan di!uat akan le!ih
rinkas dan terlihat konsep DD+ di!andin denan J(4C murni.
J+/ adalah framework DB* untuk memetakan ta!el dalam
data!ase dan class dalam konsep DD+. (enan menunakan J+/
kode proram kita akan le!ih rapi dan terlihat DD+.
JAVA PERSISTENCE API (JPA) | HALAMAN 71
Java $ersisten"e 0$I 4J$05
,ampir semua aplikasi !isnis menunakan data!ase. 5onsep
data!ase relasional sudah populer 'auh se!elum konsep o!'ect-
oriented diunakan oran. Dleh karena itu& apapun !ahasa
pemroraman yan kita unakan& menunakan data!ase adalah
suatu keniscayaan.
(alam interaksi kita denan data!ase& ada !e!erapa masalah yan
umum kita temukan& diantaranya
per!edaan dialek %P? antar merek data!ase
per!edaan konsep relasional dan o!'ect-oriented
peninkatan kiner'a (performance)
+ada !uku ini kita akan mem!ahas tentan framework yan dise!ut
D!'ect/Belational *appin (DB*). J+/ termasuk framework dalam
kateori DB*. (enan kita menunakan DB*& maka !anyak
masalah umum di atas yan dapat diselesaikan tanpa kita harus
mem!uat solusi sendiri.
*ari kita ela!orasi.
$erbedaan dialek S6+
*asin-masin vendor data!ase !erusaha mempertahankan
pelanannya denan cara mem!uat nilai tam!ah di produk
mereka& yan mem!edakan produknya denan produk pesain.
7ilai tam!ah ini tentunya di!erikan dalam !entuk fitur-fitur
canih yan dimiliki data!ase. 5arena antarmuka utama data!ase
dan user (dalam hal ini prorammer) adalah perintah %P?& maka
kita sekaran melihat !anyak sekali per!edaan %P? antar merek
data!ase. 4ahkan untuk kasus sederhana sa'a& menam!il 21 !aris
pertama dari hasil Kuery& para vendor data!ase ini tidak !isa
sepakat.
+er!edaan ini sanat menyulitkan !ila kita inin mem!uat produk
aplikasi. #ntuk men'ankau pasar yan luas& produk kita harus !isa
diunakan di !er!aai kondisi dan konfiurasi. 5ita harus !isa
mendukun pelanan yan menunakan +ostre%P? maupun
Dracle. +er!edaan dialek %P? menye!a!kan kita harus
meneluarkan !iaya tam!ahan untuk mendukun !er!aai 'enis
data!ase.
Framework DB* men'em!atani antara kode proram denan %P?.
5ita tidak lai men'alankan %P? sesuai merek data!ase& tapi kita
menunakan Puery ?anuae yan disediakan DB*. 4ila suatu
HALAMAN 72 | JAVA SWING
saat kita inin menanti data!ase& kita cukup menkonfiurasi
DB* untuk !eranti dialek.
$erbedaan konsep relasional dan obje"t%oriented
Cara !erpikir kita dalam mendesain struktur ta!el data!ase sanat
!er!eda denan paradima yan kita unakan pada waktu
mendesain struktur o!'ek aplikasi kita. *ari kita lihat !e!erapa
konsep !erikut:
eKuality
inheritance
relationship
5onsep eKuality mem!ahas !aaimana kita menyatakan !ahwa
o!'ect a sama denan o!'ect b. (i dalam !ahasa Java& kedua o!'ect
dinyatakan sama 'ika !erada dalam lokasi memori yan sama&
sehina !isa di!andinkan denan operator OO. %elain itu& kita
'ua !isa mem!uat definisi kita sendiri tentan kesamaan denan
cara men-override method eKuals.
(i data!ase& suatu record dise!ut sama denan record lainnya !ila
kedua record memiliki nilai primary key yan sama dan tersimpan
dalam ta!el yan sama.
4ahasa pemroraman !erorientasi o!'ek seperti Java menenal
konsep inheritance. (enan konsep ini& !anyak teknik
pemroraman canih yan !isa dilakukan. 5onsep ini tidak ada di
data!ase.
Belasi di kode Java ditentukan oleh method yan kita sediakan
untuk naviasi. %e!aai contoh& !ila satu Cateory memiliki !anyak
/rticle di dalamnya& ada !e!erapa kemunkinan yan !isa
dilakukan:
class Cateory !isa melihat semua /rticle dan se!aliknya& /rticle
tahu dalam Cateory apa dia !erada
public class Category {
public List<Article> articles;
}
public class Article {
private Category category;
}
class /rticle tahu tentan Cateory& tapi Cateory !isa melihat
/rticle yan ada di dalamnya
JAVA PERSISTENCE API (JPA) | HALAMAN 73
public class Category {
}
public class Article {
private Category category;
}
class Cateory !isa melihat isi /rticle& tapi /rticle tidak tahu
Cateory tempat dia disimpan.
public class Category {
public List<Article> articles;
}
public class Article {
}
(ata!ase tidak menenal konsep naviasi. 4ila kita punya struktur
data!ase seperti ini:
create table Category (
id INT,
name VARCHAR
);
create table Article (
id INT,
category_id INT,
title VARCHAR
);
*aka kita !isa mendapatkan !aik /rticle maupun Cateory denan
Kuery seperti ini
select * from Article where category_id = ?
DB* men'em!atani per!edaan ini& sehina kita !isa mem!uat
kode proram denan le!ih rapi.
$eningkatan kinerja
/da !anyak hal yan !isa kita lakukan untuk menoptimasi akses
data!ase& diantaranya:
data!ase connection poolin
laCy-loadin
deferred %P?
menurani hit ke data!ase
Kuery result cache
#rusan connect/disconnect dari data!ase merupakan urusan yan
rumit. 4anyak lankah yan terli!at di sana& misalnya inisialisasi
koneksi& proses otentikasi& dan se!aainya.
HALAMAN 74 | JAVA SWING
/plikasi !esar !iasanya menoptimasi urusan connect/disconnect
ini denan menunakan teknik connection poolin. +ada waktu
dinyalakan& aplikasi lansun mem!uat !anyak koneksi sekalius
(pool). 4ila ada kode proram yan inin menunakan koneksi
untuk men'alankan %P?& maka koneksi diam!il dari pool dan
di!erikan. %etelah selesai men'alankan %P?& koneksi tidak ditutup&
melainkan dikem!alikan ke pool. (enan cara ini& overhead proses
connect/disconnect dapat dikurani.
(enan menunakan DB*& semua koneksi data!ase diatur di satu
tempat& sehina menu!ah konfiurasi dari koneksi !iasa men'adi
connection-poolin tidak !erpenaruh !esar terhadap keseluruhan
kode proram.
)idak semua data yan kita am!il dari data!ase akan diunakan.
5adankala se!aian !esar data yan diam!il akan di!uan.
)entunya ini mem!oroskan ker'a C+#& penunaan memori& dan
'ua !andwidth. 4e!erapa DB* mendukun fitur laCy-loadin&
yaitu menam!il data kalau !enar-!enar diperlukan.
4ila aplikasi kita menunakan DB*& perintah %P? ke data!ase
dieksekusi oleh DB*& !ukan oleh kode proram kita. 5arena itu&
DB* memiliki ke!e!asan untuk men'alankan %P? kapan sa'a& asal
tidak menacaukan aplikasi kita. 5e!e!asan ini diunakan oleh
DB* untuk menunda dan menumpulkan eksekusi %P?& sehina
!isa di'alankan secara efisien.
+ada aplikasi !esar& umumnya application server dan data!ase
server diinstal di mesin yan !er!eda. #ntuk menaksesnya
diunakan akses melalui 'arinan (network). Dleh karena itu& akses
ke data!ase harus diperhitunkan denan teliti& aar tidak terlalu
!anyak perintah atau data yan 8menye!erani: 'arinan. DB*
senantiasa !erusaha menurani komunikasinya denan data!ase&
sehina kiner'a aplikasi dapat ditinkatkan.
*enam!il data dari memori selalu 'auh le!ih cepat daripada
menam!il data dari disk atau 'arinan. 5arena kontrol penuh yan
dimilikinya atas hu!unan ke data!ase& DB* dapat menunakan
cache denan leluasa. DB* dapat menamati data mana yan
'aran !eru!ah& dan kemudian akan menyimpannya di memori
(cache). 4ila kode proram kita meminta data terse!ut& DB* tidak
perlu menakses data!ase& melainkan lansun menam!ilnya dari
cache. $ni akan sanat mempercepat eksekusi aplikasi.
Persiapan
Instalasi
%eperti li!rary Java lainnya& J+/ tidak mem!utuhkan instalasi
JAVA PERSISTENCE API (JPA) | HALAMAN 75
khusus. Cukup masukkan file *.jar yan di!utuhkan ke dalam
C?/%%+/),. 7et4eans 0.2 sudah disertai denan li!rary
implementasi J+/& yaitu toplink essensial. 5ita tinal
menam!ahkan sa'a li!rary toplink essential ke dalam pro'ect yan
sudah kita !uat.
0plikasi (log
*en'elaskan konsep sa'a terasa kuran meniit apa!ila tidak
disertai aplikasi. (alam !uku ini& kita akan mem!uat aplikasi !lo&
yaitu aplikasi untuk memuat tulisan atau artikel di we!site.
Fungsionalitas 0plikasi
Fitur dari aplikasi ini adalah:
*enulis artikel
*enelompokkan artikel ke dalam kateori
*em!erikan komentar untuk masin-masin artikel
/rtikel memiliki informasi tentan penulis (author)
/uthor dapat loin ke dalam aplikasi
Dasar-dasar ORM
Mapping Seder'ana
#ntuk contoh awal& kita akan melakukan mappin untuk class
Category. Class ini hanya memiliki tia properti sa'a& id& name& dan
description. 4erikut adalah kode Javanya.
public class Category {
private Integer id;
private String name;
private String description;
// getter dan setter
}
Class ini akan kita simpan di data!ase. 4erikut struktur ta!elnya&
ditulis dalam dialek *y%P?.
create table Category (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
description VARCHAR(255)
);
#ntuk kesederhanaan& kita samakan dulu nama ta!el dan nama
class. (emikian 'ua denan nama property di kode Java dan nama
kolom di ta!el data!ase. +ada !aian selan'utnya& kita akan lihat
HALAMAN 76 | JAVA SWING
!aaimana cara memetakan nama yan !er!eda.
J+/ mendukun dua cara untuk mem!uat pemetaan& denan L*?
dan /nnotation. 5ita akan menam!il pendekatan /nnotation&
karena le!ih mudah dan sederhana. (enan pendekatan ini& kita
tidak perlu memelihara dua file (Java dan L*?). 4erikut class
Category yan sudah dianotasi.
@Entity
public class Category {
@Id @GeneratedValue
private Integer id;
private String name;
private String description;
}
Kon&igurasi J$0
%etelah kita mem!uat ta!el dan class Java& sekaran kita akan
mem!uat konfiurasi J+/. 7et4eans 0.2 mempunyai fasilitas yan
memudahkan konfiurasi J+/.
?ankah pertama adalah mem!uat koneksi ke dalam data!ase
*y%P? denan menunakan data!ase tools net!eans. 4uka ta!
service& kemudian e6pand !aian data!ase. 5alau kita !elum
mempunyai data!ase& kita !isa mem!uat data!ase terle!ih dahulu
denan melakukan klik kanan di node mysKl dan pilih menu create
data!ase& !eri nama trainin. 5alau sudah ada data!ase (schema)
yan di!uat se!elumnya& node mysKl dapat die6pand untuk melihat
data!ase terse!ut.
?ankah !erikutnya adalah mem!uat koneksi ke dalam data!ase
yan sudah di!uat. -6pand node mysKl& klik kanan di node
data!ase trainin& pilih menu connect. Janan lupa untuk mencek
pilihan 8Bemem!er +assword:. 5oneksi ini nanti akan kita unakan
untuk mem!uat +ersistence #nit.
+ersistence #nit adalah konfiurasi yan diunakan oleh J+/ untuk
meletakkan parameter username& password& url dan dialect yan
diunakan untuk melakukan koneksi ke data!ase.
+roses mem!uat +ersistence #nit sanat mudah& pilih menu :
file new file persistence persistence unit
JAVA PERSISTENCE API (JPA) | HALAMAN 77
*asukkan koneksi yan sudah di!uat pada lankah se!elumnya di
!aian 8(ata!ase Connection:. 5emudian pilih 8)a!le "eneration
%tratey: aar ketika kita akan men'alankan aplikasi& semua ta!le
akan dienerate dari -ntity. 5ita akan mem!ahas le!ih lan'ut
tentan -ntity di !a! !erikutnya& tidak perlu !inun dahulu&
tenan sa'a.
,asil dari +ersistence #nit adalah file L*? denan mana
persistence.6ml dan terletak di packae *-)/-$7F& isinya seperti
!erikut ini :
HALAMAN 78 | JAVA SWING
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistenc
e
http://java.sun.com/xml/ns/persistence/persistence_1_0.xs
d">
<persistence-unit name="latihanPU" transaction-
type="RESOURCE_LOCAL">
<provider>
oracle.toplink.essentials.PersistenceProvider
</provider>
<class>com.artivisi.desktop.model.Group</class>
<class>com.artivisi.desktop.model.Person</class>
<properties>
<property name="toplink.jdbc.user" value="root"/>
<property name="toplink.jdbc.password" value=""/>
<property name="toplink.jdbc.url"
value="jdbc:mysql://localhost:3306/training"/>
<property name="toplink.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
<property name="toplink.ddl-generation"
value="create-tables"/>
</properties>
</persistence-unit>
</persistence>
file persistence.6ml diatas se!aiknya di!uat denan otomatis
menunakan tools dari net!eans& dan 'anan di!uat secara
manual denan diketik& karena file 6ml terse!ut case sensitif dan
harus !enar secara sintask& sehina kalau diketik manual akan
!eresiko menhasilkan kesalahan ketik.
Men#impan dan Mengambil 2bje"t
%ekaran& konfiurasi sudah siap. 5ita akan menco!a untuk
menyimpan dan menam!il o!'ect dari data!ase denan
menunakan J+/.
(emonstrasi sederhana dapat di!uat denan class sederhana yan
memiliki method main& sehina !isa di'alankan. 4erikut
kerankanya.
JAVA PERSISTENCE API (JPA) | HALAMAN 79
public class DemoJpa {
public static void main(String[] xx){
}
}
%elan'utnya& kode proram kita akan di!uat dalam method main.
/ntit#ManagerFa"tor#
+ertama& kita harus mem!aca konfiurasi yan sudah kita !uat
tadi. 5onfiurasi yan telah diaktifkan akan menhasilkan o!'ect
EntityManagerFactory. EntityManagerFactory ini hanya di!uat
sekali sa'a sepan'an aplikasi !er'alan.
EntityManagerFactory entityManagerFactory=

Persistence.createEntityManagerFactory("JpaPU");
%ecara default& J+/ akan mencari file yan !ernama
persistence.xml dalam *-)/-$7F.
%elan'utnya& kita instankan dulu o!'ect Category yan akan
disimpan.
// buat object category yang mau disave
Category category = new Category();
category.setName("berita");
category.setDescription("berita hangat");
Men#impan obje"t ke database
5ita !isa lansun menyimpan o!'ect terse!ut denan
menunakan EntityManager J+/. Janan lupa menunakan
Jangan terlalu lama
men#impan obje"t
/ntit#Manager!
(iasan#a- session
dibuka di awal met'od-
dan segera ditutup di
ak'ir met'od!
/ntit#Manager J$0 tidak
sama dengan koneksi
database! Koneksi
database dikelola ole'
/ntit#ManagerFa"tor#!
penting
HALAMAN 80 | JAVA SWING
Transaction.
EntityManager entityManager =
entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entityManager.persist(category);
entityManager.getTransaction().commit();
entityManager.close();
EntityManager adalah o!'ect sekali pakai. 5ita am!il
EntityManager dari EntityManagerFactory& unakan untuk
operasi persistence& dan kemudian lansun ditutup.
%iklus hidup EntityManager !er!eda denan
-ntity*anaerFactory. -ntity*anaerFactory umurnya sama
denan aplikasi& di!uat satu !uah& pada saat aplikasi mulai
di'alankan& dan diunakan terus sepan'an aplikasi !er'alan.
5ita !isa mem!ai-pakai (share) -ntity*anaerFactory ke
!er!aai o!'ect yan !er'alan !er!arenan (concurrent)& karena
-ntity*anaerFactory di!uat secara thread-safe& sehina aman
untuk pemakaian multi-threadin. )api kita tidak !isa
menunakan EntityManager di !anyak o!'ek sekalius.
%etelah di'alankan& kode di atas akan memasukkan satu record ke
ta!el Category dalam data!ase.
Mengambil data dari database
D!'ect yan ada dalam data!ase 'ua !isa diam!il denan cara
yan tidak 'auh !er!eda. 4ila kita sudah tahu $( o!'ect terse!ut&
kita !isa lansun menam!ilnya dari data!ase.
5ode untuk mem!uka EntityManager& men'alankan transaction&
menyelesaikan transaction (commit)& dan menutup
EntityManager tidak ditulis& karena sama denan di atas.
Category c = (Category) entityManager.createQuery(select
c from Category where c.id=:id).setParameter("id",
1).getSingleResult();
System.out.println("ID: "+c.getId());
System.out.println("Name: "+c.getName());
)idak sulit !ukanR 5ita tidak perlu menulis %P? lai. )api ini tidak
!erarti kita !oleh tidak menerti %P?. %eperti kita akan lihat pada
!aian selan'utnya& pemahaman %P? sanat pentin aar kita !isa
menunakan J+/ denan optimal.
JAVA PERSISTENCE API (JPA) | HALAMAN 81
Membuat skema database
+ada contoh se!elumnya& kita mem!uat ta!el di data!ase denan
menunakan perintah %P? lansun di data!ase. %e!etulnya& J+/
'ua !isa mem!uatkan ta!el untuk kita. )am!ahkan !aris !erikut
dalam konfiurasi persistence.xml.
<property name="toplink.ddl-generation" value="create-
tables"/>
/da !e!erapa opsi yan !isa diunakan untuk property
toplink.ddl-eneration ini& yaitu:
drop-and-create-tables: denan opsi ini& J+/ akan mem!uat
semua ta!el pada saat inisialisasi -ntity*anaerFactory. 4eitu
-ntity*anaerFactory ditutup& semua ta!el akan di-drop.
create:-ta!les opsi ini hanya akan mem!uat t
a!el pada saat EntityManagerFactory diinisialisasi. J+/ tidak
men-drop ta!el pada saat EntityManagerFactory ditutup.
%elan'utnya kita akan mem!uat class-class untuk data access o!'ect
((/D).
Membuat Categor#Dao
Class Category akan memiliki !e!erapa method& diantaranya:
save : untuk menyimpan o!'ect ke data!ase
findById : untuk menam!il o!'ect dari data!ase !erdasarkan
$( yan di!erikan
7antinya CategoryDao tidak hanya memiliki dua method sa'a. )api
untuk awal& cukup kita pindahkan apa yan ada di class DemoJpa di
atas ke dalam CategoryDao.
4erikut keranka CategoryDao.
public class CategoryDao {
public void save(Category cat){}
public Category findById(Integer id){}
}
%elan'utnya& CategoryDao !utuh -ntity*anaerFactory untuk
melakukan interaksi denan data!ase melalui J+/. 5ita !erikan
EntityManagerFactory melalui setter-in'ection.
HALAMAN 82 | JAVA SWING
public class CategoryDao {
private EntityManager entityManager;
public void setEntityManager(
EntityManager em) {
this.entityManager = em;
}
}
Menggunakan /ntit#Manager
%elan'utnya& mari kita isi method save. (i dalam method ini harus
ada loika untuk menentukan apakah operasi save yan akan
dilakukan adalah insert atau update. 5onvensi yan diunakan
adalah: 'ika id dari entity masih null maka entity terse!ut !elum
ada di dalam data!ase& sehina operasi insert yan akan
dilaksanakan. %e!aliknya& 'ika idnya tidak null maka operasi update
yan akan dilaksanakan:
public void save(Category cat) {
if(cat.getId()==null){
entityManager.persist(cat);
} else {
entityManager.merge(cat);
}
}
method findById.
public Category findById(Integer id){
return (Category) entityManager.createQuery(
"select g from Group g where g.id=:id")
.setParameter("id", id)
.getSingleResult();
}
Client Code
5ita dapat mem!uat kode sederhana untuk menetes kiner'a
CategoryDao. 4uat class (emo(ao yan memiliki method main.
$sikan kode proram !erikut dalam method main.
JAVA PERSISTENCE API (JPA) | HALAMAN 83
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(JpaPU);
CategoryDao categoryDao = new CategoryDao();
categoryDao.setEntityManager(factory.createEntityManager(
));
Category cat = new Category();
cat.setName("Tutorial JPA");
cat.setDescription("Belajar JPA");
categoryDao.save(cat);
%etelah di'alankan& co!a periksa isi data!ase.
#ntuk menam!il data& kita 'ua !isa menunakan method
findById. 4uat class JpaDemo lenkap denan method main. $si
method main adalah se!aai !erikut.
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(JpaPU);
CategoryDao categoryDao = new CategoryDao();
categoryDao.setEntityManager(factory.createEntityManager(
));
Category cat = categoryDao.findById(1);
System.out.println("ID: " + cat.getId());
System.out.println("Name: " + cat.getName());
System.out.println("Description: "+cat.getDescription());
5ode di atas !ila di'alankan akan menampilkan tulisan se!aai
!erikut:
ID: 1
Name: Tutorial JPA
Description: Belajar JPA
Pemetaan Relasi
%elan'utnya& setelah kita dapat menkonfiurasi dan melakukan
test terhadap ker'a J+/& sekaran kita !isa melankah ke topik
yan le!ih !ermanfaat& yaitu mem!uat mappin yan le!ih
!eraam.
+ada !a! ini& kita akan memetakan seluruh struktur data!ase
aplikasi !lo kita. 4erikut class-class yan akan terli!at:
HALAMAN 84 | JAVA SWING
User : mencerminkan semua account yan dapat loin ke
aplikasi.
Author : mencerminkan penulis yan menaran artikel atau
menulis !erita. %atu author memiliki satu user& dan se!aliknya.
5ita memisahkan class User dan Author& karena User !erisi
informasi tentan security& i'in akses& password& dan informasi
keamanan lainnya. %edankan class Author menyimpan
informasi !erkaitan tentan informasi personal& seperti nama
lenkap& tanal lahir& dan se!aainya.
Group : !erisi !anyak User& unanya nanti untuk memudahkan
penaturan i'in akses.
Category : mencerminkan kelompok artikel. /da kateori !erita&
osip& opini& dan se!aainya
Article
Comment : komentar atas artikel tertentu
,u!unan antar class terse!ut dapat diam!arkan se!aai !erikut:
%truktur o!'ect tidak sama denan struktur data!ase& walaupun
aak mirip. 4erikut adalah struktur ta!el dalam data!ase.
JAVA PERSISTENCE API (JPA) | HALAMAN 85
%ekaran& setelah kita menetahui desain o!'ek dan desain
data!ase& mari mulai melakukan pemetaan.
Pertimbangan dalam pemetaan
%eperti sudah disinun sekilas dalam !aian se!elumnya& ada
!e!erapa ketidak sesuaian (mismatch) antara desain o!'ek dan
desain data!ase. ,u!unan antar ta!el di data!ase 'auh le!ih
sederhana daripada hu!unan antar class di aplikasi !erorientasi
o!'ek.
(alam kaitannya denan hu!unan antar class& ada !e!erapa hal
yan harus kita perhatikan& yaitu:
kasta class
naviasi
'enis collection
optionality
transitive persistence
HALAMAN 86 | JAVA SWING
*ari kita !ahas satu persatu.
Kasta
J+/ menenal tia kasta o!'ect: entity& component& dan value type.
*ari kita lihat contohnya.
+ada domain model di atas& kita lihat seoran Author memiliki
informasi nomer yan !isa dihu!uni. 5arena 'aman sudah semakin
canih& satu oran !isa dihu!uni di !anyak nomer& yaitu nomer
telepon rumah& kantor& ponsel "%*& ponsel C(*/& dan 'ua nomer
fa6. #ntuk menelompokkan semua nomer ini& kita mem!uat satu
class khusus yaitu ContactNumber.
+emetaan o!'ek seperti ini dise!ut denan istilah fine-rained.
/rtinya& informasi dikelompokkan secara detail dan spesifik. )iap
class memiliki informasi yan terinci. 5arena class adalah tipe data&
!isa dikatakan !ahwa kita telah mem!uat tipe data !aru& yaitu
ContactNumber.
+ertanyaannya& !aaimana kita akan menyimpan data ini ke
data!aseR (ata!ase tidak menenal tipe data khusus. 5ita hanya
!isa menunakan tipe data yan telah disediakan seperti $7)&
atau F/BC,/B. 5ita tidak !isa mem!uat tipe data !aru
ContactNumber dalam data!ase.
/da tia alternatif yan !isa kita unakan untuk memetakan
ContactNumber ke data!ase. )ia alternatif ini mencerminkan kasta
o!'ect dalam J+/.
2. 5asta tertini& adalah -ntity o!'ect. %e!uah -ntity
memiliki ta!el sendiri& primary key sendiri& dan kehidupan
sendiri. Class Author adalah se!uah -ntity.
;. 5asta di !awah -ntity dise!ut Component. (ia memiliki
JAVA PERSISTENCE API (JPA) | HALAMAN 87
ta!el sendiri dan kadan-kadan memiliki primary key
sendiri. )etapi& Component hidup menempel pada -ntity
dan tidak !isa !erdiri sendiri. 5alau inan -ntitynya
dihapus& maka Component akan ikut dihapus dari data!ase.
Class ContactNumber adalah contoh Component.
<. 5asta palin rendah dise!ut Falue )ype. %ama denan
Component& hidupnya menempel pada -ntity. Falue )ype
tidak memiliki ta!el sendiri. $nformasi yan dimilikinya
disimpan pada ta!el induknya. (aftar email yan dimiliki
Author (List<String> emails) adalah contoh Falue )ype.
/da !e!erapa kriteria yan !isa diunakan untuk menentukan
kasta suatu o!'ect. (enan menunakan kriteria ini& kita dapat
memetakan desain o!'ect ke desain relasional denan !aik. 4erikut
kriterianya:
2. %hared Beference.
/pakah o!'ect tertentu mempunyai referensi ke o!'ect lainR
+ada contoh kita di atas& class Author memiliki hu!unan
denan class User dan class Article. Dleh karena itu& 'elas
!ahwa class Author akan men'adi -ntity.
(i data!ase& ta!el Author dan User akan terlihat seperti ini.

Class ContactNumber hanya diunakan oleh class Author.
Class ini !ahkan tidak memiliki referensi ke class induknya&
yaitu class Author. $ni ditun'ukkan oleh hu!unan
composition antara class Author dan ContactNumber.
Dleh karena itu& data ContactNumber dimasukkan ke dalam
ta!el yan sama denan data Author& seperti dapat dilihat
pada am!ar di atas.
;. 5ehidupan.
HALAMAN 88 | JAVA SWING
/pakah suatu o!'ect memiliki kehidupan yan terpisah dari
o!'ect yan !erhu!unan denannyaR (ata Author masih
akan tetap tersimpan walaupun Article yan ditulisnya
dihapus.
)idak demikian halnya denan ContactNumber. 4eitu data
Author dihapus& data ContactNumber tidak memiliki
relevansi lai.
D!'ect yan memiliki kehidupan sendiri merupakan
kandidat -ntity.
<. Jumlah
#ntuk memahami pentinnya 'umlah dalam pemetaan& mari
kita lihat hu!unan antara Article dan Comment.
%atu Article memiliki !e!erapa Comment. %ama denan
ContactNumber& kehidupan Comment 'ua sanat terantun
pada Article. 5alau Article dihapus& Comment tidak lai
relevan. /pa yan mau dikomentari kalau artikelnya tidak
adaR
%atu Author hanya memiliki satu ContactNumber& tapi satu
Article memiliki !anyak Comment. +er!edaan 'umlah ini
akan menentukan susunan ta!elnya. 4erikut susunan ta!el
Article dan Comment.
JAVA PERSISTENCE API (JPA) | HALAMAN 89
(enan mempertim!ankan ketia hal di atas& !erikut adalah kasta
untuk masin-masin o!'ect dalam desain domain model kita.
Class Kasta
/rticle -ntity
/uthor -ntity
Cateory -ntity
Comment Component
Contact7um!er Falue )ype
"roup -ntity
#ser -ntity
#ser?evel Falue )ype
7avigasi
5ita harus memikirkan urusan arah naviasi (direction) dalam
merancan pemetaan. (ua class dikatakan memiliki naviasi dua
arah (!idirectional) apa!ila kita dapat menakses class yan satu
dari class yan lain& dan se!aliknya. %e!aai contoh& User dan
Group mempunyai hu!unan !idirectional& 'adi kode Javanya kira-
kira seperti ini.
public class User {
private Set<Group> groups = new HashSet<Group>();
}
sedankan class Group !erisi seperti ini
HALAMAN 90 | JAVA SWING
public class Group {
private Set<User> members = new HashSet<User>();
}
User dan Author unidirectional& artinya dari class User kita dapat
menakses class Author. )api dari class Author kita tidak dapat
menakses class User. 4erikut kode Javanya.
public class User {
private Author author;
}
dalam class Author& tidak ada property User.
public class Author {
// tidak ada property User
}
#rusan naviasi ini hanya ada di kode Java. /papun desain naviasi
yan kita !uat& tidak mempenaruhi struktur ta!el kita.
Jenis Colle"tion
(alam desain kita di atas& ada !e!erapa hu!unan one-to-many dan
many-to-many. #rusan many ini direpresentasikan dalam Java
denan menunakan Collections Framework.
5ita menenal !e!erapa interface dalam Collections Framework
denan sifatnya masin-masin:
Set : D!'ek yan disimpan dalam Set tidak !oleh ada yan sama.
Set tidak !isa meninat urutan. Jadi kita tidak !isa
menharapkan o!'ek yan dimasukkan pertama akan muncul
pertama 'ua. Set !iasanya diinisialisasi denan menunakan
implementasi HashSet.
List : 4er!eda denan Set& List mampu meninat urutan.
+erilakunya mirip denan array. 5ita dapat menatur urutan
o!'ek yan disimpan di dalamnya. D!'ek List !isa diurutkan
melalui perintah order by dalam %P?& atau denan adanya nilai
inde6& yan menun'ukkan urutan o!'ek di dalam List. 4iasanya
List diinisialisasi denan implementasi ArrayList.
SortedSet : $nterface ini diunakan !ila kita inin menyimpan
o!'ek yan tidak !oleh sama& tapi menininkan ada urutan
tertentu. 5ita dapat memasan Comparator ke dalam SortedSet
untuk menatur urutan penyimpanan o!'ek. 4iasanya SortedSet
diinisialisasi menunakan TreeSet.
Map : $nterface ini menyimpan pasanan key dan value. 4iasanya
diinisialisasi menunakan HashMap.
JAVA PERSISTENCE API (JPA) | HALAMAN 91
5ita memiliki !e!erapa hu!unan many dalam domain model kita.
4erikut adalah pemilihan 'enis collection !eserta pertim!anannya.
Relasi Collection Pertimbangan
/uthor Q -mail %etT%trinU alamat email tidak !oleh
terduplikasi. 4usiness reKuirement
tidak menharuskan adanya
prioritas tertentu antar email
/uthor Q /rticle ?istT/rticleU kita inin menampilkan daftar
artikel !erdasarkan tanal
ter!itnya.
/rticle Q Comment ?istTCommentU urutan masuknya komentar sanat
pentin& karena ter'adi diskusi
antar penun'un.
#ntuk memastikan urutan& kita
menunakan ?ist denan nilai
inde6.
#ser Q "roup %etT"roupU %atu user tidak !oleh tercatat dua
kali se!aai mem!er roup yan
sama
"roup Q #ser %etT#serU %atu roup tidak !oleh diikuti dua
kali oleh satu user yan sama
2ptionalit#
*asalah optionality ini hanya ada di sisi data!ase. (ari sudut
pandan desain o!'ect& optionality tidak men'adi pertim!anan.
*ari kita lihat lai relasi antara User dan Author. +ada kasus kita&
satu User pasti memiliki satu Author& dan se!aliknya. (esain
seperti ini direalisasikan di data!ase denan ((? !erikut:
create table T_AUTHOR (
id INT PRIMARY KEY AUTO_INCREMENT
);
create table T_USER (
id INT PRIMARY KEY AUTO_INCREMENT,
author_id INT NOT NULL
);
%eperti kita lihat& ta!el T_USER di atas memiliki forein key
author_id. 5olom author_id terse!ut di!erikan atri!ut NOT NULL
karena dia adalah forein key& sehina harus diisi.
(esain seperti ini akan men'adi masalah 'ika !usiness reKuirement
menentukan !ahwa User !elum tentu punya informasi Author
(optional). Jika menunakan desain di atas& maka kita terpaksa
HALAMAN 92 | JAVA SWING
menhilankan atri!ut NOT NULL pada author_id.
Cara ini kuran elean& karena forein key tidak diperuntukkan
aar !isa diisi NULL. (i !e!erapa merek data!ase& forein key
dilaran NULL. Cara yan le!ih !aik adalah denan menunakan
'oin ta!le. %kema data!ase denan 'oin ta!le men'adi seperti ini.
create table T_AUTHOR (
id INT PRIMARY KEY AUTO_INCREMENT
);
create table T_USER (
id INT PRIMARY KEY AUTO_INCREMENT
);
create table T_USER_AUTHOR (
user_id INT,
author_id INT,
PRIMARY KEY(user_id, author_id)
);
5esimpulannya& kita harus mempertim!ankan faktor optionality
dalam mendesain struktur ta!el data!ase.
,ransitive $ersisten"e
,al lainnya yan harus dipertim!ankan dalam melakukan
pemetaan adalah efek suatu operasi entity (save& update& delete)
terhadap entity lain yan terhu!un denannya.
*isalnya& author -ndy menulis artikel !aru. 4erikut kode proram
untuk menyimpannya ke data!ase.
Author endy = entityManager.createQuery(select a from
Article a where a.id=:id)
.setParameter(id,100).getSingleResult();
Article tutorial = new Article();
tutorial.setTitle(Belajar JPA);
tutorial.setAuthor(endy);
endy.getArticles().add(tutorial);
entityManager.persist(endy);
+ada kasus di atas& class Article adalah -ntity& 'adi J+/ tidak
otomatis melakukan insert. Jika di'alankan& kode di atas akan
menhasilkan error& yan menye!utkan !ahwa o!'ect tutorial
!elum ada di data!ase& sehina tidak !isa dihu!unkan denan
o!'ect endy.
JAVA PERSISTENCE API (JPA) | HALAMAN 93
/ar tidak error& kita harus men'alankan save terhadap o!'ect
tutorial terle!ih dulu.
entityManager.persist(tutorial);
entityManager.persist(endy);
5ita dapat menhilankan perintah save terhadap o!'ect tutorial
denan menaktifkan transitive persistence& yaitu cascade-save.
(enan opsi ini& !eitu o!'ect endy di-save& J+/ akan melakukan
save terhadap semua o!'ect yan terhu!un denan o!'ect endy.
)ransitive persistence 'ua dapat diaplikasikan untuk update dan
delete.
%etelah kita memahami pertim!anan dalam mem!uat mappin&
mari sekaran kita !uat deklarasi pemetaannya.
Enum Type
5ita mulai dari yan palin sederhana& yaitu tipe data enum. (alam
domain model kita& enum diunakan untuk menentukan i'in akses
user. *ari kita lihat class User.
public class User {
private Integer id;
private String username;
private String password;
private UserLevel level;
}
Class User ini menunakan fitur !aru dalam Java @& yaitu )ypesafe
-num. /dapun enum UserLevel tidak sulit& kodenya seperti ini.
public enum UserLevel {
CONTRIBUTOR, EDITOR, ADMINISTRATOR
}
5ita memiliki dua pilihan !aaimana UserLevel ini akan disimpan
dalam ta!el& yaitu:
ordinal : menyimpan nilai inde6 dari enum terse!ut.
CD7)B$4#)DB akan disimpan denan nilai 2& -($)DB denan
nilai ;& dan /(*$7$%)B/)DB denan nilai <. Drdinal adalah
modus default.
strin : menyimpan nilai teks enum. (i data!ase& nilainya akan
disimpan se!aai tipe data enumeration !ila tersedia& atau
varchar.
#ntuk memetakan enum& cukup !erikan anotasi @Enumerated.
HALAMAN 94 | JAVA SWING
public class User {
private Integer id;
private String username;
private String password;

@Enumerated(value = EnumType.STRING)
private UserLevel level;
}
Value Type
5ita memiliki satu value type& yaitu List<String> emails pada
class Author. 4erikut pemetaannya.
public class Author {
@CollectionOfElements(targetElement = String.class)
@JoinTable(
name = "T_AUTHOR_EMAIL",
joinColumns = {@JoinColumn(name = "author_id")}
)
@Column(name = "email")
private Set<String> emails = new HashSet<String>();
}
(enan informasi mappin di atas& ta!el T_AUTHOR dan
T_AUTHOR_EMAIL akan terlihat seperti ini.
+ada T_AUTHOR_EMAIL terlihat !ahwa kedua kolom (author_id dan
email) di!uat men'adi primary key. $ni adalah konsekuensi dari tipe
collection Set& yan tidak meni'inkan duplikasi di dalamnya.
JAVA PERSISTENCE API (JPA) | HALAMAN 95
One to One
Dne to Dne menhu!unkan dua entity. 5ita menunakan
hu!unan ini untuk Author dan User. >an perlu diperhatikan
hanyalah class User& karena naviasinya cuma satu arah. 4erikut
class User.
public class User {
@OneToOne
@JoinColumn(name = "author_id", nullable = false)
private Author author;
}
5ita menatur kolom forein key author_id aar tidak !oleh null.
$ni !erkaitan denan masalah optionality yan sudah di'elaskan di
atas.
Many to One
+ada contoh aplikasi kita& mappin *any to Dne ada pada
hu!unan antara class Article dan Category. 7aviasinya satu
arah& dari Article ke Category. (enan demikian& pada class
Category& tidak ada property Article.
public class Category {
@Id @GeneratedValue
private Integer id;
private String name;
private String description;
}
+ada class Article& kita mendeklarasikan property Category&
denan mappin @ManyToOne se!aai !erikut.
public class Article {
@ManyToOne
@JoinColumn(name = "category_id", nullable = false)
private Category category;
}
(eklarasinya tidak 'auh !er!eda denan @OneToOne. +emetaan di
atas mencerminkan skema data!ase se!aai !erikut.
HALAMAN 96 | JAVA SWING
One to Many
+ist dengan order b#
5ita memiliki !e!erapa kasus Dne )o *any. +ertama& kita lihat
dulu tipe collection List yan menunakan sortin di sisi
data!ase melalui perintah order by.
,u!unan ini ada antara Author dan Article. 5arena
hu!unannya dua arah (!idirectional)& maka kita akan melihat
mappin di kedua sisi class. 4erikut am!ar domain modelnya.
(i sisi Article& mappin *any-to-Dne Author sama denan
Category yan kita sudah !uat se!elumnya.
public class Article {
@ManyToOne
@JoinColumn(name = "author_id", nullable = false)
private Author author;
}
(i sisi Author&
public class Author {
@OneToMany(mappedBy = "author")
@OrderBy("publishDate")
private List<Article> articles
= new ArrayList<Article>();
}
+emetaan di atas akan menhasilkan struktur ta!el data!ase
se!aai !erikut.
JAVA PERSISTENCE API (JPA) | HALAMAN 97
5ita menunakan anotasi @OrderBy untuk menentukan urutan
munculnya Article. Jika anotasi terse!ut kita hilankan& J+/ akan
menurutkannya !erdasarkan id.
+ada mappin di atas& kita menunakan keyword mappedBy.
5eyword ini dikenal 'ua denan atri!ut inverse=true pada
mappin L*?.
5eyword inverse atau mappedBy mem!eritahukan J+/ !ahwa isi
List adalah -ntity o!'ect& !ukan Component. (enan demikian&
kalau o!'ect Author dihapus& J+/ tidak akan otomatis menhapus
'ua Article.
%elain menatur masalah keterantunan& keyword
inverse ini 'ua menatur eksekusi %P?. *ari kita
!ahas internal J+/ sedikit.
/sosiasi dua arah antara Author dan Article
se!etulnya terdiri dari dua asosiasi satu arah& yaitu
dari Author ke Article& dan se!aliknya. (i dalam
data!ase& asosiasi ini diimplementasikan denan
forein key author_id yan ada dalam ta!el
T_ARTICLE. (enan demikian& satu hu!unan forein
key dipetakan dua kali oleh J+/.
5onsekuensinya& dua mappin ini akan menhasilkan
dua kali eksekusi %P?. Co!a perhatikan skenario
!erikut.
J$0 mampu membuat
pemetaan satu ara' dari
0ut'or ke 0rti"le- ba'kan
tanpa adan#a propert#
aut'or di sisi 0rti"le!
$emetaan satu ara' ini
tetap dilakukan dengan
adan#a &oreign ke#
aut'or8id di ,80*,IC+/
,api konsekuensin#a-
J$0 tidak ta'u apaka'
&oreign ke# aut'or8id
tersebut suda'
dipetakan atau belum!
Ini sebabn#a mengapa
kita 'arus menggunakan
ke#word inverse!
penting
HALAMAN 98 | JAVA SWING
Author endy = entityManager.createQuery(select a from
Article a where a.id=:id)
.setParameter(id,100).getSingleResult();
Article tutorial = new Article();
tutorial.setTitle(Belajar JPA);
tutorial.setAuthor(endy);
endy.getArticles().add(tutorial);
entityManager.persist(tutorial);
entityManager.persist(endy);
Bankaian kode proram di atas akan menhasilkan eksekusi %P?
se!aai !erikut:
select * from T_AUTHOR where id=100;
insert into T_ARTICLE (title, author_id)
values ('Belajar JPA', 100);
update T_ARTICLE set author_id=100
where title='Belajar JPA';
5ita lihat di atas& J+/ men'alankan %P? update&
padahal se!elumnya author_id sudah diset menurut
id authornya. $ni dise!a!kan karena forein key
author_id dipetakan dua kali.
J+/ tidak !isa mendeteksi ini secara otomatis& karena
tidak memunkinkan secara loika. Jadi& kita harus
mem!eri tahu J+/ !ahwa author_id sudah dipetakan
oleh class /rticle.
%etelah kita menunakan keyword mappedBy& kode
proram di atas akan menhasilkan eksekusi %P?
se!aai !erikut.
select * from T_AUTHOR where id=100;
insert into T_ARTICLE (title, author_id)
values ('Belajar JPA', 100);
5eyword mappedBy menye!a!kan J+/ mena!aikan pemetaan di
sisi /uthor. >an dipantau oleh J+/ hanyalah sisi /rticle.
(enan demikian& !ila kita save seperti ini:
Inverse tidak
ber'ubungan dengan
"as"ade!
Cas"ade 'an#a
men#uru' J$0 untuk
memeriksa apaka' entit#
lain #ang ter'ubung
suda' di%
save9update9delete atau
belum
penting
JAVA PERSISTENCE API (JPA) | HALAMAN 99
Article tutorial = new Article();
endy.getArticles().add(tutorial);
entityManager.persist(endy);
D!'ect tutorial tidak akan tersimpan ke data!ase. #ntuk
memper!aikinya& kita lakukan seperti ini:
Article tutorial = new Article();
tutorial.setAuthor(endy)
entityManager.persist(tutorial);
4ila kita sudah menaktifkan transitive persistence& maka kita !isa
melakukannya seperti ini:
Article tutorial = new Article();
tutorial.setAuthor(endy)
entityManager.persist(endy);
4aaimana 'ika kita inin mem!alik sisi inverseR *isalnya& kita
inin aar J+/ mena!aikan sisi Article.
5eyword mappedBy atau inverse tidak dapat diunakan di sisi
@ManyToOne. #ntuk melakukan hal ini& kita unakan keyword
updateble dan insertable. (i sisi Article& kita tam!ahkan
updatable dan insertable.
public class Article {
@ManyToOne
@JoinColumn(
name = "author_id", nullable = false
updatable = false, insertable = false
)
private Author author;
}
(i sisi Author& kita hilankan sa'a mappedBy.
public class Author {
@OneToMany
@OrderBy("publishDate")
private List<Article> articles
= new ArrayList<Article>();
}
Many to Many
4ila kita sudah menuasai pemetaan Dne-to-*any& maka *any-to-
*any tidak sulit. +er!edaannya hanya terletak di anotasinya. >an
tadinya @OneToMany& dianti men'adi @ManyToMany.
%ama denan Dne-to-*any& kita harus menentukan sisi mana yan
HALAMAN 100 | JAVA SWING
inverse. +ada contoh kali ini& sisi inverse terletak pada class User.
4erikut isi class User.
public class User {
@ManyToMany(mappedBy = "members")
private Set<Group> groups = new HashSet<Group>();
}
4erikut pemetaan di class Group.
public class Group {
@ManyToMany
@JoinTable(
name = "T_GROUP_MEMBERS",
joinColumns = {@JoinColumn(name = "group_id")},
inverseJoinColumns = {@JoinColumn(name = "user_id")}
)
private Set<User> members = new HashSet<User>();
}
+emetaan many-to-many mem!utuhkan ta!el perantara. /notasi
@JoinTable diunakan untuk menatur nama ta!el dan kolom
dalam ta!el perantara. Jika kita menhilankan anotasinya& maka
J+/ akan mencari ta!el !ernama T_GROUP_T_USER denan nama
kolom groups_id dan members_id.
4erikut adalah struktur ta!el data!ase yan dipetakan oleh anotasi
di atas.
Parent-Child
)erakhir& kita akan mem!uat pemetaan parent-child. $ni merupakan
pemetaannya yan serin kita unakan. +emetaan ini !iasanya
!er!entuk one-to-many. %isi one menentukan kondisi sisi many.
4ila ter'adi save& update& atau delete pada sisi one& maka sisi many
akan terpenaruh.
%e!aai contoh& kita akan menunakan relasi parent-child ini
pada hu!unan antara Author dan Article. 4ila Author dihapus&
maka seluruh Article yan pernah ditulisnya 'ua akan ikut
terhapus.
JAVA PERSISTENCE API (JPA) | HALAMAN 101
#ntuk menaktifkan parent-child ini& kita u!ah pemetaan di sisi
Author se!aai !erikut.
public class Author {
@OneToMany(
mappedBy = author,
cascade = CascadeType.ALL
)
@OrderBy("publishDate")
private List<Article> articles
= new ArrayList<Article>();
}
+ada contoh di atas& kita menaktifkan fitur cascade untuk semua
'enis operasi& yaitu save& update& dan delete. 4ila kita hanya inin
cascade untuk operasi save dan delete& anotasinya men'adi seperti
ini.
public class Author {
@OneToMany(
mappedBy = author,
cascade = {CascadeType.PERSIST, CascadeType.REMOVE}
)
@OrderBy("publishDate")
private List<Article> articles
= new ArrayList<Article>();
}
Mengambil Objek dari Database
J+/ menyediakan !anyak cara untuk menam!il data dari
data!ase. 4er!aai pilihan cara ini disesuaikan denan preferensi
prorammer. /da oran yan le!ih menyukai aya %P? karena
le!ih rinkas dan mudah. /da 'ua yan le!ih menyukai aya
prorammatic !erorientasi o!'ek karena type-safe. 4e!erapa
prorammer yan merupakan alumni *icrosoft /ccess 'ua !isa
ikut menikmati J+/ denan Puery 4y -6ample.
JPA Query Language (JPAQL)
J+/P? adalah !ahasa Kuery J+/ yan mirip denan %P?. 4edanya&
dalam J+/P? kita menunakan nama o!'ect dan property& !ukan
nama ta!el dan kolom.
6uer# Seder'ana
#ntuk contoh pertama& mari kita implementasikan
HALAMAN 102 | JAVA SWING
ArticleDao.findAll().
public class ArticleDao {
public List<Article> findAll() {
return entityManager.createQuery(
selct a from Article a).getResultList();
}
}
Puery di atas akan menhasilkan semua o!'ect Article yan ada
dalam data!ase.
$agination
4ila aplikasi kita menyimpan ri!uan artikel& tentunya kita inin
menam!il data secara !ertahap& halaman per halaman (pain).
%P? yan diunakan untuk paination ini !iasanya !er!eda antar
data!ase. (enan J+/& kita !isa menunakan satu J+/P? sa'a. J+/
nantinya akan mener'emahkan sesuai denan merek data!ase yan
kita unakan.
#ntuk menam!il artikel per halaman& kita overload method
findAll aar menerima parameter startIndex dan pageSize.
+arameter startIndex adalah inde6 yan menun'ukkan record
pertama dalam halaman& sedankan pageSize menun'ukkan 'umlah
record per halaman.
4erikut overloadin method findAll.
public List<Article> findAll
(int startIndex, int pageSize){
return entityManager
.createQuery("select a from Article a")
.setFirstResult(startIndex)
.setMaxResults(pageSize)
.getResultList();
}
$arameter (inding
4aaimana kalau kita mau menirim parameter ke KueryR J+/
mendukun parameter !indin& mirip denan PreparedStatement
di J(4C.
4ila kita inin menam!il artikel yan ditulis penaran tertentu&
!erikut kodenya.
JAVA PERSISTENCE API (JPA) | HALAMAN 103
public List<Article> findByAuthor(Author author) {
String query = "from Article a ";
query += " where a.author.id = :authorId ";
return entityManager
.createQuery(query)
.setParameter("authorId", author.getId())
.getResultList();

}
%elain itu& kita 'ua !isa menunakan parameter !ertipe
java.util.Date. Contohnya !ila kita inin mendapatkan artikel
yan diter!itkan setelah tanal tertentu. 4uat method
articlesPublishedAfter dalam ArticleDao.
public List<Article> articlesPublishedAfter
(Date publishDate) {
String query = "from Article a ";
query += "where a.publishDate > :publishDate";
return entityManager.createQuery(query)
.setParameter("publishDate", publishDate)
.getResultList();
}
7amed 6uer#
5ita !isa meneluarkan J+/P? dari dalam o!'ek DAO dan
memindahkannya ke class -ntity. (ari class DAO& kita cukup
memanil nama Kuery terse!ut. Fitur ini dise!ut 7amed Puery.
*isalnya& kita inin menam!il artikel !erdasarkan kateori.
4erikut J+/P?-nya.
from Article a where a.category.id = :categoryId
J+/P? ini !isa kita letakkan dalam class Article. 4erikut deklarasi
class Article.
HALAMAN 104 | JAVA SWING
@Entity @Table(name = "T_ARTICLE")
@NamedQueries({
@NamedQuery(
name = "articleByCategory",
query = "from Article a "+
"where a.category.id = :categoryId"
)
})
public class Article { }
7amed Puery ini dipanil dari ArticleDao dalam method
findByCategory seperti ini.
public List<Article> findByCategory(Category category) {
return entityManager
.createNamedQuery("articleByCategory")
.setParameter("categoryId", category.getId())
.getResultList();
}
*estri"tion
5ita menunakan restriction untuk mem!atasi 'umlah record yan
dihasilkan. *irip denan %P?& kita menunakan keyword where
untuk mem!atasi hasil Kuery.
Contohnya& kita menam!il artikel yan diter!itkan setelah tanal
tertentu. J+/P?nya tampak seperti ini:
from Article a where a.publishDate > :publishDate
,ampir semua operator yan !iasa kita unakan di Java dapat
diunakan. 4erikut ta!el operator yan didukun& diurutkan
!erdasarkan prioritas eksekusinya:
Operator Penjelasan
. naviasi o!'ect
A - untuk mem!uat men'adi positif/neatif
V / perkalian dan pem!aian
A - pen'umlahan dan penuranan
O TU sama denan atau tidak sama denan
T& U& TO& UO per!andinan
I7D)J 4-)9--7& I7D)J ?$5-&
I7D)J $7& $% I7D)J 7#??
per!andinan& mirip denan sintaks %P?
$% I7D)J -*+)>& I7D)J
*-*4-B IDFJ
penecekan collection
JAVA PERSISTENCE API (JPA) | HALAMAN 105
7D)& /7(& DB operator loika
*isalnya& !ila kita inin menam!il artikel yan !ukan kateori
4erita& Kuery-nya seperti ini:
String jpaql = from Article a ;
jpaql += where a.category <> :category;
List<Article> hasil =
entityManager.createQuery(jpaql).getResultList();
5ita menunakan karakter % untuk menantikan karakter apa
sa'a dalam 'umlah !erapa sa'a. *isalnya& kita inin mencari artikel
yan diawali denan huruf /& maka kita unakan J+/P? seperti ini:
from Article a where a.title like 'A%'
?alu !aaimana kalau kita inin mencari artikel yan diawali
denan karakter %R
"unakan escape character \& sehina J+/P?nya men'adi seperti
ini:
from Article a where a.title like '\%'
4ila kita menunakan le!ih dari satu persyaratan& unakan
keyword and atau or sesuai ke!utuhan. Contohnya& kita inin
mencari artikel yan 'udulnya diawali huruf /& dan nama
penarannya 'ua diawali denan huruf /.
from Article a where a.title like 'A%'
and a.author.fullname like 'A%'
Contoh lain& !ila kita inin mencari artikel yan diawali huruf / dan
'ua huruf 4& J+/P?nya seperti ini.
from Article a where a.title like 'A%'
or a.title like 'B%'
5ita !isa menurutkan hasil pencarian denan menunakan
keyword order by& sama seperti %P?.
4erikut contoh penurutan artikel !erdasarkan 'udulnya.
String jpaql = from Article a ;
jpaql += order by a.title asc ;
List<Article> hasil =
entityManager.createQuery(jpaql).getResultList();
5ita menunakan keyword asc& yan artinya ascendin untuk
menurutkan dari kecil ke !esar. #ntuk urutan se!aliknya&
unakan keyword desc& yan artinya descendin.
HALAMAN 106 | JAVA SWING
6uer# untuk Colle"tion
/da !e!erapa keyword yan dapat diunakan untuk memanipulasi
collection. *isalnya& kita inin mencari roup yan tidak punya
mem!er.
from Group g where g.members is empty
/tau mencari user yan tera!un dalam rup denan nama
tertentu.
from User u, Group g where g.name=? and u member of
g.members
$roje"tion
4ila tadi kita sudah menentukan sum!er data denan keyword from
dan !atasan hasil denan keyword where& sekaran kita !isa
menentukan format hasil yan dikeluarkan denan keyword
select.
*ari kita lihat lai Kuery user yan men'adi anota rup.
from User u, Group g where g.name=? and u member of
g.members
+ada Kuery di atas& kita !isa memilih untuk hanya menam!il data
user sa'a denan menunakan select. Puery di atas !isa ditulis
men'adi seperti ini:
select u
from User u, Group g
where g.name=? and u member of g.members
(enan Kuery seperti itu& kita !isa mem!uat method di class
GroupDao se!aai !erikut:
public List<User> membersOf(String groupName) {
String jpaql = "select u ";
jpaql += "from User u, Group g ";
jpaql += "where g.name = :groupName ";
jpaql += "and u member of g.members';
return entityManager
.createQuery(jpaql)
.setString("groupName", groupName)
.getResultList();
}
Join
J+/ memiliki kemampuan untuk mena!unkan !e!erapa o!'ek
sekalius. %e!aai contoh& kita inin menampilkan nama penulis
JAVA PERSISTENCE API (JPA) | HALAMAN 107
yan pernah menisi artikel denan kateori ,eadline 7ews.
Puery ini meli!atkan tia o!'ek& yaitu Author& Article& dan
Category.
select au.fullname
from Article ar join ar.author as au
where ar.category .name like 'Headline%'
Puery di atas akan menhasilkan !e!erapa record denan nama
yan sama. #ntuk mem!uan hasil yan duplikat& unakan
keyword distinct.
select distinct au.fullname
from Article ar join ar.author as au
where ar.category.name like 'Headline%'
*eport 6uer#
Beport Kuery adalah Kuery yan menandalkan kemampuan
data!ase untuk melakukan areasi terhadap data yan 'umlahnya
!anyak. 4iasanya report Kuery !anyak memanfaatkan areate
function seperti sum& count& group by& dan having.
%e!aai contoh& !ila kita inin menhitun 'umlah artikel yan
sudah ditulis seoran author& kita !isa menunakan Kuery !erikut.
select count (a)
from Article a
where a.author.fullname = 'endy'
/tau kita !isa 'ua menhitun !erapa artikel yan tidak
dikomentari penun'un.
select count (a)
from Article a
where a.comments is empty
Sub:uer#
J+/ 'ua mendukun Kuery di dalam Kuery. %e!aai contoh& kita
inin menampilkan penulis mana yan pernah mem!uat artikel
denan nama kateori !erakhiran 7ews.
HALAMAN 108 | JAVA SWING
select distinct (au)
from Author au, Article ar
where ar.category.id in (
select c.id from Category c where c.name like '%News'
)
Native SQL
Jika J+/P? di atas masih 'ua tidak mencukupi& kita !isa lansun
meneksekusi %P? ke data!ase melalui J+/.
%e'auh ini& J+/ sudah mencukupi untuk aplikasi !lo kita. )api
sekedar untuk menam!ah penetahuan& mari kita am!il 21 artikel
ter!aru denan menunakan native %P? *y%P?.
%P?nya se!aai !erikut
select * from T_ARTICLE
order by publishDate desc limit 0,10
%P? di atas kita unakan dalam /rticle(ao se!aai !erikut.
public List<Article> topTenNative() {
String sql = "select * from T_ARTICLE ";
sql += "order by publishDate desc limit 0,10";
return entityManager
.createNativeQuery(sql,Article.class)
.getResultList();
}
#ntuk menunakannya& kita panil methodnya seperti !iasa.
Client code tidak perlu tahu implementasi internalnya. (ari sisi
client code& sama sa'a seperti menakses J+/P?.
JASPER REPORT | HALAMAN 109
Jasper *eport
Pengenalan
*enampilkan report atau laporan merupakan hal yan pentin dan
umum diunakan oleh aplikasi manapun& terutama yan !ersifat
sistem informasi. Dleh karena itu kita akan mem!ahas !aaimana
mem!uat desain report& menisi report denan data& lalu
mem!erikan hasilnya kepada penuna. (alam Java& terdapat
!er!aai teknoloi untuk mem!uat report diantaranya adalah&
JasperBeport& http://'asperreport.sourcefore.net/
4$B)& http://www.!irt-e6chane.com/
(ata Fision& http://datavision.sourcefore.net/
JasperBeport merupakan reportin tools yan palin populer di
Java dan !ahkan !e!erapa aplikasi +,+ menunakan
JasperBeport se!aai solusi untuk menampilkan report.
Instalasi
+ersiapan yan perlu kita lakukan adalah:
2. *eninstall Java %(5& versi yan diunakan adalah J(5 2.0.1.
/nda dapat mendownload J(5 terse!ut dari we!site
http://'ava.sun.com
;. *eninstall 7et4eans 0.1
<. *eninstall iBeport
=. *eninstall *y%P?
Java %(5 diperlukan se!aai toolkit untuk menem!ankan
aplikasi Java. (i dalamnya terdapat Java compiler& 'ava virtual
machine dan 'ava li!rary standard. )anpa %(5 kita tidak akan !isa
menem!ankan aplikasi Java.
7et4eans adalah $(- ($nterated (evelopment -nvironment) yan
dikem!ankan oleh %un *icrosystems. 7et4eans difokuskan untuk
menem!ankan aplikasi 'ava secara produktif& didalamnya
terdapat !anyak wiCard yan menotomatisasi penem!anan
aplikasi& menhindarkan developer dari low level confiuration
yan rumit.
iBeport adalah visual desiner untuk mem!uat reportin
menunakan li!rary 'asperreport. )anpa iBeport development
HALAMAN 110 | JAVA SWING
report men'adi sanat susah dan tidak efisien
*y%P? diunakan se!aai !asis data yan akan di!uatkan
reportnya.
Alur Proses JasperReport
#ntuk mem!uat dan menampilkan se!uah report ada !e!erapa hal
yan harus dilakukan&
2. *erancan report menunakan visual report desiner&
seperti iBeport. File dihasilkan !er-ekstensi V.'r6ml.
;. *enkompilasi desain report aar siap diisi data. ,asil
rancanan report yan sudah dikompilasi !erekstensi
V.'asper.
/da !er!aai cara untuk menkompilasi desain report&
(i dalam kode 'ava atau&
*enunakan /7) task.
Cara yan kedua merupakan pendekatan yan palin umum
diunakan karena kita tidak munkin menu!ah desain
report pada saat run-time atau setelah aplikasi di-deploy.
<. *enisi report denan data. (ata yan di!erikan dapat
!er!aai 'enis sesuai denan ke!utuhan& hal ini akan
di!ahas pada !a! selan'utnya. Beport yan sudah diisi data
!erekstensi V.'rprint.
=. *enentukan 'enis report yan inin ditampilkan. %aat ini
JasperBeport mendukun !er!aai 'enis format seperti&
+(F& L?%& B)F& D()& ,)*?& C%F& dan plain te6t.
Istilah Umum dalam JasperReport
%e!elum mem!ahas le!ih 'auh menenai JasperBeport perlu
diketahui !e!erapa istilah umum yan !iasa diunakan&
Beportin data
*enisi data ke dalam report dapat dilakukan denan
menunakan&
Field& untuk menampilkan data yan !erasal dari Kuery
data!ase atau datasource.
+aramater& untuk menampilkan parameter report.
4entuk dari parameter adalah *ap denan tipe key dan
JASPER REPORT | HALAMAN 111
value !erupa %trin.
Faria!le& se!aai data yan dapat dimanipulasi dan
diunakan !erkali-kali dalam report.
?ayout report
4iasanya desain report terdiri dari !e!erapa !aian yaitu&
4ackround.
)itle& 'udul dari report.
+ae header& !aian di setiap awal halaman.
Column header& !aian di setiap awal ta!el.
(etail& !aian yan menampilkan data yan !erasal
dari Kuery atau data source. %etiap data dapat
ditampilkan secara vertikal dari atas ke !awah atau
horiContal dari kiri ke kanan.
Column footer& !aian di setiap akhir ta!el.
+ae footer& !aian di !aian footer setiap halaman.
?ast pae footer& sama seperti pae footer namun
hanya muncul pada halaman terakhir.
%ummary& !aian yan hanya ditampilkan sekali di
akhir report.
iReport sebagai Visual Designer
#ntuk mendesain report kita akan menunakan iBeport&
instalasinya sanat mudah.
+enuna 9indows !isa menunduh file installer iBeport&
meninstall dan lansun men'alankannya.
4ai penuna sistem operasi V7i6 !isa menunduh file
arsipnya !erupa tar.C dan menekstraknya. %etelah itu
men'alankannya denan&
cd /home/user/iReport-2.0.4
sh iReport.sh
4erikut tampilan muka dari iBeport&
HALAMAN 112 | JAVA SWING
Konfigurasi Koneksi Database dalam
iReport
%e!elum menulis %P? dalam report& kita perlu menkonfiurasi
koneksi data!ase. Caranya denan&
Data > Connection / Data Sources
New > Pilih Database JDBC Connection > Next
$sikan form konfiurasi seperti !erikut&
Name: MySQLConnection
JDBC Driver: com.mysql.jdbc.Driver
JDBC URL: jdbc:mysql://localhost/ejb3
Username: belajar
Password: java
5onfiurasi di atas menasumsikan kita sudah mempunyai
data!ase yan !ernama !ela'ar denan username dan password
!ela'ar / 'ava. 4erikut script untuk mem!uat schema !erdasarkan
konfiurasi di atas&
JASPER REPORT | HALAMAN 113
CREATE DATABASE ejb3;
CREATE TABLE T_PERSON
GRANT ALL ON belajar.* TO belajar@localhost IDENTIFIED BY
'java';
FLUSH PRIVILEGES;
Menampilkan Data dalam Report
/da dua pendekatan umum untuk menampilkan atau menisi data
ke dalam report&
$nline %P?& menampilkan data melalui %P? yan disimpan
pada file desain report.
(ata%ource& menampilkan data melalui interface
(ata%ource yan disediakan oleh JasperBeport. (ata%ource
ini didefinisikan di dalam kode Java sehina report hanya
!erfunsi untuk menampilkan data sa'a.
+endekatan pertama merupakan pendekatan yan palin
sederhana. Dleh karena itu kita akan mem!ahas menampilkan data
melalui inline %P?. #ntuk mendefinisikan %P? dalam report dapat
dilakukan denan&
File > New Document
Beri nama report dengan PersonReport > OK
Edit > Report Query
)ulis %P? dalam Kuery editor&
select * from T_PERSON
5emudian tekan tom!ol 8Bead Fields: untuk memappin kolom
ta!el denan field lalu tekan tom!ol 8D5:.
/da !e!erapa field !aru sesuai denan kolom di ta!el )N+-B%D7
yaitu& personNid& name& email& dan !irthdate. ?alu pindahkan field
di atas ke !aian 8detail: dalam report. ,asilnya seperti !erikut&
HALAMAN 114 | JAVA SWING
5emudian tam!ahkan 'udul dan la!el untuk setiap field data
denan menunakan menu tool!ar 8%tatic )e6t:. (esain akhir
report akan seperti !erikut&
)ampilkan hasil report denan cara&
Build > Execute (with active connection)
Janan lupa untuk menyimpan report yan sudah di!uat denan
nama PersonReport.jrxml&
File > Save
Kompilasi Report dengan Ant
%etelah desain sudah 'adi maka kita perlu mem!uat ant taret
JASPER REPORT | HALAMAN 115
untuk menkompilasi seluruh desain report. Caranya&
Klik tab Files > Buka file build.xml
%etelah itu kita definisikan terle!ih dahulu dimana lokasi kode 'ava
dan report !erada dan menatur classpath untuk li!rary yan
di!utuhkan dalam kompilasi report.
<!-- definisi lokasi -->
<property name="source.java" value="src/java" />
<property name="compile.report.dir"
value="src/java/report"/>
<!-- setting classpath -->
<path id="compile.classpath">
<pathelement location="${source.java}" />
<pathelement location="${compile.report.dir}" />
<fileset dir="lib" includes="**/*jar" />
</path>
%etelah lokasi dan classpath ditentukan& maka lankah terakhir
adalah mendefinisikan ant taret untuk menkompilasi seluruh file
report denan ekstensi V.'r6ml.
<taskdef name="jrc"
classname="net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid="compile.classpath" />
</taskdef>

<target name="compile-report" depends="compile">
<jrc srcdir="${compile.report.dir}"
destdir="${compile.report.dir}"
tempdir="${compile.report.dir}"
xmlvalidation="true">
<classpath refid="compile.classpath" />
<include name="**/*.jrxml" />
</jrc>
</target>
Jalankan ant taret denan nama 8compile report: denan cara&
Klik kanan build.xml > Run Target > Other Target
Klik compile-report
/kan muncul output seperti ini&
HALAMAN 116 | JAVA SWING
init:
deps-module-jar:
deps-ear-jar:
deps-jar:
library-inclusion-in-archive:
library-inclusion-in-manifest:
compile:
compile-report:
Compiling 1 report design files.
File :
/home/ifnu/NetBeansProjects/jasper/jasper/report/PersonRe
port.jrxml ... OK.
BUILD SUCCESSFUL (total time: 4 seconds)
Integrasi JasperReport dengan Swing
$nterasi 'asperreport denan %win se!elumnya dapat dilakukan
denan mudah. /da !er!aai skenario untuk menampilkan
halaman atau data dalam %win yaitu&
*enampilkan dalam J+anel menunakan JBFiewer
*enampilkan dalam JFrame menunakan JasperFiewer
*eneksport lansun hasil report ke dalam format file
seperti +(F& -6cell atau 9ord
+endekatan pertama dan kedua sama dari sisi kode& hanya sa'a
ditampilkan denan menunakan komponen yan !er!eda. Cara
yan palin laCim adalah denan menunakan JBFiewer& dimana
kita !isa meletakkan viewer report di manapun kita ininkan&
karena JBFiewer adalah J+anel.
ResultSet rs = stmn.executeQuery();
String jasper =
JasperCompileManager.compileReportToFile(
System.getProperty("user.dir") +
"/src/jasper/report/person.jrxml");
JRResultSetDataSource resource = new
JRResultSetDataSource(rs);
String result =
JasperFillManager.fillReportToFile(jasper,
new HashMap(), resource);
JRViewer viewer = new JRViewer(result, false);
JASPER REPORT | HALAMAN 117
Menampilkan Report Menggunakan
DataSource
%e!elumnya kita telah menco!a pendekatan pertama untuk
menampilkan report yaitu denan menyimpan kode %P? di dalam
report. 5ekuranan dari pendekatan ini adalah dari sisi code
mainta!ility& karena kode %P? terpisah dari source code aplikasi.
/ki!atnya akan ter'adi !anyak duplikasi& misalnya kita sudah punya
kode %P? di source code aplikasi untuk menampilkan seluruh
daftar +erson dan kemudian kita inin menampilkan report daftar
+erson dalam !entuk +(F. *aka yan selan'utnya dilakukan adalah
copy-paste kode %P? dari source code aplikasi ke dalam report.
4ayankan 'ika kita mempunyai 21 report yan menampilkan daftar
+erson denan kode %P? yan sama denan source code aplikasi
lalu kita menu!ah salah satu nama kolom dari ta!el )N+-B%D7&
maka tentu seluruh report harus diu!ah dan dicompile ulan.
JasperBeport menyediakan solusi untuk hal ini denan
menunakan (ata%ource. (ata%ource !erfunsi untuk
menyimpan data yan inin ditampilkan& misalkan dari data!ase&
kemudian dikirim ke dalam report untuk selan'utnya ditampilkan.
/da !er!aai 'enis (ata%ource yan dapat kita unakan
!erdasarkan tipe data yan inin disimpan&
JB*ap/rray(ata%ource untuk menyimpan tipe data array of
map
JB*apCollection(ata%ource untuk menyimpan tipe data
collection of map
JB4ean/rray(ata%ource untuk menyimpan tipe data array of
!ean
JB4eanCollection(ata%ource untuk menyimpan tipe data
collection of !ean
JB)a!le*odel(ata%ource untuk menyimpan tipe data
ta!lemodel di swin
JBLml(ata%ource untuk menyimpan tipe data 6ml
(ata%ource yan umum diunakan adalah
JB4eanCollection(ata%ource. 5ita akan menampilkan daftar
+erson& denan mem!uat Collection dari +erson !ean yan
kemudian akan di!erikan ke JB4eanCollection(ata%ource. +ertama
di!uat terle!ih dahulu Person.jaa&
HALAMAN 118 | JAVA SWING
public class Person {
private int id;
private String name;
private String email;
// Generate getter and setter
}
4uka file PersonReport.jrxml yan di!uat se!elumnya melalui
iBeport denan te6t editor misalnya& notepad. 5uran le!ih
hasilnya seperti ini&
<jasperReport name="PersonReport">
<queryString>
<![CDATA[select * from T_PERSON]]>
</queryString>
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<!-- desain report -->
</jasperReport>
5ita dapat lansun menunakan file PersonReport.jrxml di atas
aar dapat menampilkan (ata%ource. >an perlu dilakukan adalah&
,ilankan ta Kuery%trin
%esuaikan nama field dan tipenya denan property pada
class +erson & sehina +ersonBeport.'r6ml men'adi&
4erikut file +ersonBeport.'r6ml setelah diu!ah&
<jasperReport name="PersonReport">
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="email" class="java.lang.String"/>
<!-- desain report -->
</jasperReport>
%elan'utnya adalah mem!uat PersonReport.jaa untuk men-
enerate report&
JASPER REPORT | HALAMAN 119
public class PersonReport {
public static void main(String[] args) throws
JRException {
// Siapkan datasource
JRBeanCollectionDataSource dataSource = new
JRBeanCollectionDataSource(prepareDataSource());
// Compile JRXML menjadi Jasper
JasperReport jasperReport = JasperCompileManager
.compileReport(
"/home/dhiku/jasper/PersonReport.jrxml");
// Fill report dengan datasource
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport,
new HashMap(), dataSource);
// Export report
JasperExportManager.exportReportToPdfFile(
jasperPrint,
"/home/dhiku/jasper/PersonReport.pdf");
}
public static List prepareDataSource() {
List users = new ArrayList();
users.add(new Person("1", "Hadikusuma Wahab",
"dh1ku.ilkom@gmail.com"));
users.add(new Person("2", "Endy Muhardin",
"emuhardin@gmail.com"));
users.add(new Person("3", "Ifnu Bima",
"ifnubima@gmail.com"));
return users;
}
}
4iasanya untuk kasus nyata& daftar +erson pada method
prepare(ata%ource() dipanil denan menunakan %P? Kuery.
%etelah kelas +ersonBeport di'alankan maka hasil report dapat
dilihat di /home/dhiku/'asper/+ersonBeport.pdf.
HALAMAN 120 | JAVA SWING
Mengirim Parameter
%elain (ata%ource& adapula parameter yan dapat dikirimkan ke
dalam report. *isalkan kita inin mencetak 'udul report secara
dinamis yan dikirim dari kode Java. 4erikut lankah-lankah
untuk menirimkan parameter&
2. %iapkan parameter di report
View > Parameter
Klik New
Isi parameter name, judul
Klik OK
;. 4erikan parameter ke report
// Compile Report dan siapkan DataSource
HashMap<String, String> param =
new HashMap<String, String>();
// Fill Report
JasperPrint jasperPrint =
JasperFillManager.fillReport(jasperReport,
param, dataSource);
// Export Report
Menggunakan Scriptlet
%criptlet adalah kode Java yan diselipkan pada saat proses fill
report. +roses fill report terdiri dari !e!erapa tahap& scriptlet dapat
men'alankan kode Java pada se!elum dan sesudah tahap-tahap
terse!ut misalnya&
%e!elum atau sesudah report diinisialisasi
%e!elum atau sesudah setiap halaman report diinisialisasi
%e!elum atau sesudah setiap kolom diinisialisasi
%e!elum atau sesudah setiap roup diinisalisasi
%e!elum atau sesudah setiap !aris atau record diinisialisasi
#ntuk mem!uat scriptlet maka kita harus mem!uat se!uah class
yan men-e6tend kelas JB/!stract%criptlet. 4erikut contoh
scriptlet yan akan di'alankan setiap se!elum !aris diinisialisasi&
JASPER REPORT | HALAMAN 121
public class PersonScriplet extends JRAbstractScriptlet {
public int number = 0;
public void beforeDetailEval() throws
JRScriptletException
{
String name = (java.lang.String)getFieldValue("name");
System.out.println("number" + ". " + name);
number++
}
}
#ntuk menunakan kelas +erson%criptlet di dalam +ersonBeport
caranya adalah se!aai !erikut&
Edit > Report Properties
Klik tab Scriptlet Class
Pilih Use this scriptlet class ...
Ketik PersonScriptlet
Jika menunakan packae& maka masukkan full path untuk kelas
scriptlet& misalkan com.artivisi.report.+erson%criptlet. Jalankan
kem!ali kelas +ersonBeport yan sudah di!uat se!elumnya&
seharusnya selain menhasilkan daftar +erson& 'ua akan
mem!erikan output ke console !erupa&
1. Hadikusuma Wahab
2. Endy Muhardin
3. Ifnu Bima
HALAMAN 122 | JAVA SWING
$enutup
(enan ilmu yan sudah diperoleh dalam pelatihan ini& anda sudah
!isa mulai untuk mem!uat proram Java desktop sederhana. +ada
awalnya pasti terasa sulit& sikapi denan pantan menyerah dan
selalu cari cara yan le!ih !aik dalam mem!uat aplikasi.
?ankah selan'utnya anda !isa mulai aktif !ertanya atau men'awa!
hal-hal yan !erhu!unan denan Java. *edia yan !isa diunakan
!anyak sekali& !isa forum milis atau diskusi denan teman. $ni cara
ter!aik untuk menetes apakah pemahaman anda menenai Java
sudah cukup lenkap atau anda masih perlu !ela'ar le!ih !anyak
lai.
%etelah yakin denan kemampuan anda& !erfikirlah untuk
menam!il sertifikasi profesional Java. +elatihan untuk persiapan
sertifikasi Java !anyak tersedia di lem!aa pelatihan. 5alau anda
merasa terlalu !erat menam!il kursus persiapan sertifikasi&
!erlatihlah sendiri menunakan materi yan !anyak tersedia di
internet& misalnya 'avaranch.com.
Cara !ela'ar Java yan palin efektif adalah denan meli!atkan diri
dalam pro'ect !er!asis Java. Jika di perusahaan anda tidak
memunkinkan& di luar sana !anyak sekali pro'ect opensource yan
memerlukan !antuan anda. 4erkun'unlah ke we!site-we!site open
source pro'ect hostin seperti sourcefore.net atau dev.'ava.net
?earn& )ry dan )each adalah formula untuk meninkatkan
penetahuan anda tentan Java. Jika sudah !ela'ar dan sukses
menco!a& tularkan ilmu anda pada oran disekelilin anda& di'amin
ilmunya !akalan !ertam!ah !erlipat-lipat.
REFERENSI DAN BACAAN LEBIH LANJUT | HALAMAN 123
*e&erensi dan (a"aan +ebi'
+anjut
2. Java )utorial : http://'ava.sun.com/docs/!ooks/tutorial/
;. Java (ocumentation : http://'ava.sun.com/'avase/0/docs/
<. 7et!eans $ndonesia : http://roups.yahoo.com/roup/7et!eans-
indonesia/
=. Java #ser "roup $ndonesia : http://roups.yahoo.com/roup/'u-
indonesia/
@. Java (esin +attern : http://www.'avacamp.or/desin+attern/
0. Java (esktop : http://www.'avadesktop.or
3. J"oodies : http://www.'oodies.com
E. %winL : http://www.swinla!s.or

Anda mungkin juga menyukai