Anda di halaman 1dari 129

MATERI PELATIHAN

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 di unakan untuk men em!an kan peran kat lunak !er!asis "#$ ("raphical #ser $nterface). %elain itu& JFC 'u a mempunyai class-class yan di unakan untuk menam!ahkan fun si dan kemampuan interaksi yan variatif dari pemro raman Java. (ari definisi ini& JFC tidak hanya !erisi class-class "#$ sa'a tetapi 'u a class-class lain yan dapat menin katkan kemampuan pemro raman Java !aik dari se i fun sionalitasnya maupun dari se i kemampuan interaksi pemro raman Java yan san at kaya.

Feature JFC
Fitur-fitur yang dipunyai oleh JFC Fitur Komponen Swing Deskripsi Memuat semua class-class yang dibutuhkan untuk membuat aplikasi berbasis G !" dari tombol" table" tab" menu" toolbar dan sebagainya

#ook and Memberikan kemampuan kepada program Ja&a yang Feel $#aF% 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' +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' Menyediakan kemampuan drag-and-drop antara program Ja&a dan program lain yang ditulis spesifik untuk suatu platform sistem operasi tertentu'

Ja&a *D ()!

Drag-anddrop

HALAMAN

2 | JAVA SWING
!nternational Membantu pengembang perangkat lunak untuk i-ation $i./n% 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 mempen aruhi kualitas pro ram yan kita !uat secara si nifikan. ,al ini dikarenakan& dalam dunia Java %tandard -dition& le!ih spesifik la i aplikasi Java yan di!an un men unakan swin & !elum ada framework yan !enar-!enar komprehensif mem!im!in pen em!an untuk mem!uat aplikasi yan !erkualitas. +ada umumnya aplikasi yan dikem!an kan den an %win mempunyai kode yan san at .kotor.& dimana kode yan !erisi pen endalian terhadap event komponen swin !ercampur aduk den an kode yan !erisi aturan !isnis dan kode yan !erisi manipulasi terhadap data.

Swing Package
%win /+$ san at !a us dan len kap& Java 0.1 menyertakan setidaknya tu'uh !elas (23) !uah packa e yan !erisi class-class swin yan siap di unakan.
,a&a0'accessibility ,a&a0'swing ,a&a0'swing'border ,a&a0'swing'colorchooser ,a&a0'swing'e&ent ,a&a0'swing'filechooser ,a&a0'swing'plaf ,a&a0'swing'plaf'basic ,a&a0'swing'te0t ,a&a0'swing'te0t'html

,a&a0'swing'plaf'metal ,a&a0'swing'te0t'rtf ,a&a0'swing'plaf'multi ,a&a0'swing'table

,a&a0'swing'plaf'synth ,a&a0'swing'tree ,a&a0'swing'undo

#tun nya kita tidak akan men unakan semua class-class dalam packa e swin & hanya se!a ian kecil sa'a dari class-class terse!ut yan nantinya akan !enar-!enar kita unakan. %ehin a kita !isa !erkonsentrasi untuk memahami !e!erapa komponen pentin sa'a. (alam modul ini nanti kita hanya akan men unakan !e!erapa class komponen swin yan pentin sa'a. 4e!erapa kelas ini sudah cukup se!a ai !ahan pemem!uat peran kat lunak !erkualitas. 5omunitas Java 'u a menyediakan !anyak sekali li!rary swin & antara lain dari %win 6 dan J"oodies yan men em!an kan

JAVA FOUNDATION CLASS | HALAMAN 3


li!rary standard swin den an menam!ahkan !er!a ai macam feature menarik. %edan kan komunitas dari 'avadesktop.or men em!an kan !anyak sekali li!rary swin untuk keperluan khusus. 7yaris semua komponen yan kita perlukan !aik komponen umum hin a komponen untuk tu'uan khusus !anyak tersedia di internet& kita tin al mencari dan men unakan. +raktek yan !aik dalam memilih komponen apa yan tepat adalah den an mencari dahulu informasi di internet. ,al ini san at !ermanfaat untuk men uran i waktu kita men em!an kan komponen& sehin a kita !isa le!ih !anyak !erkonsentrasi untuk men em!an kan sisi !isnis dan usa!ility dari software yan kita kem!an kan. %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 dian ap a al mem!erikan nilai tam!ah terhadap masalah yan dihadapi hanya karena tampilan "#$-nya san at susah dipahami dan tidak intuitif.

Swing HelloWorld
*en unakan contoh lan sun adalah cara yan tepat untuk memulai proses !ela'ar. Cara ini mem!erikan am!aran kon krit tentan su!'ect yan akan dipela'ari& sehin a proses !ela'ar le!ih cepat diserap. #ntuk tu'uan ini& kita akan mem!uat se!uah pro ram kecil yan menampilkan kata 8,ello9orld: men unakan komponen swin . 4erikut ini adalah lan kah-lan kah yan harus anda lakukan untuk mem!uat pro ram 8,ello9orld: !er!asis komponen swin : 2. ;. <. =. $nstall Java (evelopment 5it (J(5) *em!uat pro ram ,ello9orld itu sendiri *elakukan kompilasi pro ram ,ello9orld *en'alankan pro ram ,ello9orld

Install Java Development Kit


>an perlu kita lakukan dalam lan kah ini hanyalah mendownload J(5 dari we!site 'ava.sun.com. kemudian 'alankan pro ram instalasinya dan ikuti perintah-perintah dalam lan kah-lan kah instalasi terse!ut. %etelah proses instalasi selesai& kita siap untuk mem!uat pro ram Java.

Membuat program HelloWorld

HALAMAN

4 | JAVA SWING

+ro ram Java den an tampilan seperti di atas dapat di!uat den an dua cara. Cara yan pertama adalah den an men unakan te6t editor dan men etik kode pro ram. Cara yan kedua adalah den an men unakan 7et!eans *atisse "#$ 4uilder. ?akukan lan kah-lan kah !erikut ini diatas men unakan te6t editor: 2. ;. 4uka te6t editor kesayan an anda. untuk mem!uat pro ram

5etikkan kode pro ram di !awah ini dan simpan den an 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 pro ram terse!ut den an cara men'alankan pro ram 'avac ('ava compiler). Jika anda !eker'a di lin kun an windows !uka command prompt& kemudian ketik pro ram !erikut ini : c:\latihan> javac HelloWorld.java Jika anda !eker'a di lin kun an "7#/linu6& !uka console dan ketikkan perintah !erikut ini : shell$ javac HelloWorld.java

Menjalankan program HelloWorld


+roses kompilasi akan men hasilkan file yan !erekstensi .class& file inilah yan akan kita eksekusi. Jika anda !eker'a di lin kun an windows lakukan perintah !erikut ini:

JAVA FOUNDATION CLASS | HALAMAN 5


c:\latihan> java HelloWorld Jika anda !ekerka di lin kun an "7#/?inu6 'alankan perintah !erikut ini: shell$ java HelloWorld

Membuat Swing HelloWorld dengan Netbeans 6.1


7et!eans 0.2 dilen kapi den an "#$ !uilder yan dikenal den an *atisse. (alam modul ini selan'utnya& *atisse akan di unakan untuk menye!ut 7et!eans "#$ 4uilder. )ools ini san at powerful dan produktif dalam mem!uat komponen "#$. ?an kah-lan kah yan harus anda lakukan untuk mem!uat %win ,ello9orld den an *atisse adalah se!a ai !erikut: 2. ;. 4uat pro'ect !aru dalam 7et!eans& caranya pilih menu : File > New Project ?an kah !erikutnya anda harus menentukan kate ori 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 kein inan 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 misalnya ,elloworld.'ava& klik finish. =. akan di!uat&

)ampilan 7et!eans akan !er anti den an 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 (esi n 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:. 5lik kanan di file ,ello9orld.'ava pada 'endela e6plorer di se!elah kiri& pilih menu Run File... untuk men compile dan men'alankan class ,ello9orld.'ava atau tekan tom!ol %,$F) A F0.

0.

*atisse mempunyai sistem ?ayoutin yan san at fleksi!le& sistem layout yan di unakan oleh *atisse adalah "roup?ayout. (alam chapter !erikutnya kita akan !ela'ar !a aimana men unakan "roup?ayout ini den an !enar dan memanfaatkan keun ulanya dalam menata component "#$ den an san at rapi. %win helloworld ini hanya se!a ian kecil sa'a dari peker'aan yan harus dilakukan dalam mem!an un aplikasi desktop !er!asis Java. %elan'utnya kita akan mem!ahas pen unaan J?a!el& J4utton& JCheck4o6& J)e6tField dan JBadio4utton untuk mem!uat aplikasi "#$ sederhana den an men unakan *atisse.

KOMPONEN SWING | HALAMAN 7

Komponen Swing
%win toolkit menyediakan !anyak sekali komponen untuk mem!an un aplikasi "#$ desktop. %win toolkit 'u a menyediakan class-class untuk menan ani interaksi antara aplikasi dan user men unakan standard input seperti key!oard dan mouse. 5omponen-komponen yan disediakan swin mencakup semua "#$ toolkit yan laCim di unakan dalam apilasi desktop& seperti : J)a!el& J?ist& J)ree& J4utton& J?a!el dan masih !anyak komponenkomponen lainnya yan sudah teru'i dan siap pakai. %elain komponen "#$& swin 'u a menyediakan fasilitas untuk proses undo& komponen untuk men olah te6t& internationaliCation& 5omponen "#$ yan mendukun penyandan cacat (accessi!ility support) dan fasilitas dra -and-drop. ?ook and Feel merupakan fasilitas yan unik dalam swin . (en an fasilitas ?ook and Feel ini kita !isa den an mudah meru!ah tampilan dari pro ram kita sesuai den an kein inan dan tu'uan kita. *isalnya& a ar pro ram terlihat fancy atau a ar pro ram terlihat konsisten dalam se ala keadaan. %win 'u a menyediakan li!rary Java ;( untuk pen olahan data secara visual& seperti men olah am!ar& o!'ect ;(& !ahkan animasi. %win ?a!s.or menyediakan li!ary %win +ainter yan merupakan pen em!an an dari Java ;(& %win +ainter ini memun kinkan aplikasi swin mempunyai tampilan yan indah dan terlihat profesional. Java 0.1 menam!ahkan !anyak sekali fitur-fitur !aru ke dalam packa e swin & termasuk dukun an untuk li!rary Dpen"? men unakan JD"?& )ray $con dan 9e! %ervice. (en an adanya dukun an ini swin men'adi le!ih poweful dan mempunyai masa depan yan cerah.

Struktur Komponen Swing


%ecara arsitektur& %win di!an un diatas arsitektur /9) (/!stract 9indows )oolkit). /9) adalah "#$ toolkit yan dikem!an kan oleh %un en ineer se!elum swin muncul. 5elemahan utama /9) adalah fleksi!ilitas tampilan "#$& seperti paintin method yan masih san at primitif. %win dimaksudkan untuk memper!aiki kekuran an dari /9) tanpa harus mem!uan teknolo i yan sudah di!uat dan mem!uat

HALAMAN

8 | JAVA SWING
"#$ toolkit !aru dari nol. 5omponen /9) diletakkan dalam satu packa e yaitu 'ava.awt& didalamnya terdapat komponen-komponen "#$ dasar& salah satunya adalah Component. Class Component adalah moyan dari se!a ian !esar komponen /9) maupun %win . Check4o6& ?a!el& 4utton dan !e!erapa komponen /9) lainnya adalah turunan lan sun dari class Component. 7amun dalam kenyataanya arsitektur demikian tidak mem!erikan fleksi!ilitas yan cukup memadai untuk mem!uat !er!a ai macam komponen !aru yan di!utuhkan dalam desktop application. %win muncul den an mem!awa teknolo i /9) yan telah ditam!ahkan den an !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 den an komponen swin men unakan *atisse san at menyenan kan dan mudah. "roup?ayout yan san at fleksi!el memun kinkan kita untuk mem!uat aplikasi den an tampilan seperti yan kita harapkan. ?a!el& te6tfield dan tom!ol adalah komponen-komponen dasar yan selalu ada dalam setiap aplikasi !er!asis desktop. 5eti a komponen ini mempunyai fun si yan san at sederhana& te6tfield menyimpan data !er!entuk te6t (strin ) yan relatif pendek & la!el !anyak di unakan untuk mem!erikan keteran an pen'elas terhadap komponen lain dan tom!ol di unakan user untuk men'alankan satu instruksi tertentu. 4erikut ini adalah contoh aplikasi sederhana yan pen'umlahan dua !uah !ilan an. melakukan

Contoh pro ram men

unakan J?a!el& J)e6tField dan J4utton men unakan *atisse& lakukan

#ntuk mem!uat aplikasi ini lan kah-lan kah !erikut ini: 2.

4uat pro'ect !aru di 7et!eans (kalau sudah mem!uat pro'ect&

KOMPONEN SWING | HALAMAN 9


tidak perlu mem!uat la i) den an cara memilih menu : File > New Project 5emudian ikuti petun'uk yan di!erikan dialo . ;. 4uat class JFrame !aru& caranya den an memilih menu : File > New File 5emudian akan muncul dialo seperti di !awah ini :

penting
Jendela Design menampilkan visualisasi komponen G I! Jendela Sour"e menampilkan kode program dari "lass #ang sedang dibuka! Jendela Sw ing $allete berisikan komponen% komponen sw ing #ang bisa kita drag%and%drop ke dalam jendela design!

Jendela dialo new file <. +ilih kate ori : Java GUI Forms > JFrame Form %eperti terlihat di dialo 7ew File dialo nama +en'umlahan.'ava =. diatas& kemudian !eri

Jendela $roperties digunakan untuk mengedit properti dari komponen #ang sedang akti& dalam jendela design! Jendela Inspe"tor menampilkan semua komponen sw ing dalam "lass #ang sedang akti& baik #ang keli'atan se"ara visual di jendela design atau tidak!

4uat tampilan form seperti am!ar !awah ini& caranya den an klik Jendela +allete di se!alah kanan untuk memilih komponen apa yan akan di!uat& kemudian klik di 'endela (esi n untuk menempatkan komponen yan sudah dipilih tadi ke dalam form. ,asilnya terlihat seperti pada am!ar di !awah ini: Jendela desi n 7et!ens *atisse "anti nama setiap komponen a ar mudah dikenali. 5lik kanan diatas setiap komponen yan ada dalam Jendela (esi n diatas& kemudian pilih menu :

@.

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!l5eteran an& 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 pro ram 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; *enan ani 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 pro ram seperti di !awah ini :

3.

KOMPONEN SWING | HALAMAN 11


private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: } #!ah kode pro ram 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 pro ram. )ekan tom!ol %,$F) A F0& atau klik kanan file +en'umlahan.'ava kemudian pilih menu Bun File. *ethod $nte er.parse$nt di unakan untuk meru!ah %trin men'adi $nte er. *ethod !tn,itun /ction+erformed akan dipan kita memencet tom!ol !tn,itun . il setiap kali

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!

Catatan :

%ekaran anda !isa melihat !ahwa !eker'a den an J?a!el& J)e6tField dan J4utton san at sederhana. #ntuk latihan& silahkan ru!ah fun si yan di unakan dalam pro ram diatas& misalnya perkalian dua !ilan an atau pen uran an dua !ilan an.

Bekerja dengan JCheckBox dan JRadioButton


JCheck4o6 dan JBadio4utton hanya !isa mempunyai dua !uah kemun kinan nilai& !enar atau salah. 5edua komponen ini di unakan untuk merepresentasikan data yan !erupa pilihan. JCheck4o6 di unakan 'ika pilihanya !erupa multiple selection& sedan kan JBadio4utton di unakan 'ika pilihanya !erupa sin le selection. JBadio4utton di unakan misalnya untuk merepresentasikan pilihan 'enis kelamin. JCheck4o6 di unakan misalnya untuk merepresentasikan pilihan ho!!y. 4utton"roup diperlukan untuk men umpulkan JBadio4utton yan mempunyai rup pilihan yan sama. *isalnya rup pilihan 'enis kelamin di unakan untuk men umpulkan JBadio4utton yan

penting
JC 'e"k(o) dan J*adio(utton sebaikn#a digunakan 'an#a jika item pili'an#a sedikit dan tidak bersi&at dinamis

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 lakilaki dan pilihan perempuan !isa dipilih !ersamaan. %tatus dari JBadio4utton dan JCheck4o6 dapat diketahui den an 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 meneran kan pilihan yan diwakilinya. *ethod et)e6t dan set)e6t di unakan untuk memanipulasi te6t. (i!awah ini adalah contoh pro ram yan dan JBadio4utton. men unakan JCheck4o6

Contoh aplikasi men

unakan JCheck4o6 dan JBadio4utton

(i !a ian 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 men unakan JCheck4o6. #ntuk mem!uat pro ram diatas ikuti lan kah-lan kah !erikut ini: 2. 4uat class !aru !ertipe JFrame Form& kemudian !eri nama +ilihan.'ava ;. 4uat tampilan diatas men harus di!uat adalah : unakan *atisse. komponen yan : radio4erwarna dan

(ua o!'ect JBadio4utton 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 (esi n& unakan Jendela $nspector di sisi kiri !awah. <. *asukkan o!'ect radio4erwarna dan radio)ransparan ke dalam o!'ect roup)ipe9arna. Caranya den an : a) *emilih komponen radio4erwarna di Jendela (esi n !) 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 lan kah yan sama terhadap o!'ect radio)ransparan. =. *enan ani event ketika JBadio4utton diklik. Caranya den an : a) *emilih komponen radio4erwarna di Jendela (esi n !) 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 lan kah yan sama terhadap radio)ransparan. @. 4uat se!uah private method untuk menan ani event pemilihan terhadap JCheck4o6. *ethod tampilkan9arna ini nantinya akan dipan il setiap kali salah satu dari JCheck4o6 dipilih. yan dilakukan oleh metod tampilkan9arna adalah men ecek status setiap JCheck4o6& apakah sedan dipilih atau tidak. Jika sedan dipilih maka te6t dari JCheck4o6 terse!ut akan ditampilkan dalam t6t9arna. Class %trin 4uffer di unakan untuk menampun nilai te6t dari

penting
J*adio(utton #ang mempun#ai group #ang sama- 'arus dimasukkan dalam sebua' obje"t (uttonGroup #ang sama!

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. *enan ani !erikut : event pemilihan JCheck4o6. Caranya se!a ai

penting
C lass String(u&&er sangat dianjurkan untuk digunakan sebagai "lass untuk memanipulasi String! $enggabungan string menggunakan operator . sangat tidak dianjurkanapalagi jika ukuran obje"t String%n#a suda' "ukup besar!

a) +ilih komponen chk,i'au di Jendela (esi n. !) 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 pan il 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 pro ram den an menekan tom!ol %,$F) A F0. Cara lain dalam menampilkan pilihan adalah den an men unakan J?ist dan JCom!o4o6. 5edua komponen ini mempunyai fleksi!ilitas yan le!ih tin i dan le!ih mudah di unakan 'ika o!'ect yan dimasukkan dalam pilihan le!ih kompleks. J?ist dan JCom!o4o6 !isa mempunyai Component-ditor a ar pilihan yan ditampilkan tidak hanya !erupa te6t& !isa !erupa warna atau icon. 4a ian !erikutnya akan mem!ahas !a aimana !eker'a men unakan J?ist

KOMPONEN SWING | HALAMAN 15


dan JCom!o4o6.

Bekerja dengan JList dan JComboBox


JCom!o4o6 memerlukan tempat yan minimalis di!andin kan den an JBadio4utton& selain itu JCom!o4o6 mempunyai !entuk Com!o4o6 yan dapat diedit& sehin a memun kinkan user untuk memilih pilihan yan tidak ada dalam item JCom!o4o6.

penting
JC ombo(o) dan J+ist digunakan jika item pili'an bersi&at dinamis! JC ombo(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!

Contoh JCom!o4o6 J?ist memun kinkan multiple selection den an 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 san at fleksi!el& kita dapat menam!ah dan men hapus item di dalamnya den an san at mudah. %ehin a cocok di unakan untuk merepresentasikan pilihan yan item pilihannya !ersifat dinamis. /plikasi di !awah ini adalah contoh pen J?ist. unaan JCom!o4o6 dan

Contoh pro ram men

unakan JCom!o4o6 dan J?ist

4a ian pertama pro ram 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.

HALAMAN

16 | JAVA SWING
4a ian kedua pro ram 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 den an koma (&). $kuti lan kah-lan kah !erikut ini untuk mem!uat pro ram di atas: 2. 4uatlah class JFrame ?ist/ndCom!o.'ava. Form !aru dan !eri nama

;. 4uat tampilan pro ram diatas men tam!ahkan komponen-komponen:

unakan *atisse& kemudian

a) -mpat !uah J?a!el : l!l+eker'aan& l!l+ilihan+eker'aan& l!l,o!!y& l!l+ilihan,o!!y.

penting
Jendela $roperties tidak 'an#a berisi properties dari komponen sw ing #ang sedang akti& tetapi juga berisi ,ab /vents dan ,ab C ode! ,ab /vents digunakan untuk memasukkan kode #ang akan dieksekusi ketika event tertentu dikenakan ter'adap komponen sw ing! ,ab C ode digunakan untuk mende&inisikan kode apa #ang 'arus dieksekusi dalam kondisi tertentu- misaln#a setela' obje"t komponen sw ing diinisialisasi!

!) %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 men unakan Jendela +roperties& Jendela ini letaknya di se!elah kanan !awah& di!awah Jendela +allete dan akan muncul hanya 'ika 'endela (esi n yan dipilih.

Jendela +roperties +ilih komponen JCom!o4o6 di Jendela (esi n& Jendela +roperties akan menampilkan properties dari JCom!o4o6. +ada !a ian model di dalam Jendela +roperties masukkan item +ela'ar& *ahasiswa& +ro rammer& )echnical 9riter dan )ester. %etiap item dipisahkan den an koma (&). =. *eru!ah isi J?ist. +ilih J?ist di Jendela (esi n maka Jendela +roperties untuk J?ist akan muncul. (i !a ian model isikan item : *em!aca& Dlahra a& )rekkin & Codin & *enonton Film& 4ersepeda dan *en a'ar. %etiap item dipisahkan den an koma (&).

KOMPONEN SWING | HALAMAN 17


@. *enan ani pemilihan JCom!o4o6. 5lik kanan JCom!o4o6 di Jendela (esi n& 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 di unakan untuk memperoleh item yan sedan di pilih dalam JCom!o4o6. 0. *enan ani event pemilihan dari J?ist. -vent yan di unakan untuk menan ani pemilihan item dari J?ist !er!eda den an JCom!o4o6. J?ist akan men aktifkan ?ist%election event ketika user memilih item dalam J?ist. #ntuk menan ani event ini& lakukan lan kah-lan kah !erikut : a) 5lik kanan pada J?ist di dalam Jendela (esi n& 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 :

penting
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!

*ethod et%electedFalues dari J?ist men em!alikan item-item yan terpilih.

Bekerja dengan Menu, Popup Menu dan Toolbar


*enu& +opup menu dan )ool!ar di unakan untuk melakukan navi asi dalam aplikasi. den an keti a komponen itu navi asi dalam aplikasi men'adi le!ih fleksi!el dan mudah di unakan oleh user. *enu dan )ool!ar pada umumnya diletakkan di !a ian atas dari aplikasi a ar mudah ditemukan oleh user. %edan kan +opup *enu !isa muncul di mana sa'a sesuai den an konteks aplikasi. J*enu4ar adalah class yan di unakan untuk menampun J*enu. J*enu dapat menampun satu atau le!ih J*enu$tem. J*enu$tem merupakan !a ian terluar dari struktur menu yan tidak !isa mempunyai child. J%eparatordi unakan 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 'u a dapat menerima class JCheck4o6*enu$tem dan JBadio4utton*enu$tem. J+opup*enu mempunyai !anyak kesamaan di!andin kan den an J*enu4ar. +er!edaan utamanya adalah : J*enu4ar hanya !isa

KOMPONEN SWING | HALAMAN 19


!erada di atas se!uah 'endela JFrame. %edan kan J+opup*enu !isa muncul di mana sa'a sesuai den an konteks dari aplikasi. +er!edaan lainnya terletak di dalam pen unaan umum keduanya. J*enu4ar !erisikan menu/instruksi yan !ersifat umum dan !erlaku untuk semua keadaan dalam aplikasi. %edan kan J+opup*enu akan mempunyai menu/instruksi yan !er!eda-!eda !erdasarkan dari konteks aplikasi. Dleh karena itu J+opup*enu terkadan dise!ut 'u a se!a ai konteks menu. )ool!ar mem!erikan cara yan le!ih praktis di!andin kan menu& !ahkan !isa dikatakan !ahwa tool!ar adalah cara cepat untuk men akses menu. Dleh karena itu& setiap item dalam tool!ar!iasanya 'u a tersedia dalam menu. +ada umumnya tool!ar diwakili hanya den an am!ar/icon yan melam!an kan perintah dari tool!arnya. (i internet !anyak tersedia tool!ar icon ratis yan dapat kita unakan. 4er!eda den an J*enu4ar dan J+opup*enu yan hanya !isa menerima menu item& J)ool4ar dapat menampun J4utton atau control lainya. %eperti contohnya : JCheck4o6& JBadio4utton& Jto le4utton dan lainya. 7ormalnya& J)ool4ar akan diisi den an J4utton yan dihilan kan te6t-nya dan di anti den an icon. 5ita 'u a perlu meru!ah dekorasi J4utton a ar tampilannya terlihat cantik dan menarik.

Contoh pro ram den an *enu& +opup *enu dan )ool!ar #ntuk mem!uat pro ram 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 keti a adalah mem!uat )ool!ar.

Membuat Menu
4eker'a den an *enu dalam swin & antara lain : 2. ;. Java meli!atkan enam komponen semua menu& hanya !isa

J*enu4ar : Class yan menampun menampun J*enu se!a ai child.

J*enu : Class yan mempunyai child menu item. 4iasanya J*enu ini yan 'adi child lan sun den an J*enu4ar

HALAMAN

20 | JAVA SWING
<. J*enu$tem : #'un dari menu& disinilah o!'ect /ction diletakkan& sehin a ketika kita memilih J*enu$tem ada action tertentu yan di'alankan aplikasi. JCheck4o6*enu$tem : #'un le!ih mirip JCheck4o6. JBadio4utton*enu$tem : #'un le!ih mirip J4utton. dari menu& namun !entuknya dari menu& namun !entuknya

=. @. 0.

J%eparator : pemisah antar J*enu$tem atau antar J*enu

%etiap komponen menu mempunyai fun si dan ke unaan masin masin . Jika kita perhatikan& menu dalam aplikasi umumnya mempunyai shortcut untuk men akses menu tanpa men unakan !antuan mouse. *isalnya menu File !iasanya dapat diakses men unakan tom!ol /?) A F& menu Format dapat diakses den an /?) A D. Fasilitas shortcut menu ini dise!ut se!a ai 5ey!oard *nemonic. File mempunyai mnemonic F& Format mempunyai mnemonic o& dan seterusnya. +ada umumnya tampilan mnemonic dari se!uah menu diwakili den an huruf yan !er aris !awah.

penting
Jendela Inspe"tor akan memperli'atkan semua komponen sw ing baik #ang terli'at atau tidak terli'at dalam jendela design! Jendela Inspe"tor sangat berguna ketika kita bekerja dengan Menu! $roses penamba'anpengurangan dan pengaturan posisi menu semua dilaksanakan dari Jendela Inspe"tor

*atisse mempunyai fasilitas yan san at D5 untuk !eker'a den an *enu& fasilitas dra -and-dropnya mem!antu !anyak peker'aan mem!an un aplikasi !ar!asis "#$ secara si nifikan. (alam pro ram diatas kita akan mem!uat struktur menu se!a ai !erikut:

%truktur menu dari aplikasi $kuti lan kah-lan kah !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

KOMPONEN SWING | HALAMAN 21


*enu 4ar dari Jendela +allete kemudian klik JFrame di Jendela (esi n. %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 den an strin 8File:. 5emudian set isi properti mnemonic den an strin 8f:& hal ini akan menye!a!kan tampilanya menuFile men'adi File dan user dapat menekan tom!ol /?) A F untuk men aktifkan menu menuFile. =. *enam!ahkan J*enu$tem. ?an kah !erikutnya adalah menam!ahkan J*enu$tem ke dalam J*enu menuFile yan telah di!uat di lan kah 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 !a us& menu yan mempunyai fun si serupa diletakkan dalam urutan !erderdekatan dan dipisahkan den an separator (pemisah). ?an kah menam!ahkan J%eparatortidak !er!eda den an lan kah 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 !aru ke akan !ertindak kanan di J*enu Add > JMenu J*enu. 4erikutnya kita akan menam!ahkan dalam J*enu menuFile. J*enu yan !aru ini se!a ai su! menu. Caranya 'u a sama : klik menuFile kemudian pilih menu : sesuai

4eri nama menu%ettin & set te6t dan mnemonic yan pada Jendela +roperties. 3.

*enam!ahkan JCheck4o6*enu$tem. +erilaku JCheck4o6*enu$tem tidak !er!eda 'auh den an JCheck4o6 !iasa& !edanya hanyalah JCheck4o6*enu$tem !erada dalam struktur menu. Cara menam!ahkan JCheck4o6*enu$tem sama den an komponen lain : klik kanan J*enu menu%ettin kemudian pilih menu : Add > JCheckBoxMenuItem 4eri nama chk?ine7um!er& set te6t dan mnemonic yan pada Jendela +roperties. sesuai

JCheck4o6*enu$tem sedikit sepesial di!andin kan den an J*enu$tem& karena JCheck4o6*enu$tem memiliki properties selected. +roperties selected ini di unakan 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 den an lan kah yan sama den an 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 'u a memerlukan 4utton"roup a ar hanya satu !uah JBadio4utton*enu$tem yan !isa dipilih. Cara menam!ahkan 4utton"roup san at mudah& klik item 4utton"roup dari Jendela +allete kemudian klik Jendela (esi n& 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 kate ori Dther Components& seperti terlihat dalam am!ar di !awah ini : H

KOMPONEN SWING | HALAMAN 23

4utton"roup !erada dalam kate ori 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 !a ian 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 (esi n kemudaian pilih menu Bun File atau tekan tom!ol %,$F) A F0. 4eker'a den an *enu men unakan *atisse san atlah menyenan kan dan produktif. ,al ini !er!eda sekali 'ika harus men etik satu demi satu kode untuk menyusun struktur menu seperti contoh pro ram diatas. *em!uat +opup *enu men unakan *atisse 'u a sama mudahnya. ,anya sa'a kita harus menentukan dimana dan den an

HALAMAN

24 | JAVA SWING
cara apa popup menu itu muncul& apakah den an 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!andin kan den an menu !iasa& hanya sa'a popup menu dapat muncul di mana sa'a& tidak hanya di !a ian 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!a ainya. +opup menu terutama di unakan se!a ai 8conte6t sensitive menu:& dimana menu yan ditampilkan oleh popup menu ter antun konteks dari aplikasi& semisal : komponen apa yan dikenai aksi klik kanan& !a aimana keadaan data dalam komponen terse!ut dan se!a ainya. /plikasi yan memerlukan interaksi yan san at intens den an user se!aiknya men unakan popup menu untuk memudahkan user men akses action tertentu. ,al ini 'auh le!ih praktis di!andin user harus men akses menu dalam J*enu4ar di !a ian atas JFrame. +opup menu dalam contoh pro ram diatas akan muncul ketika user melakukan klik kanan terhadap JFrame. menu yan ditampilkanya pun hanya ada ti a !uah: cut& copy dan paste. $kuti lan kah-lan kah !eritkut ini untuk mem!uat +opup menu : 2. 4uka class )ool!ar*enu.'ava& yan telah di!uat dalam lan kah se!elumnya& dalam Jendela (esi n. ;. 5lik Jendela +allete dan pilih J+opup*enu& kemudian klik Jendela (esi n. %ecara otomatis J+opup*enu akan ditam!ahkan dalam class )ool!ar*enu.'ava. J+opup*enu tidak terlihat dalam Jendela (esi n& namun anda !isa men kasesnya 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 san at sederhana& caranya : klik kanan pada J+opup*enu di Jendela (esi n& kemudian pilih menu : Add > JMenuitem "anti nama o!'ectnya men'adi menuCut& !eralihlah ke Jendela +roperties kemudian set te6t dan mnemonic yan sesuai. ?akukan lan kah 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 menan ani event mouseClick terhadap JFrame. Caranya : a) 5lik kanan JFrame di Jendela (esi n& 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 di unakan apakah tom!ol yan diklik mouse adalah tom!ol se!elah kanan& 'ika nilai kem!alian method et4utton sama den an nilai 4#))D7< maka !enar tom!ol kanan yan ditekan. *ethod show di unakan untuk memunculkan popup menu& parameter pertama diisi den an Component dimana nantinya popup menu akan ditampilkan& sedan kan parameter kedua dan keti a diisi den an letak koordinat popup menu akan ditampilkan. @. %impan file )ool!ar*enu.'ava& compile dan 'alankan. 5emudian co!a munculkan popup menu den an men klik kanan JFrame. +opup menu san at !er una 'ika aplikasi yan kita kem!an kan mem!utuhkan interaksi yan intensif den an user. +opup menu menyediakan cara mudah untuk men akses menu/action yan sesuai den an konteks dari aplikasi.

Membuat ,oolbar
)ool!ar mem!erikan dimensi lain dalam men akses menu d!andin kan menu ataupun popup menu. +ada umumnya )ool!ar merupakan cara sin kat untuk men akses menu. *enu yan diwakili tool!ar adalah menu yan !ersifat umum dan tidak terikat pada konteks tertentu. 5e unaan lain dari tool!ar adalah mempercantik tampilan aplikasi& karena tool!ar !iasanya adalah tom!ol yan didekorasi den an

HALAMAN

26 | JAVA SWING
icon yan menarik. %elain itu tool!ar 'u a mem!erikan kesempatan kepada user untuk men kustomisasi tampilan dari aplikasi. 5arena layout tool!ar san at fleksi!el& user !isa memindah-mindahkan letak tool!ar di dalam aplikasi& di atas& di!awah atau disampin & atau !ahkan men am!an (floatin ) diatas 'endela yan sedan aktif. (alam contoh pro ram diatas kita akan mem!uat se!uah J)ool4ar den an dua !uah J4utton yan telah didekorasi den an icon cantik. $con yan di unakan !anyak tersedia di internet& format file yan dipilih adalah .pn & karena format file ini palin !a us dalam menan ani transparasi komponen. %e!elum mulai mem!uat J)ool4ar& kita perlu mempersiapkan terle!ih dahulu icon yan akan di unakan se!a ai dekorasi J4utton. $kuti lan kah-lan kah !erikut ini : 2. 4uatlah se!uah 'ava packa e !aru untuk menampun semua icon yan akan di unakan. caranya klik kanan di 'endela +ro'ects !a ian nama pro'ect& pilih menu : New > Java Package 4eri nama ima es untuk 'ava packa e yan !aru sa'a kita !uka. ;. *emasukkan $con ke dalam packa e. #ntuk memasukkan ima e ke dalam packa e kita perlu tahu dimana pro'ect disimpan& misalkan pro'ect disimpan dalam folder : c:\javaswing 4uka file e6plorer& kemudian navi asi ke folder c:\javaswing\src\images Copy semua icon yan diperlukan ke dalam folder diatas. <. 4uild pro'ect. ?an kah ini diperlukan untuk men compile semua file .'ava men'adi file .class. %elain itu proses ini 'u a akan men kopi file selain file .'ava (termasuk file icon) ke dalam folder !uildHclasses. Jika proses ini tidak dilaksanakan& maka ketika pro ram di'alankan& file icon tidak akan ditemukan dan pro ram men'adi error .

penting
(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

%etelah proses persiapan selesai& lakukan lan kah-lan kah !erikut ini untuk mem!uat )ool!ar : 2. 4uka class )ool!ar*enu.'ava yan se!elumnya. sudah di!uat di lan kah

;. 4uat se!uah o!'ect J)ool4ar& caranya : klik item J)ool4ar dari Jendela +allete& kemudian klik JFrame di Jendela (esi n. %ecara otomatis se!uah o!'ect J)ool4ar akan dimasukkan ke dalam JFrame. "anti namanya men'adi tool4ar.

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 la i satu !uah J4utton diatas J)ool4ar dan !eri nama !tn*a6imiCe. =. *endekorasi )ampilan J4utton. / ar tampilan J4utton terlihat cantik& kita perlu men eset !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 a ar tom!ol !erukuran le!ih !esar di!andin kan den an icon yan akan di unakan nanti& dan setiap mouse melewati J4utton& ada efek transisi yan cantik. #ntuk men edit !order dari J4utton& *atisse menyediakan Jendela 4order untuk memilih !order yan kita in inkan untuk J!utton. 4order yan dipilih !isa sin le !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 a ar tom!olnya !erwarna transparan& sehin a mempunyai warna !ack round yan sama den an !ack round J)ool4ar. d) $con& anti iconya den an 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 lan kah-lan kah yan sama terhadap J4utton yan lain. @. Compile dan hasilnya. 'alankan class )ool!ar*enu untuk melihat

KOMPONEN SWING | HALAMAN 29

Membuat Dialog dan JFileChooser


(ialo memerankan peran yan pentin dalam aplikasi !er!asis desktop. $nteraksi antara user den an aplikasi terkadan tidak !er'alan den an !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 !a aimana seharusnya user memper!aikinya. *odel interaksi seperti ini tepat dilaksanakan men unakan dialo . %kenario lain adalah ketika aplikasi memerlukan input dari user a ar aplikasi !isa terus melaksanakan tu asnya& misalnya meminta konfirmasi apakah user yakin akan melaksanakan se!uah aksi pentin terhadap aplikasi seperti delete& update atau add data. (ialo 'u a mem!erikan pem!atasan kepada user& se!elum dialo selesai diproses& user tidak akan !isa !erinteraksi den an !a ian aplikasi lainya. (ialo mence ah hal ini ter'adi den an memastikan !ahwa 'endela yan !isa diaktifkan hanyalah 'endela dialo & sedan kan 'endela aplikasi yan lain tidak dapat diaktifkan selama 'endela dialo masih aktif. /plikasi san at serin men unakan dialo untuk !erinteraksi den an user& tetapi 'enis interaksinya selalu sera am dan !erulan -

HALAMAN

30 | JAVA SWING
ulan . %win menyediakan dialo yan didesi n untuk keperluan yan serin muncul dalam aplikasi& seperti JDption+ane dan JFileChooser. %win 'u a menyediakan class J(ialo 'ika kita in in mem!uat dialo custom sesuai kein inan kita.

Membuat pre%de&ined dialog dengan J2ption$ane


JDption+ane menyediakan !e!erapa dialo yan siap pakai dan serin di unakan dalam aplikasi. JDption+ane san at 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 den an mudah. )erdapat empat method utama yan dapat kita unakan se!a ai landasan mem!uat dialo . 5eempat method terse!ut secara rinci di am!arkan dalam ta!le !erikut ini:
*ethod showConfirm(ialo show$nput(ialo (eskripsi *eminta konfirmasi daru user& seperti yes/no/cancel *eminta input dari user& !aik !erupa input te6t men unakan J)e6tField maupun pilihan men unakan JCom!o4o6 *em!eritahukan user tentan apa yan !aru sa'a ter'adi "a!un an dari keti a 'enis dialo diatas

show*essa e(ialo showDption(ialo

)a!le method JDption+ane %win 'u a menyediakan method show$nternalLLL yan 'ika kita !eker'a den an J$nternalFrame. di unakan

+arameter dari keempat method terse!ut men ikuti pola yan konsisten. )erurut dari kiri ke kanan& !erikut ini parameterparameter 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 ten ah-ten ah parent component. Jika nilai dari parentComponent diset null& maka dialo akan men unakan frame default dan dialo akan diletakkan diten ah-ten ah layar monitor (ter antun ?MF). ;. messa e +esan yan deskriptif meneran kan perihal dialo muncul. +ada umumnya messa e !erupa pesan %trin akan diletakkan dalam dialo & namun 'enis o!'ect lain dii'inkan di unakan se!a ai messa e. D!'ect-o!'ect yan yan 'u a 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!a ai messa e !ertipe Component& maka Component terse!ut akan ditampilkan diten ah-ten ah 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 den an men am!il nilai kem!alian dari method to%trin dari setiap o!'ect. <. messa e)ype *endefisikan 'enis dari pesan. +ada umumnya mem!erikan custom icon untuk setiap 'enis pesan. %etiap ?MF mana er akan memperlakukan setiap 'enis pesan den an !er!eda& namun per!edaanya tidak akan terlalu mencolok. +ilihan yan mun kin 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 !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 men unakan empat 'enis set tom!ol diatas& kita dapat mendefisikan tom!ol-tom!ol akan ditampilkan di !a ian

HALAMAN

32 | JAVA SWING
yan akan muncul sesuai ke!utuhan. @. options (eskripsi yan le!ih detail dari set tom!ol yan di unakan dialo . 7ilai yan laCim adalah se!uah array %trin !erisi te6t yan akan ditampilkan di setiap tom!ol. 7amun D!'ect lain 'u a dapat diterima& antara lain: a) Component Component akan diletakkan dalam !aris tom!ol secara lan sun . !) $con %e!uah J4utton akan di!uat dan didekorasi den an icon ini. c) other D!'ect den an tipe selainnya akan diru!ah ke dalam !entuk %trin den an men am!il nilai kem!alian dari method to%trin dari o!'ect terse!ut. 0. icon $con yan di unakan untuk mendekorasi dialo . Jika icon ini didefinisikan maka akan menimpa icon default yan didefinisikan oleh messa e)ype. 3. title Judul dari dialo dialo . E. initialFalue 7ilai default dari pilihan yan mun kin ada dalam dialo . #ntuk le!ih 'elasnya& !erikut ini !e!erapa contoh kode pen JDption+ane !eserta hasil tampilanya : JOptionPane.showMessageDialog(null, "Simple plain dialog","Plain dialig", JOptionPane.PLAIN_MESSAGE); unaan yan diletakkan di !a ian palin atas dari

)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 den an tipe dialo $nformation JOptionPane.showMessageDialog(null, "You neet to be sure to do this action!", "Dialog Peringatan", JOptionPane.WARNING_MESSAGE);

(ialo den an tipe 9arnin JOptionPane.showMessageDialog(null, "Something goes wrong and generate error message", "Error Dialog", JOptionPane.ERROR_MESSAGE);

(ialo den an tipe -rror JOptionPane.showConfirmDialog(null, "Choose yes or no","Confirmation Dialog", JOptionPane.YES_NO_OPTION, JoptionPane.WARNING_MESSAGE);

HALAMAN

34 | JAVA SWING

Dption dialo den an 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 den an tipe messa e $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 den an tipe 9arnin & Dptions !erupa array of %trin dan initialFalue O ./pple.

KOMPONEN SWING | HALAMAN 35 Membuat JFileC'ooser


JFileChooser di unakan untuk !ernavi asi dalam file system& kemudian memilih satu atau le!ih file atau folder dari list file dan folder. JFileChooser pada dasarnya adalah pen em!an an dari dialo yan dapat di unakan untuk memilih file. JFileChooser dapat di unakan se!a ai dialo untuk menyimpan file atau untuk mem!uka file. JFileChooser hanya mem!erikan fasilitas untuk memilih file atau folder& sedan kan mekanisme untuk menyimpan atau mem!uka file dilakukan sendiri men unakan li!rary $/D. /plikasi !erikut ini adalah contoh pen mem!uka dan menyimpan file. unaan JFileChooser untuk

Contoh pro ram men

unakan JFileChooser

)ampilan JFileChooser ketika tom!ol open ditekan adalah seperti di !awah ini :

)ampilan JFileChooser #ntuk mem!uat aplikasi diatas lakukan lan kah-lan kah !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 den an am!ar diatas. <. )am!ahkan se!uah o!'ect JFileChooser se!a ai field dari class Chooser& !eri nama chooser. public class Chooser{ JFileChooser chooser = new JFileChooser(); //kode lain di sini } File7ame-6tentionFilter di unakan se!a ai file filter dalam JFileChooser. *etode filterin nya adalah mencocokkan ekstensi file dalam file system den an 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 den an 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 men etahui dimana direktori aktif aplikasi& kita !isa men unakan 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)); *en handle event penekanan tom!ol !tn%ave. 5etika tom!ol !tn%ave ditekan& chooser akan menampilkan dialo save file& kemudian men am!il nama file yan dipilih dan menampilkannya dalam t6t%ave& serta menampilkanya dalam l!l%tatus. 4erikut ini kodenya :

=.

@.

0.

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. *en handle penekanan tom!ol !tnDpen. 5ode untuk menan ani penekanan tom!ol !tnDpen mirip den an kode untuk menan ani 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()); } } Compile dan 'alankan aplikasinya den an menekan tom!ol %,$F) A F0

E.

4eker'a den an JDption+ane dan den an JFileChooser san at sederhana. 5eduanya men unakan modal dialo untuk men am!il input dari user. *odal dialo akan mence ah user men akses !a ian aplikasi lain se!elum dialo ditutup& atau dalam hal ini memutuskan pilihan apa yan diam!il oleh user. *asih !anyak la i komponen swin yan disediakan oleh J(5& anda tin al melan'utkan mem!aca dari referensi yan di!erikan modul ini pada !a ian 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 ti a lapisan& *odel& Fiew dan Control. *FC termasuk dalam arsitektural desi n pattern yan men hendaki or anisasi kode yan terstruktur dan tidak !ercampur aduk. 5etika aplikasi sudah san at !esar dan menan ani struktur data yan kompleks& harus ada pemisahan yan 'elas antara domain model& komponen view dan kontroler yan men atur penampilan model dalam view. /rsitektur *FC ini memun kinkan adanya peru!ahan dalam domain model tanpa harus men u!ah code untuk menampilkan domain model terse!ut. ,al ini san at !ermanfaat ketika aplikasi mempunyai domain model dan view komponen san at !esar dan kompleks.

(ia ram 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!a ai Java 4ean. Java 4ean adalah class Java !iasa atau +DJD (+lain Dld Java D!'ect). %yarat se!uah +DJD dian ap se!a ai Java 4ean adalah : 2. *empunyai constructor default& constructor yan tidak mempunyai parameter. ;. %emua field-field yan !isa diakses dilen kapi den an 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 men artikan model ini se!a ai 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 men akses 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!a ai service. %ervice diimplementasikan dalam !entuk class-class yan dise!ut se!a ai mana er& misalnya %P?*ana er& +rint*ana er& Beport*ana er& L*?*ana er& 9e!%ervice*ana er dan seterusnya. (en an !e itu 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!a ainya. Fiew 'u a !ertan un 'awa! untuk menan kap interaksi user terhadap sistem& semisal : klik mouse& penekanan tom!ol key!oard& !arcode scannin dan se!a ainya. Controller se!enarnya hanya sekumpulan kode-kode untuk mensinkronisasi keadaan *odel dan Fiew. Jika ada peru!ahan data dari *odel& Controller harus men update tampilan Fiew. (an se!aliknya 'ika user mem!erikan event terhadap Fiew& Controller harus men update *odel sesuai den an hasil interaksi user terhadap Fiew.

Model dalam Komponen Swing


%e!a aian !esar komponen swin mempunyai model. J4utton mempunyai model yaitu 4utton*odel yan meme an .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 meme an 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 !a aimana data disimpan dan diam!il dari komponen swin . *isalnya kita mempunyai aplikasi spreadsheet yan men unakan komponen J)a!le& karakteristik utama spreadsheet adalah !anyak cell yan koson & den an !e itu kita !isa memilih model data yan sesuai den an karakteristik terse!ut. Contoh lainnya adalah J)a!le yan di unakan untuk menampilkan data dari data!ase den an 'umlah !aris luar !iasa !anyak. 5ita !isa men atur a ar 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 a ar aplikasi tetap responsif walau !eker'a den an data yan !esar. *odel dalam komponen swin 'u a mempunyai keuntun an lain& yaitu tidak perlu ada dua data terpisah& untuk struktur data aplikasi dan untuk komponen swin . 5e unaan *odel yan cukup pentin 'u a 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 menan ani event yan muncul. %e!a ai contoh& untuk menam!ahkan item dalam J?ist kita !isa meman il method add$tem dari J?$st. +enam!ahan item dalam J?ist ini akan men aki!atkan ?ist*odel memicu event dalam J?ist dan listener lainnya. 5omponen swin S 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!a ai *FC& tetapi pada dasarnya arsitektur komponen swin tidak sepenuhnya *FC. 5omponen swin secara umum di!uat a ar 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!a ai 8/rsitektur den an *odel yan terpisah:. %elan'utnya kita akan mem!ahas !e!erapa model yan serin kali harus kita kustomisasi sesuai den an ke!utuhan. %edan kan model yan nyaris tidak pernah kita ru!ahS4utton*odelStidak di!ahas dalam !a ian 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 a ar efisien di unakan dalam aplikasi. Jika kita tidak hati-hati& maka aplikasi kita !isa men'adi san at lam!at dan tidak efisien. )a!le*odel adalah interface yan di unakan 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. (en an adanya data-data ini J)a!le dapat secara efisien menentukan !a aimana 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 di unakan 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 men em!alikan nilai false& artinya semua cell tidak dapat diedit. 5emudian method setFalue/t adalah method koson !elaka& artinya 'ika kita meman il method ini tidak akan ter'adi apa-apa. Class kedua adalah (efault)a!le*odel yan telah men implementasi semua method a!stract dari interface )a!le*odel. Bepresentasi data (efault)a!le*odel men unakan 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 men implement interface )a!le*odel seperti class Customer)a!le*odel diatas. %etelah )a!le*odel selesai didefinisikan kita tin al meman il method set)a!le*odel dari o!'ect J)a!le& atau mem!uat o!'ect J)a!le !aru men unakan constructor yan menerima ar umen )a!le*odel. Contohnya seperti poton an 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 sekali us& ?ist*odel dan ?ist%election*odel. ?ist*odel di unakan untuk mendefinisikan item/element yan dikandun oleh J?ist. %edan kan ?ist%election*odel di unakan untuk mendefinisikan !a aimana representasi data 'ika ter'adi proses pemilihan di J?ist. %eperti halnya )a!le*odel& ?ist*odel mempunyai dua class yan men implement ?ist*odel& /!stract?ist*odel dan (efault?ist*odel. 5ita !isa men unakan salah satu dari ti a tipe

KONSEP MVC | HALAMAN 43


terse!ut untuk mem!uat o!'ect ?ist*odel. Cara pertama den an mem!uat class !aru yan men implement ?ist*odel. Cara kedua den an mem!uat class !aru yan mene6tends /!stract?ist*odel dan cara keti a den an lan sun men unakan (efault?ist*odel. %truktur data J?ist tidak terlalu rumit seperti J)a!le& dan pada umumnya& cukup hanya den an men unakan (efault?ist*odel sudah memenuhi se!a aian !esar ke!utuhan pen unaan J?ist. 4erikut ini contoh !a aimana mem!uat ?ist*odel untuk data customer& contoh ini men unakan cara kedua untuk mem!uat o!e'ct ?ist*odel& yaitu den an cara mem!uat class !aru yan men e6tends /!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 san at mudah dan tidak serumit )a!le*odel& namun implementasi dari ?ist%election*odel san at rumit& karena kita harus men implementasi dua puluh !uah method. ?e!ih !aik men unakan 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 san at !er una di unakan untuk mendesi n komunikasi yan konsisten antara o!'ect yan !erdiri sendiri dan o!'ect-o!'ect yan !er antun padanya. D!server desi n pattern meli!atkan dua o!'ect utama& o!'ect pertama !erlaku se! ai %u!'ect dan o!'ect lainya !erlaku se!a ai 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 re ister-unre ister terhadap %u!'ect. Jika D!server tertarik den an perilaku dan keadaan dari %u!'ect& D!server dapat mere ister dirinya kepada %u!'ect. 4e itu 'u a se!aliknya 'ika D!server tidak tertarik terhadap keadaan atau perilaku %u!'ect& D!server tidak perlu melakukan res istrasi atau kalau sudah terlan'ur re uister dapat melakukan unre ister. %u!'ect mempunyai !anyak aspek perilaku dan keadaan yan dapat dipantau oleh D!server. #ntuk setiap aspek& %u!'ect menyediakan method untuk re ister-unre ister dan menyediakan interface yan harus diimplement oleh D!server yan in in memantau aspek terse!ut. +ada satu titik tertentu& %u!'ect akan mem!eritahu (notify) D!server tentan perilaku atau keadaanya. %u!'ect akan men umpulkan informasi tentan keadaan atau perilakunya kemudian men irimkan pesan kepada D!server lewat interface yan telah disepakati keduanya& pola ini dikenal 'u a se! ai -vent+assin . +attern D!server dimaksudkan untuk men uran i keter antun an satu o!'ect terhadap o!'ect lain& istilah kerennya adalah (ecouplin . (en an mekanisme re ister-unre ister& 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 !a ian !erikutnya kita akan melihat !a aimana pattern D!server diimplementasikan dalam swin . /kan di'elaskan pula !a aimana swin men implementasikan mekanisme re isterunre ister dan notify dalam menan ani 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!a ai ?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!a ai -vent o!'ect. %edan kan ke'adian ketika %u!'ect melakukan notify kepada D!server dise!ut se!a ai -vent tri erin . / ar pen'elasan diatas mudah dipahami& kita akan mem!uat aplikasi sederhana yan men implementasikan 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 den an penekanan enter. 5etika user menekan enter& %u!'ect akan menotify D!server. (alam proses notifikasi terse!ut& %u!'ect men umpulkan 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 menun u user untuk memasukkan satu kata dan menekan enter. *isalnya dalam contoh diatas 8ifnu:. 5emudian %u!'ect akan men himpun 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 den an 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 menan ani 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 'u a method :

HALAMAN

46 | JAVA SWING
2. Constructor yan menerima parameter %trin & parameter ini di unakan se!a ai pen enal (name) dari o!'ect %u!'ect. ;. Be ister-unre ister D!server (re ister?istener& remove?istener) <. *ethod private untuk menotify D!server (tri er?istener) =. *ethod untuk menerima input kata dari user (run+ro ram) 4erikut ini kode len kapnya : 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 di unakan se!a ai 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 dipan il 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 men implement interface 5ey!oard+ressed?istener dan nantinya akan didaftarkan ke su!'ect se!a ai D!server. *ethod key+ressed diimplementasikan den an 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(); } } ?an kah-lan kah adalah : dalam men unakan pattern D!server ini

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 pro ram utamanya subject.runProgram(); +attern D!server ini di unakan secara intensif dalam komponen swin . )erutama untuk menan an i event dari input peripheralS key!oard& mouse& !arcode readerSyan ter'adi di komponen swin SJ)e6tField& J4utton& J)a!leS. (alam !a ian-!a ian selan'utnya kita akan !ela'ar !a aimana menan ani event pada komponen swin .

ActionListener
/ction?istener di unakan untuk menden arkan 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 ar umen 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 di unakan untuk men am!il command strin yan didefinisikan oleh J4utton. (i !a ian se!elumnya kita telah !eker'a men unakan komponen swin & dan sudah !erlatih !a aimana menan ani event klik mouse terhadap J4utton. *ari kita lihat la i aplikasi sederhana !erikut :

Contoh aplikasi sederhana yan menan ani event action-vent pada J4utton *enan ani klik mouse pada J4utton dalam 7et!eans cukup den an memilih J4utton di Jendela (esi n 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 menan ani penekanan tom!ol di !a ian !awah !aris //)D(D. %e!enarnya 7et!eans men- enerate !e!erapa la i kode di !a ian yan tidak dapat diedit& !erikut ini cuplikanya : btnHitung.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt){ btnHitungActionPerformed(evt); } }); *ethod add/ction?isterner ini mempunyai fun si yan sama den an method re ister?istener pada class %u!'ect yan kita !ahas di !a ian se!elumnya. add/ction?isterner !erfun si 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 men implementasi interface /ction?istener. )etapi 7et!eans mem!uat anonymous innerclass yan men implement 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 men implement interface /ction?istener <. *en implementasi method a!strac action+erformed =. *ethod action+erformed dari class tak !ernama ini akan meman il method !tn,itun /ction+erformed dari class parentnya. %ecara umum 7et!eans akan mem!uat se!uah anonymous innerclass seperti diatas untuk setiap penan anan event. (ari sisi kerapian kode metode ini san at !a us& karena 7et!eans menyem!unyikan kerumitan kode untuk menan ani event seperti diatas. 5ita tidak perlu susah-susah mem!uat se!uah pu!lic class D!server tersendiri untuk menan ani event. Cukup den an anonymous innerclass.

KeyListener
5ey?istener akan menden arkan penekanan tom!ol oleh komponen yan !erada dalam keadaan fokus. %emua komponen swin dapat menerima 5ey?istener se!a ai D!server. 5ey?istener dapat menden arkan ti a event !er!eda : penekanan tom!ol& pelepasan tom!ol dan pen etikan tom!ol. 5eti anya ditan ani oleh method yan !er!eda-!eda& yaitu : key+ressed : dipan il ketika ter'adi penekanan tom!ol key!oard. keyBeleased : dipan il ketika tom!ol key!oard dilepaskan. key)yped : dipan il ketika tom!ol diketikkan& alias ditekan kemudian dilepaskan. *ethod ini dipan il 'ika tom!ol yan ditekan mempunyai representasi karakter unicode& seperti tom!ol an ka dan tom!ol huruf. %edan kan penekanan tom!ol modifiers seperti /?)& C)B?& /BBD9& C/+%?DC5& 7#*?DC5& $7% dan lainnya tidak akan men aki!atkan method ini dipan il. 5eti a method diatas menerima parameter 5ey-vent. #ntuk men etes tom!ol apakah yan ditekan oleh user& di unakan method et5eyCode. 5emudian hasil kem!alian method et5eyCode di!andin kan den an field static kepunyaan class 5ey-vent yan diawali den an huruf F5& seperti : F5N-7)-B& F5N/& F5N4& F5N2& F5N?-F)N/BBD9 dan seterusnya.

MENANGANI EVENT | HALAMAN 51


*ethod et5eyChar di unakan untuk menentukan karakter apa yan diwakili oleh tom!ol yan ditekan. Jika tom!ol yan ditekan adalah tom!ol modifiers maka method et5eyChar akan men em!alikan karakter 5ey-vent.C,/BN#7(-F$7-(.

/plikasi sederhana yan menan ani penekanan tom!ol key!oard #ntuk mem!uat aplikasi yan menden arkan penekanan tom!ol key!oard seperti diatas lakukan lan kah-lan kah !erikut ini : 2. ;. <. =. 4uat class JFrame !aru& !eri nama Frame5ey+ressed. )am!ahkan dua l!l5ey)yped. !uah J?a!el& !eri nama l!l%tatus dan event

l!l%tatus di unakan untuk menandakan adanya key+ressed dan keyBeleased yan ter'adi !erurutan

l!l5ey)yped di unakan untuk menandakan adanya tom!ol yan diketik.

@. +ilih JFrame di Jendela (esi n& 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 (esi n& 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 (esi n& 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 menden arkan interaksi mouse terhadap komponen swin . *ouse?istener dapat didaftarkan pada semua komponen swin . *ouse?istener menden arkan 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 menin alkan 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 'u a dapat didaftarkan se!a ai listener pada semua komponen swin . *ouse*otion?istener dipisahkan dari *ouse?istener karena penan anan event mouse*ove yan le!ih !erat dan intensif. *ouse*otion?istener menden arkan dua envent: mouse*oved : ter'adi ketika user men erakkan mouse diatas komponen swin mouse(ra ed : ter'adi ketika user menekan tom!ol mouse sekali us men erakkanya diatas komponen swin %emua method diatas menerima ar umen !erupa class *ouse-vent. *ethod etClickCount di unakan untuk menentukan 'umlah click yan ter'adi dalam waktu yan !erdekatan. *ethod etClickCount 'u a di unakan untuk menentukan apakah klik yan ter'adi adalah sin le klik atau dou!le klik. *ethod et4utton di unakan untuk menentukan tom!ol mana yan ditekan oleh user. +ada umumnya mouse yan tersedia di pasaran mempunyai ti a tim!ol yan dapat di klik& tom!ol kiri& tom!ol ten ah dan tom!ol kanan. *ethod et4utton akan men em!alikan nilai *ouse-vent.4#))D72 'ika tom!ol kiri ditekan& *ouse-vent.4#))D7; 'ika tom!ol ten ah ditekan dan *ouse-vent.4#))D7< 'ika tom!ol kanan ditekan. *ethod etL dan et> akan men em!alikan koordinat dimana *ouse-vent ter'adi. 5oordinat yan di unakan 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):& sedan kan event move hanya akan memunculkan koordinat 8(6&y): sa'a.

Contoh aplikasi sederhana yan men ani *ouse-vent ?akukan lan kah-lan kah !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 (esi ner& klik kanan dan pilih menu : Set Layout > Null Layout ?an kah ini !ertu'uan untuk mem!uat a ar JFrame men unakan null layout. 5alau tidak men unakan 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 menan ani penekanan tom!ol mouse& kemudian men u!ah te6t J?a!el dan memindahkan J?a!el ke posisi dimana event mouseClicked ter'adi.

0. 3.

+ilih JFrame la i di Jendela (esi n& klik kanan dan pilih menu : Events > MouseMotion > mouseMoved

*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()); } Compile dan 'alankan aplikasi di atas.

E.

*asih !anyak la i -vent-?istener yan disediakan oleh J(5. (ari !a! di atas kita sudah dapat men erti den an !aik konsep -vent?istener dan pattern D!server yan mendasarinya. (en an kemampuan ini kita !isa den an mudah men erti !a aimana event-listener yan lain !eker'a. -vent-?istener 'u a dapat di'alankan terhadap Java 4ean men unakan +ropertyChan e?istener dan +roperty-vent. 5onsep ini dapat di unakan untuk men amati 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 di unakan Java untuk melakukan koneksi den an aplikasi lain atau den an !er!a ai macam data!ase. J(4C memun kinkan kita untuk mem!uat aplikasi Java yan melakukan ti a hal: konek ke sum!er data& men irimkan Kuery dan statement ke data!ase& menerima dan men olah 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*%) men unakan pemro raman Java. den an men unakan J(4C /+$& kita !isa mem!uat pro ram yan dapat men eksekusi %P?& menerima hasil Besult%et& dan men u!ah data dalam data!ase. J(4C /+$ 'u a mempunyai kemampuan untuk !erinteraksi den an lin kun an terdistri!usi dari 'enis sum!er data yan !er!eda-!eda. J(4C /+$ adalah !a ian 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!a i dalam dua packa e yaitu : 'ava.sKl dan 'ava6.sKl. ;. J(4C (river *ana er Class (river*ana er dari J(4C !ertu as untuk mendefisikan o!'ect-o!'ect yan dapat di unakan untuk melakukan koneksi ke se!uah sum!er data. %ecara tradisional (river*ana er telah men'adi tulan pun un arsitektur J(4C. <. J(4C )est %uite J(4C )est %uite mem!antu kita untuk mencara driver mana yan cocok di unakan 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 den an lancar. =. J(4C-D(4C 4rid e

HALAMAN

56 | JAVA SWING
4ri e ini menyediakan fasilitas J(4C untuk melakukan koneksi ke sum!er data men unakan D(4C (Dpen (ata4ase Connectivity) driver. %e!a ai catatan& anda perlu meload driver D(4C di setiap komputer client untuk dapat men unakan !rid e ini. %e!a ai konsekuensinya& cara ini hanya cocok dilakukan di lin kun an intranet dimana isu instalasi tidak men'adi masalah. (en an keempat komponen yan dipunyainya& J(4C men'adi tools yan dapat diandalkan untuk melakukan koneksi& men am!il data dan meru!ah data dari !er!a ai 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*ana er. %um!er data yan di unakan 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 'u a komunitas atau pihak keti a menyediakan data!ase driver untuk se!uah sum!er data tertentu. +erlu dipahami sekali la i !ahwa data!ase driver !ersifat spesifik untuk setiap 'enis sum!er data. *isalnya& (ata!ase (river *y%Kl hanya !isa di unakan untuk melakukan koneksi ke data!ase *y%Kl dan !e itu 'u a data!ase driver untuk +ost re %P? 'u a hanya !isa di unakan untuk melakukan koneksi ke data!ase +ost re %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 den an se!utan Java Connector (J/Connector). (ata!ase driver !iasanya di!un kus dalam file yan !erekstensi 'ar. %etiap data!ase driver harus men implement interface 'ava.sKl.(river.

Membuat Koneksi
*elakukan koneksi ke data!ase meli!atkan dua lan kah: *eload driver dan mem!uat koneksi itu sendiri. Cara meload driver san at mudah& pertama letakkan file 'ar data!ase driver ke dalam classpath. 5emudian load driver den an 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. *eman il method Class.for7ame secara otomatis mem!uat instance dari data!ase driver& class (river*ana er secara otomatis 'u a dipan il untuk men elola class data!ase driver ini. Jadi anda tidak perlu men unakan statement new untuk mem!uat instance dari class data!ase driver terse!ut. ?an kah !erikutnya adalah mem!uat koneksi ke data!ase men unakan data!ase driver yan sudah diload tadi. Class (river*ana er !eker'a sama den an interface (river untuk men elola 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 seran kaian tes untuk menentukan driver mana yan akan di unakan. +arameter yan di unakan untuk menentukan driver yan sesuai adalah #B?. /plikasi yan akan melakukan koneksi ke data!ase menyediakan #B? pen enal dari server data!se terse!ut. %e!a ai contoh adalah #B? yan di unakan 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 tin al mem!aca dokumentasi terse!ut tanpa harus khawatir tidak menemukan informasi yan anda perlukan. *ethod (river*ana er. etConnection !ertu as untuk mem!uat koneksi: Connection conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/latihan); (alam ke!anyakan kasus anda 'u a harus memasukkan parameter username dan password untuk dapat melakukan koneksi ke dalam data!ase. *ethod etConnection menerima #sername se!a ai parameter kedua dan pasword se!a ai parameter keti a& sehin a 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 di unakan untuk melakukan koneksi den an #B? terse!ut& maka koneksi ke data!ase !erhasil dilaksanakan. Class Connection akan meme an informasi koneksi ke data!ase yan didefinisikan oleh #B? terse!ut. %etelah sukses melakukan koneksi ke data!ase& kita dapat men am!il data dari data!ase men unakan perintah Kuery ataupun melakukan peru!ahan terhadap data!ase. !a ian !erikut ini akan meneran kan !a aimana cara men am!il dan memanipulasi data dari data!ase.

Mengambil dan Memanipulasi Data dari Database


+roses pen am!ilan data dari data!ase memerlukan suatu class untuk menampun data yan !erhasil diam!il& class terse!ut harus men implement interface Besult%et. D!'ect yan !ertipe Besult%et dapat mempunyai level fun sionalitas yan !er!eda& hal ini ter antun dari tipe dari result set. ?evel fun sionalitas dari setiap tipe result set di!edakan !erdasarkan dua area: (en an cara !a aimana result set itu dapat dimanipulasi 4a aimana result set itu menan ani peru!ahan data yan dilakukan oleh proses lain secara !ersamaan (concurrent). )>+-NFDB9/B(ND7?> : result set terse!ut tidak !isa !er'alan mundur& reslut set hanya !isa !er'alan ma'u dari !aris pertama hin a !aris terakhir. result set hanya men am!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 hin a terakhir atau !er erak !e!as !erdasarkan posisi relatif atau a!solute.

J(4C menyediakan ti a tipe result set untuk tu'uan !er!eda: 2.

;.

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 hin a terakhir atau !er erak !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 di unakan untuk men'alankan perintah Kuery dalam data!ase kemudian men em!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 men am!il data dari data!ase yan hasilnya dipe an 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 men erakkan kursor ma'u& mundur& ke suatu posisi relatif atau ke suatu posisi a!solute tertentu& unakan method-method dari Besult%et: ne6t() -- men arahkan kursor ma'u satu !aris. previous() -- men arahkan kursor mundur satu !aris. first() -- men arahkan kursor ke !aris pertama. last() -- men arahkan kursor ke !aris terakhir. !eforeFirst() -- men arahkan kursor ke se!elum !aris pertama. after?ast() -- men arahkan kursor ke setelah !aris terakhir. relative(int rows) -- men arahkan kursor relatif dari posisinya yan sekaran . %et nilai rows den an nilai positif untuk ma'u& dan nilai ne atif untuk mundur. a!solute(int row7um!er) Q men arahkan kursor ke posisi tertentu sesuai den an nilai row7um!er& dan tentu sa'a nilainya harus positif.

$nterface Besult%et menyediakan method etter untuk men akses nilai dari setiap kolom dalam !aris yan sedan aktif. +arameter fun si etter !isa menerima nilai inde6 dari kolom ataupun nama kolomnya. 7amun !e itu& pen unaan nilai inde6 le!ih efisien di!andin men unakan nama kolom.

HALAMAN

60 | JAVA SWING
7ilai inde6 dimulai den an satu hin a !anyaknya kolom. +en unaan nama kolom adalah case insensitive& artinya huruf kecil atau huruf !esar tidak men'adi masalah. et%trin di unakan untuk men am!il kolom den an tiper data char& varchar atau tipe data strin lainya. et$nt di unakan untuk men am!il kolom den an tipe data inte er. 4erikut ini dalah contoh pro ram len kap dari melakukan koneksi hin a men am!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 men em!alikan result set& tetapi men em!alikan se!uah nilai inte er 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'"); *en unakan e6ecutePuery dan e6ecute#pdate san at mudah dan fleksi!le& namun san at tidak efisien& +repared%tatement menawarkan keun ulan dalam !entuk efisiensi.

Menggunakan PreparedStatement
*eman il method e6ecute#pdate !erulan -ulan & misalnya melakukan insert ratusan atau ri!uan !aris& san at tidak efisien.

KONEKSI DATABASE DENGAN JDBC | HALAMAN 61


,al ini dise!a!kan karena (4*% harus memproses setiap Kuery yan dikirimkan dalam !e!erapa lan kah: memparsin Kuery& men compile Kuery dan kemudian !aru men eksekusi Kuery terse!ut. +repared%tatement menawarkan solusi yan le!ih !aik dalam menan ani 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 di unakan. 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!andin kan men unakan method %tatement.e6ecute#pdate. 4erikut ini contoh pem!uatan +repared%tatement men unakan 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!a ai parameter. 5ita !isa mem!erikan nilai yan !er!eda ke dalam parameter dalam setiap peman ilan +repared%tatement. *ethod set%trin & setFloat& set$nt dan !e!erapa method lain di unakan untuk memasukkan nilai dari setiap parameter. *ethod terse!ut mempunyai dua parameter& parameter pertama adalah int yan di unakan 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 ter antun dari method yan di unakan. 4erdasarkan kode diatas& !erikut ini contoh pen unaan method +repared%tatement.set%trin : ps.setString(1,andy); ps.setString(2,rizal); 5ode diatas mem!erikan contoh !a aimana 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. %ehin a peman ilan Kuery oleh +repared%tatement !erdasarkan kode diatas sama den an Kuery statement di !awah ini : update T_PERSON set name = 'andy' where name = 'rizal' 4erikut ini contoh len kap pen unaan +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 keun ulan +repared%tatement di!andin kan %tatement.e6ecute#pdate.

Batch Execution
*isalnya kita in in men -insert seratus !aris data dalam se!uah loop& kita !isa men unakan fasilitas !atc e6ecution dari +repared%tatement. !atch e6ecution men umpulkan semua eksekusi pro ram yan akan dilaksanakan& setelah semuanya terkumpul !atch e6ecution kemudian men irimkan kumpulan eksekusi pro ram secara !ersamaan ke (4*% dalam satu kesatuan. *etode ini san at efisien karena men uran i overhead yan diperlukan pro ram untuk !erkomunikasi den an (4*%. (alam contoh di !awah ini kita akan men unakan !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 dipan il untuk men isikan se!uah strin ke dalam +repared%tatement& kemudian method add4atch dipan il untuk men umpulkan !atch dalam satu wadah. %etelah iterasi selesai& method e6ecute4atch dipan il untuk melaksanakan semua keseratus instruksi insert secara !erurut den an sekali sa'a melaksanakan koneksi ke data!ase.

Menangani Transaction
(ukun an transaction oleh J(4C ter antun den an (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 men unakan $nno(4 se!a ai sistem ta!lenya& kalau kita men unakan *y$%/* maka transaction tidak didukun . )ransaction merupakan konsep pentin dari data!ase. )ransaction memastikan peru!ahan data dilaksanakan den an 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 lo ika harus di!atalkan (roll!ack). *ari kita evaluasi kode diatas a ar men unakan transaction& sehin a 'ika satu proses insert a al& 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 !a ian yan san at pentin dari aplikasi data!ase. +en unaan pattern yan sesuai dapat mem!erikan manfaat san at !esar. +attern yan serin di unakan dalam akses data!ase adalah (/D ((ata /ccess D!'ect) dan %ervice/Facade pattern. 5edua pattern ini di unakan untuk menerapkan 8separation of concern: atau pemisahan kode proram !erdasarkan fun si kode pro ram. %emua kode untuk akses data harus dipisahkan den an kode untuk pen aturan user inteface. ,al ini memun kinkan kode akses data yan di!uat untuk aplikasi desktop& den an mudah

HALAMAN

64 | JAVA SWING
di unakan untuk aplikasi we!. +enerapan konsep separation of concern secara disiplin& dapat men hasilkan kode pro ram yan dapat dites secara otomatis men unakan J#nit atau (4#nit. #nit testin merupakan paramater utama dalam menentukan apakah kode pro ram yan kita hasilkan mempunyai mutu yan tin i atau tidak. Covera e unit testin yan tin i mencerminkan kode pro ram yan !erkualitas tin i pula. (ao pattern !erisi semua kode untuk men akses data& seperti Kuery. %emua kode yan sepesifik terhadap implementasi akses data !erhenti di sini& lapisan le!ih atas tidak !oleh tahu !a aimana akses data diterapkan& apakah men unakan J(4C murni atau ,i!ernate atau J+/. ?apisan lainya hanya perlu tahu fun sionalitas dari suatu method di dalam (/D class& tidak perlu tahu !a imana method terse!ut diimplementasikan. Class (/D akan mempunyai method seperti save& delete& et4y$d atau et/ll. +raktek yan laCim di unakan adalah satu !uah -ntity/)a!le akan mempunyai satu !uah class (/D. (i !awah ini adalah contoh Class (/D men ta!le )NC/)-"DB> : unakan J(4C untuk

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 di unakan 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 den an men elompokkan class-class (/D dalam satu modul aplikasi ke class %ervice. *isalnya (/D yan !erhu!un an den an user mana ement ke dalam class #ser%ervice. )ransaction diatur dalam class %ervice& praktek yan laCim di unakan adalah satu method dalam class service adalah satu scoop transaction. Jadi ketika method dalam service mulai dieksekusi transaction akan dimulai (!e in)& 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 !a aimana cara men unakannya : 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 men enal J(4C& kita akan mem!ahas cara men akses data!ase yan le!ih !aik den an man unakan J+/. (en an men unakan J+/ kode pro ram yan akan di!uat akan le!ih rin kas dan terlihat konsep DD+ di!andin den an J(4C murni. J+/ adalah framework DB* untuk memetakan ta!el dalam data!ase dan class dalam konsep DD+. (en an men unakan J+/ kode pro ram 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 men unakan data!ase. 5onsep data!ase relasional sudah populer 'auh se!elum konsep o!'ectoriented di unakan oran . Dleh karena itu& apapun !ahasa pemro raman yan kita unakan& men unakan data!ase adalah suatu keniscayaan. (alam interaksi kita den an 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 penin katan kiner'a (performance) +ada !uku ini kita akan mem!ahas tentan framework yan dise!ut D!'ect/Belational *appin (DB*). J+/ termasuk framework dalam kate ori DB*. (en an kita men unakan 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 pelan annya den an cara mem!uat nilai tam!ah di produk mereka& yan mem!edakan produknya den an produk pesain . 7ilai tam!ah ini tentunya di!erikan dalam !entuk fitur-fitur can ih yan dimiliki data!ase. 5arena antarmuka utama data!ase dan user (dalam hal ini pro rammer) adalah perintah %P?& maka kita sekaran melihat !anyak sekali per!edaan %P? antar merek data!ase. 4ahkan untuk kasus sederhana sa'a& men am!il 21 !aris pertama dari hasil Kuery& para vendor data!ase ini tidak !isa sepakat. +er!edaan ini san at menyulitkan !ila kita in in mem!uat produk aplikasi. #ntuk men'an kau pasar yan luas& produk kita harus !isa di unakan di !er!a ai kondisi dan konfi urasi. 5ita harus !isa mendukun pelan an yan men unakan +ost re%P? maupun Dracle. +er!edaan dialek %P? menye!a!kan kita harus men eluarkan !iaya tam!ahan untuk mendukun !er!a ai 'enis data!ase. Framework DB* men'em!atani antara kode pro ram den an %P?. 5ita tidak la i men'alankan %P? sesuai merek data!ase& tapi kita men unakan Puery ?an ua e yan disediakan DB*. 4ila suatu

HALAMAN

72 | JAVA SWING
saat kita in in men anti data!ase& kita cukup men konfi urasi DB* untuk !er anti dialek.

$erbedaan konsep relasional dan obje"t%oriented


Cara !erpikir kita dalam mendesain struktur ta!el data!ase san at !er!eda den an paradi ma 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 !a aimana kita menyatakan !ahwa o!'ect a sama den an o!'ect b. (i dalam !ahasa Java& kedua o!'ect dinyatakan sama 'ika !erada dalam lokasi memori yan sama& sehin a !isa di!andin kan den an operator OO. %elain itu& kita 'u a !isa mem!uat definisi kita sendiri tentan kesamaan den an cara men -override method eKuals. (i data!ase& suatu record dise!ut sama den an record lainnya !ila kedua record memiliki nilai primary key yan sama dan tersimpan dalam ta!el yan sama. 4ahasa pemro raman !erorientasi o!'ek seperti Java men enal konsep inheritance. (en an konsep ini& !anyak teknik pemro raman can ih yan !isa dilakukan. 5onsep ini tidak ada di data!ase. Belasi di kode Java ditentukan oleh method yan kita sediakan untuk navi asi. %e!a ai contoh& !ila satu Cate ory memiliki !anyak /rticle di dalamnya& ada !e!erapa kemun kinan yan !isa dilakukan: class Cate ory !isa melihat semua /rticle dan se!aliknya& /rticle tahu dalam Cate ory apa dia !erada public class Category { public List<Article> articles; } public class Article { private Category category; } class /rticle tahu tentan Cate ory& tapi Cate ory !isa melihat /rticle yan ada di dalamnya

JAVA PERSISTENCE API (JPA) | HALAMAN 73


public class Category { } public class Article { private Category category; } class Cate ory !isa melihat isi /rticle& tapi /rticle tidak tahu Cate ory tempat dia disimpan. public class Category { public List<Article> articles; } public class Article { } (ata!ase tidak men enal konsep navi asi. 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 Cate ory den an Kuery seperti ini select * from Article where category_id = ? DB* men'em!atani per!edaan ini& sehin kode pro ram den an le!ih rapi. a kita !isa mem!uat

$eningkatan kinerja
/da !anyak hal yan !isa kita lakukan untuk men optimasi akses data!ase& diantaranya: data!ase connection poolin laCy-loadin deferred %P? men uran i hit ke data!ase Kuery result cache #rusan connect/disconnect dari data!ase merupakan urusan yan rumit. 4anyak lan kah yan terli!at di sana& misalnya inisialisasi koneksi& proses otentikasi& dan se!a ainya.

HALAMAN

74 | JAVA SWING
/plikasi !esar !iasanya men optimasi urusan connect/disconnect ini den an men unakan teknik connection poolin . +ada waktu dinyalakan& aplikasi lan sun mem!uat !anyak koneksi sekali us (pool). 4ila ada kode pro ram yan in in men unakan 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. (en an cara ini& overhead proses connect/disconnect dapat dikuran i. (en an men unakan DB*& semua koneksi data!ase diatur di satu tempat& sehin a men u!ah konfi urasi dari koneksi !iasa men'adi connection-poolin tidak !erpen aruh !esar terhadap keseluruhan kode pro ram. )idak semua data yan kita am!il dari data!ase akan di unakan. 5adan kala se!a ian !esar data yan diam!il akan di!uan . )entunya ini mem!oroskan ker'a C+#& pen unaan memori& dan 'u a !andwidth. 4e!erapa DB* mendukun fitur laCy-loadin & yaitu men am!il data kalau !enar-!enar diperlukan. 4ila aplikasi kita men unakan DB*& perintah %P? ke data!ase dieksekusi oleh DB*& !ukan oleh kode pro ram kita. 5arena itu& DB* memiliki ke!e!asan untuk men'alankan %P? kapan sa'a& asal tidak men acaukan aplikasi kita. 5e!e!asan ini di unakan oleh DB* untuk menunda dan men umpulkan eksekusi %P?& sehin a !isa di'alankan secara efisien. +ada aplikasi !esar& umumnya application server dan data!ase server diinstal di mesin yan !er!eda. #ntuk men aksesnya di unakan akses melalui 'arin an (network). Dleh karena itu& akses ke data!ase harus diperhitun kan den an teliti& a ar tidak terlalu !anyak perintah atau data yan 8menye!eran i: 'arin an. DB* senantiasa !erusaha men uran i komunikasinya den an data!ase& sehin a kiner'a aplikasi dapat ditin katkan. *en am!il data dari memori selalu 'auh le!ih cepat daripada men am!il data dari disk atau 'arin an. 5arena kontrol penuh yan dimilikinya atas hu!un an ke data!ase& DB* dapat men unakan cache den an leluasa. DB* dapat men amati data mana yan 'aran !eru!ah& dan kemudian akan menyimpannya di memori (cache). 4ila kode pro ram kita meminta data terse!ut& DB* tidak perlu men akses data!ase& melainkan lan sun men am!ilnya dari cache. $ni akan san at 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 den an li!rary implementasi J+/& yaitu toplink essensial. 5ita tin al 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 men i it 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 *en elompokkan artikel ke dalam kate ori *em!erikan komentar untuk masin -masin artikel /rtikel memiliki informasi tentan penulis (author) /uthor dapat lo in ke dalam aplikasi

Dasar-dasar ORM
Mapping Seder'ana
#ntuk contoh awal& kita akan melakukan mappin untuk class Category. Class ini hanya memiliki ti a 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 'u a den an nama property di kode Java dan nama kolom di ta!el data!ase. +ada !a ian selan'utnya& kita akan lihat

HALAMAN

76 | JAVA SWING
!a aimana cara memetakan nama yan !er!eda. J+/ mendukun dua cara untuk mem!uat pemetaan& den an L*? dan /nnotation. 5ita akan men am!il pendekatan /nnotation& karena le!ih mudah dan sederhana. (en an 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 konfi urasi J+/. 7et4eans 0.2 mempunyai fasilitas yan memudahkan konfi urasi J+/. ?an kah pertama adalah mem!uat koneksi ke dalam data!ase *y%P? den an men unakan data!ase tools net!eans. 4uka ta! service& kemudian e6pand !a ian data!ase. 5alau kita !elum mempunyai data!ase& kita !isa mem!uat data!ase terle!ih dahulu den an 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. ?an kah !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. Jan an lupa untuk mencek pilihan 8Bemem!er +assword:. 5oneksi ini nanti akan kita unakan untuk mem!uat +ersistence #nit. +ersistence #nit adalah konfi urasi yan di unakan oleh J+/ untuk meletakkan parameter username& password& url dan dialect yan di unakan untuk melakukan koneksi ke data!ase. +roses mem!uat +ersistence #nit san at mudah& pilih menu : file new file persistence persistence unit

JAVA PERSISTENCE API (JPA) | HALAMAN 77

*asukkan koneksi yan sudah di!uat pada lan kah se!elumnya di !a ian 8(ata!ase Connection:. 5emudian pilih 8)a!le "eneration %trate y: a ar ketika kita akan men'alankan aplikasi& semua ta!le akan di enerate dari -ntity. 5ita akan mem!ahas le!ih lan'ut tentan -ntity di !a! !erikutnya& tidak perlu !in un dahulu& tenan sa'a. ,asil dari +ersistence #nit adalah file L*? den an mana persistence.6ml dan terletak di packa e *-)/-$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" transactiontype="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 den an otomatis men unakan tools dari net!eans& dan 'an an di!uat secara manual den an diketik& karena file 6ml terse!ut case sensitif dan harus !enar secara sintask& sehin a kalau diketik manual akan !eresiko men hasilkan kesalahan ketik.

Men#impan dan Mengambil 2bje"t


%ekaran & konfi urasi sudah siap. 5ita akan menco!a untuk menyimpan dan men am!il o!'ect dari data!ase den an men unakan J+/. (emonstrasi sederhana dapat di!uat den an class sederhana yan memiliki method main& sehin a !isa di'alankan. 4erikut keran kanya.

JAVA PERSISTENCE API (JPA) | HALAMAN 79


public class DemoJpa { public static void main(String[] xx){ } } %elan'utnya& kode pro ram kita akan di!uat dalam method main.

/ntit#ManagerFa"tor#
+ertama& kita harus mem!aca konfi urasi yan sudah kita !uat tadi. 5onfi urasi yan telah diaktifkan akan men hasilkan o!'ect EntityManagerFactory. EntityManagerFactory ini hanya di!uat sekali sa'a sepan'an aplikasi !er'alan. EntityManagerFactory entityManagerFactory=

penting
Jangan terlalu lama men#impan obje"t /ntit#Manager! (iasan#a- session dibuka di aw al met'oddan segera ditutup di ak'ir met'od! /ntit#Manager J$0 tidak sama dengan koneksi database! Koneksi database dikelola ole' /ntit#ManagerFa"tor#!

Persistence.createEntityManagerFactory("JpaPU"); %ecara default& J+/ akan mencari persistence.xml dalam *-)/-$7F. file yan !ernama akan

%elan'utnya& kita instankan dulu o!'ect Category yan 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 men !isa lan sun menyimpan o!'ect terse!ut unakan EntityManager J+/. Jan an lupa men den an unakan

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 lan sun ditutup. %iklus hidup EntityManager !er!eda den an -ntity*ana erFactory. -ntity*ana erFactory umurnya sama den an aplikasi& di!uat satu !uah& pada saat aplikasi mulai di'alankan& dan di unakan terus sepan'an aplikasi !er'alan. 5ita !isa mem!a i-pakai (share) -ntity*ana erFactory ke !er!a ai o!'ect yan !er'alan !er!aren an (concurrent)& karena -ntity*ana erFactory di!uat secara thread-safe& sehin a aman untuk pemakaian multi-threadin . )api kita tidak !isa men unakan EntityManager di !anyak o!'ek sekali us. %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 'u a !isa diam!il den an cara yan tidak 'auh !er!eda. 4ila kita sudah tahu $( o!'ect terse!ut& kita !isa lan sun men am!ilnya dari data!ase. 5ode untuk mem!uka EntityManager& men'alankan transaction& menyelesaikan transaction (commit)& dan menutup EntityManager tidak ditulis& karena sama den an 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? la i. )api ini tidak !erarti kita !oleh tidak men erti %P?. %eperti kita akan lihat pada !a ian selan'utnya& pemahaman %P? san at pentin a ar kita !isa men unakan J+/ den an optimal.

JAVA PERSISTENCE API (JPA) | HALAMAN 81 Membuat skema database


+ada contoh se!elumnya& kita mem!uat ta!el di data!ase den an men unakan perintah %P? lan sun di data!ase. %e!etulnya& J+/ 'u a !isa mem!uatkan ta!el untuk kita. )am!ahkan !aris !erikut dalam konfi urasi persistence.xml. <property name="toplink.ddl-generation" value="createtables"/> /da !e!erapa opsi yan !isa toplink.ddl- eneration ini& yaitu: di unakan untuk property

drop-and-create-tables: den an opsi ini& J+/ akan mem!uat semua ta!el pada saat inisialisasi -ntity*ana erFactory. 4e itu -ntity*ana erFactory 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 men am!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 keran ka CategoryDao. public class CategoryDao { public void save(Category cat){} public Category findById(Integer id){} } %elan'utnya& CategoryDao !utuh -ntity*ana erFactory untuk melakukan interaksi den an 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 lo ika untuk menentukan apakah operasi save yan akan dilakukan adalah insert atau update. 5onvensi yan di unakan adalah: 'ika id dari entity masih null maka entity terse!ut !elum ada di dalam data!ase& sehin a 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 men etes kiner'a CategoryDao. 4uat class (emo(ao yan memiliki method main. $sikan kode pro ram !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 men am!il data& kita 'u a !isa men unakan method findById. 4uat class JpaDemo len kap den an method main. $si method main adalah se!a ai !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!a ai !erikut: ID: 1 Name: Tutorial JPA Description: Belajar JPA

Pemetaan Relasi
%elan'utnya& setelah kita dapat men konfi urasi dan melakukan test terhadap ker'a J+/& sekaran kita !isa melan kah ke topik yan le!ih !ermanfaat& yaitu mem!uat mappin yan le!ih !era am. +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 aplikasi. dapat lo in ke

Author : mencerminkan penulis yan men aran 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. %edan kan class Author menyimpan informasi !erkaitan tentan informasi personal& seperti nama len kap& tan al lahir& dan se!a ainya. Group : !erisi !anyak User& pen aturan i'in akses. unanya nanti untuk memudahkan

Category : mencerminkan kelompok artikel. /da kate ori !erita& osip& opini& dan se!a ainya Article Comment : komentar atas artikel tertentu ,u!un an antar class terse!ut dapat di am!arkan se!a ai !erikut:

%truktur o!'ect tidak sama den an struktur data!ase& walaupun a ak mirip. 4erikut adalah struktur ta!el dalam data!ase.

JAVA PERSISTENCE API (JPA) | HALAMAN 85

%ekaran & setelah kita men etahui desain o!'ek dan desain data!ase& mari mulai melakukan pemetaan.

Pertimbangan dalam pemetaan


%eperti sudah disin un sekilas dalam !a ian se!elumnya& ada !e!erapa ketidak sesuaian (mismatch) antara desain o!'ek dan desain data!ase. ,u!un an antar ta!el di data!ase 'auh le!ih sederhana daripada hu!un an antar class di aplikasi !erorientasi o!'ek. (alam kaitannya den an hu!un an antar class& ada !e!erapa hal yan harus kita perhatikan& yaitu: kasta class navi asi 'enis collection optionality transitive persistence

HALAMAN

86 | JAVA SWING
*ari kita !ahas satu persatu.

Kasta
J+/ men enal ti a 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!un i. 5arena 'aman sudah semakin can ih& satu oran !isa dihu!un i di !anyak nomer& yaitu nomer telepon rumah& kantor& ponsel "%*& ponsel C(*/& dan 'u a nomer fa6. #ntuk men elompokkan semua nomer ini& kita mem!uat satu class khusus yaitu ContactNumber. +emetaan o!'ek seperti ini dise!ut den an 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& !a aimana kita akan menyimpan data ini ke data!aseR (ata!ase tidak men enal tipe data khusus. 5ita hanya !isa men unakan tipe data yan telah disediakan seperti $7)& atau F/BC,/B. 5ita tidak !isa mem!uat tipe data !aru ContactNumber dalam data!ase. /da ti a alternatif yan !isa kita unakan untuk memetakan ContactNumber ke data!ase. )i a alternatif ini mencerminkan kasta o!'ect dalam J+/. 2. 5asta tertin i& 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 den an 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 di unakan untuk menentukan kasta suatu o!'ect. (en an men unakan kriteria ini& kita dapat memetakan desain o!'ect ke desain relasional den an !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!un an den an 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 di unakan oleh class Author. Class ini !ahkan tidak memiliki referensi ke class induknya& yaitu class Author. $ni ditun'ukkan oleh hu!un an composition antara class Author dan ContactNumber. Dleh karena itu& data ContactNumber dimasukkan ke dalam ta!el yan sama den an 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!un an den annyaR (ata Author masih akan tetap tersimpan walaupun Article yan ditulisnya dihapus. )idak demikian halnya den an ContactNumber. 4e itu data Author dihapus& data ContactNumber tidak memiliki relevansi la i. D!'ect yan memiliki kandidat -ntity. <. Jumlah #ntuk memahami pentin nya 'umlah dalam pemetaan& mari kita lihat hu!un an antara Article dan Comment. kehidupan sendiri merupakan

%atu Article memiliki !e!erapa Comment. %ama den an ContactNumber& kehidupan Comment 'u a san at ter antun pada Article. 5alau Article dihapus& Comment tidak la i 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

(en an mempertim!an kan keti a hal di atas& !erikut adalah kasta untuk masin -masin o!'ect dalam desain domain model kita.
Class
/rticle /uthor Cate ory Comment Contact7um!er "roup #ser #ser?evel -ntity -ntity -ntity Component Falue )ype -ntity -ntity Falue )ype

Kasta

7avigasi
5ita harus memikirkan urusan arah navi asi (direction) dalam merancan pemetaan. (ua class dikatakan memiliki navi asi dua arah (!idirectional) apa!ila kita dapat men akses class yan satu dari class yan lain& dan se!aliknya. %e!a ai contoh& User dan Group mempunyai hu!un an !idirectional& 'adi kode Javanya kirakira seperti ini. public class User { private Set<Group> groups = new HashSet<Group>(); } sedan kan 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 men akses class Author. )api dari class Author kita tidak dapat men akses 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 navi asi ini hanya ada di kode Java. /papun desain navi asi yan kita !uat& tidak mempen aruhi struktur ta!el kita.

Jenis Colle"tion
(alam desain kita di atas& ada !e!erapa hu!un an one-to-many dan many-to-many. #rusan many ini direpresentasikan dalam Java den an men unakan Collections Framework. 5ita men enal !e!erapa interface dalam Collections Framework den an sifatnya masin -masin : Set : D!'ek yan disimpan dalam Set tidak !oleh ada yan sama. Set tidak !isa men in at urutan. Jadi kita tidak !isa men harapkan o!'ek yan dimasukkan pertama akan muncul pertama 'u a. Set !iasanya diinisialisasi den an men unakan implementasi HashSet. List : 4er!eda den an Set& List mampu men in at urutan. +erilakunya mirip den an array. 5ita dapat men atur urutan o!'ek yan disimpan di dalamnya. D!'ek List !isa diurutkan melalui perintah order by dalam %P?& atau den an adanya nilai inde6& yan menun'ukkan urutan o!'ek di dalam List. 4iasanya List diinisialisasi den an implementasi ArrayList. SortedSet : $nterface ini di unakan !ila kita in in menyimpan o!'ek yan tidak !oleh sama& tapi men in inkan ada urutan tertentu. 5ita dapat memasan Comparator ke dalam SortedSet untuk men atur urutan penyimpanan o!'ek. 4iasanya SortedSet diinisialisasi men unakan TreeSet. Map : $nterface ini menyimpan pasan an key dan value. 4iasanya diinisialisasi men unakan HashMap.

JAVA PERSISTENCE API (JPA) | HALAMAN 91

5ita memiliki !e!erapa hu!un an many dalam domain model kita. 4erikut adalah pemilihan 'enis collection !eserta pertim!an annya.
Relasi
/uthor Q -mail

Collection
%etT%trin U

Pertimbangan
alamat email tidak !oleh terduplikasi. 4usiness reKuirement tidak men haruskan adanya prioritas tertentu antar email kita in in menampilkan daftar artikel !erdasarkan tan al ter!itnya.

/uthor Q /rticle

?istT/rticleU

/rticle Q Comment

?istTCommentU urutan masuknya komentar san at pentin & karena ter'adi diskusi antar pen un'un . #ntuk memastikan urutan& kita men unakan ?ist den an nilai inde6. %etT"roupU %atu user tidak !oleh tercatat dua kali se!a ai mem!er roup yan sama %atu roup tidak !oleh diikuti dua kali oleh satu user yan sama

#ser Q "roup

"roup Q #ser

%etT#serU

2ptionalit#
*asalah optionality ini hanya ada di sisi data!ase. (ari sudut pandan desain o!'ect& optionality tidak men'adi pertim!an an. *ari kita lihat la i relasi antara User dan Author. +ada kasus kita& satu User pasti memiliki satu Author& dan se!aliknya. (esain seperti ini direalisasikan di data!ase den an ((? !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 forei n key author_id. 5olom author_id terse!ut di!erikan atri!ut NOT NULL karena dia adalah forei n key& sehin a harus diisi. (esain seperti ini akan men'adi masalah 'ika !usiness reKuirement menentukan !ahwa User !elum tentu punya informasi Author (optional). Jika men unakan desain di atas& maka kita terpaksa

HALAMAN

92 | JAVA SWING
men hilan kan atri!ut NOT NULL pada author_id. Cara ini kuran ele an& karena forei n key tidak diperuntukkan a ar !isa diisi NULL. (i !e!erapa merek data!ase& forei n key dilaran NULL. Cara yan le!ih !aik adalah den an men unakan 'oin ta!le. %kema data!ase den an '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!an kan faktor optionality dalam mendesain struktur ta!el data!ase.

,ransitive $ersisten"e
,al lainnya yan harus dipertim!an kan dalam melakukan pemetaan adalah efek suatu operasi entity (save& update& delete) terhadap entity lain yan terhu!un den annya. *isalnya& author -ndy menulis artikel !aru. 4erikut kode pro ram 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 men hasilkan error& yan menye!utkan !ahwa o!'ect tutorial !elum ada di data!ase& sehin a tidak !isa dihu!un kan den an 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 men hilan kan perintah save terhadap o!'ect tutorial den an men aktifkan transitive persistence& yaitu cascade-save. (en an opsi ini& !e itu o!'ect endy di-save& J+/ akan melakukan save terhadap semua o!'ect yan terhu!un den an o!'ect endy. )ransitive persistence 'u a dapat diaplikasikan untuk update dan delete. %etelah kita memahami pertim!an an 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 di unakan 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 men unakan 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 !a aimana UserLevel ini akan disimpan dalam ta!el& yaitu: ordinal : menyimpan nilai inde6 dari enum terse!ut. CD7)B$4#)DB akan disimpan den an nilai 2& -($)DB den an nilai ;& dan /(*$7$%)B/)DB den an nilai <. Drdinal adalah modus default. strin : menyimpan nilai teks enum. (i data!ase& nilainya akan disimpan se!a ai 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>(); } (en an informasi mappin di atas& T_AUTHOR_EMAIL akan terlihat seperti ini. ta!el T_AUTHOR dan

+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 men i'inkan duplikasi di dalamnya.

JAVA PERSISTENCE API (JPA) | HALAMAN 95

One to One
Dne to Dne men hu!un kan dua entity. 5ita men unakan hu!un an ini untuk Author dan User. >an perlu diperhatikan hanyalah class User& karena navi asinya cuma satu arah. 4erikut class User. public class User { @OneToOne @JoinColumn(name = "author_id", nullable = false) private Author author; } 5ita men atur kolom forei n key author_id a ar tidak !oleh null. $ni !erkaitan den an masalah optionality yan sudah di'elaskan di atas.

Many to One
+ada contoh aplikasi kita& mappin *any to Dne ada pada hu!un an antara class Article dan Category. 7avi asinya satu arah& dari Article ke Category. (en an 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& den an mappin @ManyToOne se!a ai !erikut. public class Article { @ManyToOne @JoinColumn(name = "category_id", nullable = false) private Category category; } (eklarasinya tidak 'auh !er!eda den an @OneToOne. +emetaan di atas mencerminkan skema data!ase se!a ai !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 men unakan sortin di sisi data!ase melalui perintah order by. ,u!un an ini ada antara Author dan Article. 5arena hu!un annya 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 den an 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 men hasilkan struktur ta!el data!ase se!a ai !erikut.

JAVA PERSISTENCE API (JPA) | HALAMAN 97

5ita men unakan anotasi @OrderBy untuk menentukan urutan munculnya Article. Jika anotasi terse!ut kita hilan kan& J+/ akan men urutkannya !erdasarkan id. +ada mappin di atas& kita men unakan keyword mappedBy. 5eyword ini dikenal 'u a den an atri!ut inverse=true pada mappin L*?. 5eyword inverse atau mappedBy mem!eritahukan J+/ !ahwa isi List adalah -ntity o!'ect& !ukan Component. (en an demikian& kalau o!'ect Author dihapus& J+/ tidak akan otomatis men hapus 'u a Article.

penting
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#aJ$0 tidak ta'u apaka' &oreign ke# aut'or8id tersebut suda' dipetakan atau belum! Ini sebabn#a mengapa kita 'arus menggunakan ke#w ord inverse!

%elain men atur masalah keter antun an& keyword inverse ini 'u a men atur 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 den an forei n key author_id yan ada dalam ta!el T_ARTICLE. (en an demikian& satu hu!un an forei n key dipetakan dua kali oleh J+/. 5onsekuensinya& dua mappin ini akan men hasilkan dua kali eksekusi %P?. Co!a perhatikan skenario !erikut.

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); Ban kaian kode pro ram di atas akan men hasilkan eksekusi %P? se!a ai !erikut: select * from T_AUTHOR where id=100; riainto insert into ins T_ARTICLE T_ARTICLE (title, (title, author_id) author_id) es values val ('Belajar ('Belajar JPA',JPA', 100);100); va ho up update T_ARTICLE set author_id=100 where title='Belajar JPA'; 5ita lihat di atas& J+/ men'alankan %P? update& padahal ause!elumnya r au pid author_id sudah diset menurut id auth i s Pr@h

au@i auUrpidau9ri or_id

JAVA PERSISTENCE API (JPA) | HALAMAN 99


Article tutorial = new Article(); endy.getArticles().add(tutorial); entityManager.persist(endy); D!'ect tutorial tidak akan tersimpan memper!aikinya& kita lakukan seperti ini: Article tutorial = new Article(); tutorial.setAuthor(endy) entityManager.persist(tutorial); ke data!ase. #ntuk

4ila kita sudah men aktifkan transitive persistence& maka kita !isa melakukannya seperti ini: Article tutorial = new Article(); tutorial.setAuthor(endy) entityManager.persist(endy); 4a aimana 'ika kita in in mem!alik sisi inverseR *isalnya& kita in in a ar J+/ men a!aikan sisi Article. 5eyword mappedBy atau inverse tidak dapat di unakan 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 hilan kan sa'a mappedBy. public class Author { @OneToMany @OrderBy("publishDate") private List<Article> articles = new ArrayList<Article>(); }

Many to Many
4ila kita sudah men uasai pemetaan Dne-to-*any& maka *any-to*any tidak sulit. +er!edaannya hanya terletak di anotasinya. >an tadinya @OneToMany& di anti men'adi @ManyToMany. %ama den an 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 di unakan untuk men atur nama ta!el dan kolom dalam ta!el perantara. Jika kita men hilan kan anotasinya& maka J+/ akan mencari ta!el !ernama T_GROUP_T_USER den an nama kolom groups_id dan members_id. 4erikut adalah struktur ta!el data!ase yan di atas. dipetakan oleh anotasi

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 terpen aruh. %e!a ai contoh& kita akan men unakan relasi parent-child ini pada hu!un an antara Author dan Article. 4ila Author dihapus& maka seluruh Article yan pernah ditulisnya 'u a akan ikut terhapus.

JAVA PERSISTENCE API (JPA) | HALAMAN 101


#ntuk men aktifkan parent-child ini& kita u!ah pemetaan di sisi Author se!a ai !erikut. public class Author { @OneToMany( mappedBy = author, cascade = CascadeType.ALL ) @OrderBy("publishDate") private List<Article> articles = new ArrayList<Article>(); } +ada contoh di atas& kita men aktifkan fitur cascade untuk semua 'enis operasi& yaitu save& update& dan delete. 4ila kita hanya in in 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 men am!il data dari data!ase. 4er!a ai pilihan cara ini disesuaikan den an preferensi pro rammer. /da oran yan le!ih menyukai aya %P? karena le!ih rin kas dan mudah. /da 'u a yan le!ih menyukai aya pro rammatic !erorientasi o!'ek karena type-safe. 4e!erapa pro rammer yan merupakan alumni *icrosoft /ccess 'u a !isa ikut menikmati J+/ den an Puery 4y -6ample.

JPA Query Language (JPAQL)


J+/P? adalah !ahasa Kuery J+/ yan mirip den an %P?. 4edanya& dalam J+/P? kita men unakan 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 men hasilkan semua o!'ect Article yan dalam data!ase. ada

$agination
4ila aplikasi kita menyimpan ri!uan artikel& tentunya kita in in men am!il data secara !ertahap& halaman per halaman (pa in ). %P? yan di unakan untuk pa ination ini !iasanya !er!eda antar data!ase. (en an J+/& kita !isa men unakan satu J+/P? sa'a. J+/ nantinya akan mener'emahkan sesuai den an merek data!ase yan kita unakan. #ntuk men am!il artikel per halaman& kita overload method findAll a ar menerima parameter startIndex dan pageSize. +arameter startIndex adalah inde6 yan menun'ukkan record pertama dalam halaman& sedan kan 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
4a aimana kalau kita mau men irim parameter ke KueryR J+/ mendukun parameter !indin & mirip den an PreparedStatement di J(4C. 4ila kita in in men am!il artikel yan !erikut kodenya. ditulis pen aran tertentu&

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 'u a !isa men unakan parameter !ertipe java.util.Date. Contohnya !ila kita in in mendapatkan artikel yan diter!itkan setelah tan al 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 men eluarkan J+/P? dari dalam o!'ek DAO dan memindahkannya ke class -ntity. (ari class DAO& kita cukup meman il nama Kuery terse!ut. Fitur ini dise!ut 7amed Puery. *isalnya& kita in in men am!il artikel !erdasarkan kate ori. 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 dipan il 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 men unakan restriction untuk mem!atasi 'umlah record yan dihasilkan. *irip den an %P?& kita men unakan keyword where untuk mem!atasi hasil Kuery. Contohnya& kita men am!il artikel yan diter!itkan setelah tan tertentu. J+/P?nya tampak seperti ini: from Article a where a.publishDate > :publishDate ,ampir semua operator yan !iasa kita di unakan. 4erikut ta!el operator yan !erdasarkan prioritas eksekusinya:
Operator
. AV/ AO TU T& U& TO& UO navi asi o!'ect untuk mem!uat men'adi positif/ne atif perkalian dan pem!a ian pen'umlahan dan pen uran an sama den an atau tidak sama den an per!andin an

al

unakan di Java dapat didukun & diurutkan

Penjelasan

I7D)J 4-)9--7& I7D)J ?$5-& per!andin an& mirip den an sintaks %P? I7D)J $7& $% I7D)J 7#?? $% I7D)J -*+)>& I7D)J *-*4-B IDFJ pen ecekan collection

JAVA PERSISTENCE API (JPA) | HALAMAN 105


7D)& /7(& DB operator lo ika

*isalnya& !ila kita in in men am!il artikel yan 4erita& Kuery-nya seperti ini: String jpaql = from Article a ; jpaql += where a.category <> :category;

!ukan kate ori

List<Article> hasil = entityManager.createQuery(jpaql).getResultList(); 5ita men unakan karakter % untuk men antikan karakter apa sa'a dalam 'umlah !erapa sa'a. *isalnya& kita in in mencari artikel yan diawali den an huruf /& maka kita unakan J+/P? seperti ini: from Article a where a.title like 'A%' ?alu !a aimana kalau kita in in mencari artikel yan den an karakter %R diawali

"unakan escape character \& sehin a J+/P?nya men'adi seperti ini: from Article a where a.title like '\%' 4ila kita men unakan le!ih dari satu persyaratan& unakan keyword and atau or sesuai ke!utuhan. Contohnya& kita in in mencari artikel yan 'udulnya diawali huruf /& dan nama pen aran nya 'u a diawali den an huruf /. from Article a where a.title like 'A%' and a.author.fullname like 'A%' Contoh lain& !ila kita in in mencari artikel yan diawali huruf / dan 'u a huruf 4& J+/P?nya seperti ini. from Article a where a.title like 'A%' or a.title like 'B%' 5ita !isa men urutkan hasil pencarian den an men keyword order by& sama seperti %P?. 4erikut contoh pen urutan artikel !erdasarkan 'udulnya. String jpaql = from Article a ; jpaql += order by a.title asc ; List<Article> hasil = entityManager.createQuery(jpaql).getResultList(); 5ita men unakan keyword asc& yan artinya ascendin untuk men urutkan dari kecil ke !esar. #ntuk urutan se!aliknya& unakan keyword desc& yan artinya descendin . unakan

HALAMAN

106 | JAVA SWING 6uer# untuk Colle"tion


/da !e!erapa keyword yan dapat di unakan untuk memanipulasi collection. *isalnya& kita in in mencari roup yan tidak punya mem!er. from Group g where g.members is empty /tau mencari user yan ter a!un dalam rup den an 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 den an keyword from dan !atasan hasil den an keyword where& sekaran kita !isa menentukan format hasil yan dikeluarkan den an keyword select. *ari kita lihat la i Kuery user yan men'adi an ota rup. from User u, Group g where g.name=? and u member of g.members +ada Kuery di atas& kita !isa memilih untuk hanya men am!il data user sa'a den an men unakan 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 (en an Kuery seperti itu& kita !isa mem!uat method di class GroupDao se!a ai !erikut: public List<User> membersOf(String groupName) { String jpaql = "select u "; jpaql += "from User u, Group g "; d g "";

JAVA PERSISTENCE API (JPA) | HALAMAN 107


yan pernah men isi artikel den an kate ori ,eadline 7ews. Puery ini meli!atkan ti a 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 men hasilkan !e!erapa record den an 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 men andalkan kemampuan data!ase untuk melakukan a re asi terhadap data yan 'umlahnya !anyak. 4iasanya report Kuery !anyak memanfaatkan a re ate function seperti sum& count& group by& dan having. %e!a ai contoh& !ila kita in in men hitun 'umlah artikel yan sudah ditulis seoran author& kita !isa men unakan Kuery !erikut. select count (a) from Article a where a.author.fullname = 'endy' /tau kita !isa 'u a men hitun dikomentari pen un'un . select count (a) from Article a where a.comments is empty !erapa artikel yan tidak

Sub:uer#
J+/ 'u a mendukun Kuery di dalam Kuery. %e!a ai contoh& kita in in menampilkan penulis mana yan pernah mem!uat artikel den an nama kate ori !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 'u a tidak mencukupi& kita !isa lan sun men eksekusi %P? ke data!ase melalui J+/. %e'auh ini& J+/ sudah mencukupi untuk aplikasi !lo kita. )api sekedar untuk menam!ah pen etahuan& mari kita am!il 21 artikel ter!aru den an men unakan native %P? *y%P?. %P?nya se!a ai !erikut select * from T_ARTICLE order by publishDate desc limit 0,10 %P? di atas kita unakan dalam /rticle(ao se!a ai !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 men unakannya& kita pan il methodnya seperti !iasa. Client code tidak perlu tahu implementasi internalnya. (ari sisi client code& sama sa'a seperti men akses J+/P?.

JASPER REPORT | HALAMAN 109

Jasper *eport
Pengenalan
*enampilkan report atau laporan merupakan hal yan pentin dan umum di unakan oleh aplikasi manapun& terutama yan !ersifat sistem informasi. Dleh karena itu kita akan mem!ahas !a aimana mem!uat desain report& men isi report den an data& lalu mem!erikan hasilnya kepada pen una. (alam Java& terdapat !er!a ai teknolo i untuk mem!uat report diantaranya adalah& JasperBeport& http://'asperreport.sourcefor e.net/ 4$B)& http://www.!irt-e6chan e.com/ (ata Fision& http://datavision.sourcefor e.net/

JasperBeport merupakan reportin tools yan palin populer di Java dan !ahkan !e!erapa aplikasi +,+ men unakan JasperBeport se!a ai solusi untuk menampilkan report.

Instalasi
+ersiapan yan perlu kita lakukan adalah: 2. *en install Java %(5& versi yan di unakan adalah J(5 2.0.1. /nda dapat mendownload J(5 terse!ut dari we!site http://'ava.sun.com ;. *en install 7et4eans 0.1 <. *en install iBeport =. *en install *y%P? Java %(5 diperlukan se!a ai toolkit untuk men em!an kan aplikasi Java. (i dalamnya terdapat Java compiler& 'ava virtual machine dan 'ava li!rary standard. )anpa %(5 kita tidak akan !isa men em!an kan aplikasi Java. 7et4eans adalah $(- ($nte rated (evelopment -nvironment) yan dikem!an kan oleh %un *icrosystems. 7et4eans difokuskan untuk men em!an kan aplikasi 'ava secara produktif& didalamnya terdapat !anyak wiCard yan men otomatisasi pen em!an an aplikasi& men hindarkan developer dari low level confi uration yan rumit. iBeport adalah visual desi ner untuk mem!uat reportin men unakan li!rary 'asperreport. )anpa iBeport development

HALAMAN

110 | JAVA SWING


report men'adi san at susah dan tidak efisien *y%P? di unakan se!a ai !asis data yan reportnya. akan di!uatkan

Alur Proses JasperReport


#ntuk mem!uat dan menampilkan se!uah report ada !e!erapa hal yan harus dilakukan& 2. ;. *erancan report men unakan visual report desi ner& seperti iBeport. File dihasilkan !er-ekstensi V.'r6ml. *en kompilasi desain report a ar siap diisi data. ,asil rancan an report yan sudah dikompilasi !erekstensi V.'asper. /da !er!a ai cara untuk men kompilasi desain report& (i dalam kode 'ava atau& *en unakan /7) task.

Cara yan kedua merupakan pendekatan yan palin umum di unakan karena kita tidak mun kin men u!ah desain report pada saat run-time atau setelah aplikasi di-deploy. <. *en isi report den an data. (ata yan di!erikan dapat !er!a ai 'enis sesuai den an ke!utuhan& hal ini akan di!ahas pada !a! selan'utnya. Beport yan sudah diisi data !erekstensi V.'rprint. *enentukan 'enis report yan in in ditampilkan. %aat ini JasperBeport mendukun !er!a ai 'enis format seperti& +(F& L?%& B)F& D()& ,)*?& C%F& dan plain te6t.

=.

Istilah Umum dalam JasperReport


%e!elum mem!ahas le!ih 'auh men enai JasperBeport perlu diketahui !e!erapa istilah umum yan !iasa di unakan& Beportin data *en isi data ke dalam report dapat dilakukan den an men unakan& Field& untuk menampilkan data yan data!ase atau datasource. !erasal dari Kuery

+aramater& untuk menampilkan parameter report. 4entuk dari parameter adalah *ap den an tipe key dan

JASPER REPORT | HALAMAN 111


value !erupa %trin . Faria!le& se!a ai data yan dapat dimanipulasi dan di unakan !erkali-kali dalam report.

?ayout report 4iasanya desain report terdiri dari !e!erapa !a ian yaitu& 4ack round. )itle& 'udul dari report. +a e header& !a ian di setiap awal halaman. Column header& !a ian di setiap awal ta!el. (etail& !a ian 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& !a ian di setiap akhir ta!el. +a e footer& !a ian di !a ian footer setiap halaman. ?ast pa e footer& sama seperti pa e footer namun hanya muncul pada halaman terakhir. %ummary& !a ian yan akhir report. hanya ditampilkan sekali di

iReport sebagai Visual Designer


#ntuk mendesain report instalasinya san at mudah. kita akan men unakan iBeport& +en una 9indows !isa men unduh file installer iBeport& men install dan lan sun men'alankannya.

4a i pen una sistem operasi V7i6 !isa men unduh file arsipnya !erupa tar. C dan men ekstraknya. %etelah itu men'alankannya den an& 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 men konfi urasi koneksi data!ase. Caranya den an& Data > Connection / Data Sources New > Pilih Database JDBC Connection > Next $sikan form konfi urasi seperti !erikut& Name: MySQLConnection JDBC Driver: com.mysql.jdbc.Driver JDBC URL: jdbc:mysql://localhost/ejb3 Username: belajar Password: java 5onfi urasi di atas men asumsikan kita sudah mempunyai data!ase yan !ernama !ela'ar den an username dan password !ela'ar / 'ava. 4erikut script untuk mem!uat schema !erdasarkan konfi urasi 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 men isi data ke dalam report& $nline %P?& menampilkan data melalui %P? yan pada file desain report. disimpan

(ata%ource& menampilkan data melalui interface (ata%ource yan disediakan oleh JasperBeport. (ata%ource ini didefinisikan di dalam kode Java sehin a report hanya !erfun si 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 den an& 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 ta!el den an field lalu tekan tom!ol 8D5:. kolom

/da !e!erapa field !aru sesuai den an kolom di ta!el )N+-B%D7 yaitu& personNid& name& email& dan !irthdate. ?alu pindahkan field di atas ke !a ian 8detail: dalam report. ,asilnya seperti !erikut&

HALAMAN

114 | JAVA SWING

5emudian tam!ahkan 'udul dan la!el untuk setiap field data den an men unakan menu tool!ar 8%tatic )e6t:. (esain akhir report akan seperti !erikut&

)ampilkan hasil report den an cara& Build > Execute (with active connection) Jan an lupa untuk menyimpan report yan nama PersonReport.jrxml& File > Save sudah di!uat den an

Kompilasi Report dengan Ant


%etelah desain sudah 'adi maka kita perlu mem!uat ant tar et

JASPER REPORT | HALAMAN 115


untuk men kompilasi 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 men atur 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 lan kah terakhir adalah mendefinisikan ant tar et untuk men kompilasi seluruh file report den an 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 tar et den an nama 8compile report: den an 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


$nte rasi 'asperreport den an %win se!elumnya dapat dilakukan den an mudah. /da !er!a ai skenario untuk menampilkan halaman atau data dalam %win yaitu& *enampilkan dalam J+anel men *enampilkan dalam JFrame men unakan JBFiewer unakan JasperFiewer

*en eksport lan sun hasil report ke dalam format file seperti +(F& -6cell atau 9ord

+endekatan pertama dan kedua sama dari sisi kode& hanya sa'a ditampilkan den an men unakan komponen yan !er!eda. Cara yan palin laCim adalah den an men unakan JBFiewer& dimana kita !isa meletakkan viewer report di manapun kita in inkan& 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 den an menyimpan kode %P? di dalam report. 5ekuran an 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 in in menampilkan report daftar +erson dalam !entuk +(F. *aka yan selan'utnya dilakukan adalah copy-paste kode %P? dari source code aplikasi ke dalam report. 4ayan kan 'ika kita mempunyai 21 report yan menampilkan daftar +erson den an kode %P? yan sama den an source code aplikasi lalu kita men u!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 den an men unakan (ata%ource. (ata%ource !erfun si untuk menyimpan data yan in in ditampilkan& misalkan dari data!ase& kemudian dikirim ke dalam report untuk selan'utnya ditampilkan. /da !er!a ai 'enis (ata%ource yan dapat kita unakan !erdasarkan tipe data yan in in disimpan& JB*ap/rray(ata%ource untuk menyimpan tipe data array of map JB*apCollection(ata%ource collection of map untuk menyimpan tipe data

JB4ean/rray(ata%ource untuk menyimpan tipe data array of !ean JB4eanCollection(ata%ource collection of !ean JB)a!le*odel(ata%ource ta!lemodel di swin untuk menyimpan menyimpan tipe tipe data data

untuk

JBLml(ata%ource untuk menyimpan tipe data 6ml

(ata%ource yan umum di unakan adalah JB4eanCollection(ata%ource. 5ita akan menampilkan daftar +erson& den an mem!uat Collection dari +erson !ean yan kemudian akan di!erikan ke JB4eanCollection(ata%ource. +ertama di!uat terle!ih dahulu Person.ja a&

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 den an 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 lan sun men unakan file PersonReport.jrxml di atas a ar dapat menampilkan (ata%ource. >an perlu dilakukan adalah& ,ilan kan ta Kuery%trin %esuaikan nama field dan tipenya den an property pada class +erson & sehin a +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.ja a untuk menenerate 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() dipan il den an men unakan %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 in in mencetak 'udul report secara dinamis yan dikirim dari kode Java. 4erikut lan kah-lan kah untuk men irimkan 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 men unakan kelas +erson%criptlet di dalam +ersonBeport caranya adalah se!a ai !erikut& Edit > Report Properties Klik tab Scriptlet Class Pilih Use this scriptlet class ... Ketik PersonScriptlet Jika men unakan packa e& 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 men hasilkan daftar +erson& 'u a akan mem!erikan output ke console !erupa& 1. Hadikusuma Wahab 2. Endy Muhardin 3. Ifnu Bima

HALAMAN

122 | JAVA SWING

$enutup
(en an ilmu yan sudah diperoleh dalam pelatihan ini& anda sudah !isa mulai untuk mem!uat pro ram Java desktop sederhana. +ada awalnya pasti terasa sulit& sikapi den an pantan menyerah dan selalu cari cara yan le!ih !aik dalam mem!uat aplikasi. ?an kah selan'utnya anda !isa mulai aktif !ertanya atau men'awa! hal-hal yan !erhu!un an den an Java. *edia yan !isa di unakan !anyak sekali& !isa forum milis atau diskusi den an teman. $ni cara ter!aik untuk men etes apakah pemahaman anda men enai Java sudah cukup len kap atau anda masih perlu !ela'ar le!ih !anyak la i. %etelah yakin den an kemampuan anda& !erfikirlah untuk men am!il sertifikasi profesional Java. +elatihan untuk persiapan sertifikasi Java !anyak tersedia di lem!a a pelatihan. 5alau anda merasa terlalu !erat men am!il kursus persiapan sertifikasi& !erlatihlah sendiri men unakan materi yan !anyak tersedia di internet& misalnya 'avaranch.com. Cara !ela'ar Java yan palin efektif adalah den an meli!atkan diri dalam pro'ect !er!asis Java. Jika di perusahaan anda tidak memun kinkan& di luar sana !anyak sekali pro'ect opensource yan memerlukan !antuan anda. 4erkun'un lah ke we!site-we!site open source pro'ect hostin seperti sourcefor e.net atau dev.'ava.net ?earn& )ry dan )each adalah formula untuk menin katkan pen etahuan 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. ;. <. =. @. 0. 3. E. 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!eansindonesia/ Java #ser "roup $ndonesia : http:// roups.yahoo.com/ roup/'u indonesia/ Java (esi n +attern : http://www.'avacamp.or /desi n+attern/ Java (esktop : http://www.'avadesktop.or J"oodies : http://www.' oodies.com %win L : http://www.swin la!s.or

Anda mungkin juga menyukai