MATERI PELATIHAN
Java Desktop Ifnu Bima
[email protected] http://ifnu.artivisi.com
http://www.artivisi.com Jakarta, 2008
Daftar Isi Java Foundation Class............................ Class................................................ ........................................ ................................................ ............................ .......1 Feature JFC................................. JFC..................................................... ........................................ ........................................ .................................. ......................1 ........1 Swing Package...................... Package.......................................... ........................................ ........................................ ................................................2 ............................2 Swing HelloWorld............................ HelloWorld................................................ ........................................ ..................................................... ................................. ...3 Install Java Development Kit..................................... Kit......................................................... ........................................... ..........................3 ...3 Membuat program HelloWorld ...................................................... ...............................................................................3 .........................3 Melakukan kompilasi program HelloWorld......................... HelloWorld.............................................. ................................... ..............4 4 Menjalankan program HelloWorld........................... HelloWorld............................................... ................................. ........................... ..............4 4 Membuat Swing HelloWorld dengan Netbeans 6.1........................................ 6.1......................................................5 ..............5 Komponen Swing .......................... .............................................. ........................................ ........................................................... ....................................... ...7 Struktur Komponen Swing..................................... Swing......................................................... ...................................... ................................ ................7 ..7 Bekerja dengan JLabel, JTextField dan JButton............................................ JButton...........................................................8 ...............8 Bekerja dengan JCheckBox dan JRadioButton................................................... JRadioButton................................................... .......11 Bekerja dengan JList dan JComboBox ............................................. ...................................................................... ......................... 15 Bekerja dengan Menu, Popup Menu dan Toolbar........................... Toolbar........................................... ...........................18 ...........18 Membuat Menu.............................. Menu.................................................. ........................................ ................................................ ............................ ....19 Membuat Popup Menu Menu ....................................... ........................................................... ..................................................24 ..............................24 Membuat Toolbar............................. Toolbar................................................. ........................................ ..................................................25 ..............................25 Membuat Dialog dan JFileChooser.................. JFileChooser...................................... ........................................ .......................................29 ...................29 Membuat pre-defined dialog dengan JOptionPane..................... JOptionPane............................................. ...........................30 ...30 Membuat JFileChooser.................... JFileChooser........................................ ........................................ ................................ .......................... ..................35 ....35 Konsep MVC.................................. MVC...................................................... ........................................ ........................................ .........................................38 .....................38 Model dalam Komponen Swing .................................................... ................................................................ .......................... ................39 ..39 TableModel....................... TableModel............................................ ......................................... ........................................ .................................................41 .............................41 ListModel ........................................ ............................................................ ........................................ ........................................ .................................. ...............42 .42 Menangani Event......................... Event............................................. ........................................ ......................................... ............................................44 .......................44 Event Listener dalam Swing ........................................ ............................................................ ......................................... ..........................45 .....45 ActionListener...................... ActionListener.......................................... ........................................ ......................................... ......................................... ..........................48 ......48 KeyListener...................... KeyListener.......................................... ........................................ ........................................ ........................................ ...............................50 ...........50 HALAMAN III
MouseListener dan MouseMotionListener.................................................................52 Koneksi Database Dengan JDBC....................................................................................55 Mengenal JDBC..........................................................................................................55 Database Driver...........................................................................................................56 Membuat Koneksi.......................................................................................................56 Mengambil dan Memanipulasi Data dari Database....................................................58 Menggunakan PreparedStatement...............................................................................60 Batch Execution..........................................................................................................62 Menangani Transaction...............................................................................................62 DAO dan Service Pattern............................................................................................63 Java Persistence API (JPA).............................................................................................71 Perbedaan dialek SQL............................................................................................71 Perbedaan konsep relasional dan object-oriented................................................ ..72 Peningkatan kinerja................................................................................................73 Persiapan.....................................................................................................................74 Instalasi ..................................................................................................................74 Aplikasi Blog..........................................................................................................75 Fungsionalitas Aplikasi..........................................................................................75 Dasar-dasar ORM.......................................................................................................75 Mapping Sederhana................................................................................................75 Konfigurasi JPA.....................................................................................................76 Menyimpan dan Mengambil Object.......................................................................78 EntityManagerFactory............................................................................................79 Menyimpan object ke database.............................................................................. 79 Mengambil data dari database................................................................................80 Membuat skema database.......................................................................................81 Membuat CategoryDao..........................................................................................81 Menggunakan EntityManager................................................................................82 Client Code.............................................................................................................82 Pemetaan Relasi..........................................................................................................83 Pertimbangan dalam pemetaan................................................................................. ..85 Kasta.......................................................................................................................86
HALAMAN IV
Navigasi..................................................................................................................89 Jenis Collection......................................................................................................90 Optionality..............................................................................................................91 Transitive Persistence ............................................................................................92 Enum Type..................................................................................................................93 Value Type..................................................................................................................94 One to One .................................................................................................................95 Many to One................................................................................................................95 One to Many ...............................................................................................................96 List dengan order by...............................................................................................96 Many to Many ............................................................................................................99 Parent-Child..............................................................................................................100 Mengambil Objek dari Database...............................................................................101 JPA Query Language (JPAQL).................................................................................101 Query Sederhana.................................................................................................. 101 Pagination.............................................................................................................102 Parameter Binding................................................................................................102 Named Query.......................................................................................................103 Restriction............................................................................................................104 Query untuk Collection........................................................................................106 Projection ......................................................................................................... ...106 Join ......................................................................................................................106 Report Query........................................................................................................107 Subquery...............................................................................................................107 Native SQL...............................................................................................................108 Jasper Report........................................................................................................... ......109 Pengenalan................................................................................................................109 Instalasi ................................................................................................................... .109 Alur Proses JasperReport..........................................................................................110 Istilah Umum dalam JasperReport............................................................................110 iReport sebagai Visual Designer ..............................................................................111 Konfigurasi Koneksi Database dalam iReport..........................................................112
HALAMAN V
Menampilkan Data dalam Report.............................................................................113 Kompilasi Report dengan Ant...................................................................................114 Integrasi JasperReport dengan Swing.......................................................................116 Menampilkan Report Menggunakan DataSource.....................................................117 Mengirim Parameter.................................................................................................120 Menggunakan Scriptlet.............................................................................................120 Penutup.......................................................................................................................... 122 Referensi dan Bacaan Lebih Lanjut...............................................................................123
HALAMAN VI
JAVA FOUNDATION CLASS | HALAMAN 1
Java Foundation Class Java Foundation Class (JFC) merupakan sekumpulan class-class Java yan diunakan untuk menem!ankan perankat lunak !er!asis "#$ ("raphical #ser $nterface). %elain itu& JFC 'ua mempunyai class-class yan diunakan untuk menam!ahkan funsi dan kemampuan interaksi yan variatif dari pemroraman Java. ari definisi ini& JFC tidak hanya !erisi class-class "#$ sa'a tetapi 'ua class-class lain yan dapat meninkatkan kemampuan pemroraman Java !aik dari sei funsionalitasnya maupun dari sei kemampuan interaksi pemroraman Java yan sanat kaya.
Feature JFC Fitur-fitur yang dipunyai oleh JFC Fitur 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'
Ja&a *D ()!
+erisi kumpulan class-class yang dapat digunakan untuk memanipulasi ob,ect-ob,ect * dimensi" sperti garis" kotak" lingkaran" kur&a dan lain sebagainya' Selain itu Ja&a *D ()! ,uga memberikan kemampuan program yang ditulis menggunakan Ja&a untuk mencetak output ke alat pencetak seperti printer'
Drag-anddrop
Menyediakan kemampuan drag-and-drop antara program Ja&a dan program lain yang ditulis spesifik untuk suatu platform sistem operasi tertentu'
HALAMAN 2
| JAVA SWING !nternational Membantu pengembang perangkat lunak untuk iation $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 mempenaruhi kualitas proram yan kita !uat secara sinifikan. ,al ini dikarenakan& dalam dunia Java %tandard dition& le!ih spesifik lai aplikasi Java yan di!anun menunakan swin& !elum ada framework yan !enar-!enar komprehensif mem!im!in penem!an untuk mem!uat aplikasi yan !erkualitas. +ada umumnya aplikasi yan dikem!ankan denan %win mempunyai kode yan sanat kotor& dimana kode yan !erisi penendalian terhadap event komponen swin !ercampur aduk denan kode yan !erisi aturan !isnis dan kode yan !erisi manipulasi terhadap data.
Swing Package %win +$ sanat !aus dan lenkap& Java 0.1 menyertakan setidaknya tu'uh !elas (23) !uah packae yan !erisi class-class swin yan siap diunakan. ,a&a0'accessibility
,a&a0'swing'plaf
,a&a0'swing
,a&a0'swing'plaf'basic ,a&a0'swing'te0t'html
,a&a0'swing'border
,a&a0'swing'plaf'metal ,a&a0'swing'te0t'rtf
,a&a0'swing'colorchooser
,a&a0'swing'plaf'multi
,a&a0'swing'e&ent
,a&a0'swing'plaf'synth ,a&a0'swing'tree
,a&a0'swing'filechooser
,a&a0'swing'te0t
,a&a0'swing'table
,a&a0'swing'undo
#tunnya kita tidak akan menunakan semua class-class dalam packae swin& hanya se!aian kecil sa'a dari class-class terse!ut yan nantinya akan !enar-!enar kita unakan. %ehina kita !isa !erkonsentrasi untuk memahami !e!erapa komponen pentin sa'a. alam modul ini nanti kita hanya akan menunakan !e!erapa class komponen swin yan pentin sa'a. 4e!erapa kelas ini sudah cukup se!aai !ahan pemem!uat perankat lunak !erkualitas. 5omunitas Java 'ua menyediakan !anyak sekali li!rary swin& antara lain dari %win6 dan J"oodies yan menem!ankan
JAVA FOUNDATION CLASS | HALAMAN 3 li!rary standard swin denan menam!ahkan !er!aai macam feature menarik. %edankan komunitas dari 'avadesktop.or menem!ankan !anyak sekali li!rary swin untuk keperluan khusus. 7yaris semua komponen yan kita perlukan !aik komponen umum hina komponen untuk tu'uan khusus !anyak tersedia di internet& kita tinal mencari dan menunakan. +raktek yan !aik dalam memilih komponen apa yan tepat adalah denan mencari dahulu informasi di internet. ,al ini sanat !ermanfaat untuk menurani waktu kita menem!ankan komponen& sehina kita !isa le!ih !anyak !erkonsentrasi untuk menem!ankan sisi !isnis dan usa!ility dari software yan kita kem!ankan. %e!aik apapun softeware yan kita !uat tapi tidak mem!erikan nilai tam!ah terhadap masalah yan dihadapi adalah kesia-siaan !elaka. 4anyak sekali software yan dianap aal mem!erikan nilai tam!ah terhadap masalah yan dihadapi hanya karena tampilan "#$-nya sanat susah dipahami dan tidak intuitif.
Swing HelloWorld *enunakan contoh lansun adalah cara yan tepat untuk memulai proses !ela'ar. Cara ini mem!erikan am!aran konkrit tentan su!'ect yan akan dipela'ari& sehina proses !ela'ar le!ih cepat diserap. #ntuk tu'uan ini& kita akan mem!uat se!uah proram kecil yan menampilkan kata 8,ello9orld menunakan komponen swin. 4erikut ini adalah lankah-lankah yan harus anda lakukan untuk mem!uat proram 8,ello9orld !er!asis komponen swin: 2.
$nstall Java evelopment 5it (J5)
;.
*em!uat proram ,ello9orld itu sendiri
<.
*elakukan kompilasi proram ,ello9orld
=.
*en'alankan proram ,ello9orld
Install Java Development Kit >an perlu kita lakukan dalam lankah ini hanyalah mendownload J5 dari we!site 'ava.sun.com. kemudian 'alankan proram instalasinya dan ikuti perintah-perintah dalam lankah-lankah instalasi terse!ut. %etelah proses instalasi selesai& kita siap untuk mem!uat proram Java.
Membuat program HelloWorld
HALAMAN 4
| JAVA SWING
+roram Java denan tampilan seperti di atas dapat di!uat denan dua cara. Cara yan pertama adalah denan menunakan te6t editor dan menetik kode proram. Cara yan kedua adalah denan menunakan 7et!eans *atisse "#$ 4uilder. ?akukan lankah-lankah !erikut ini diatas menunakan te6t editor:
untuk mem!uat proram
2.
4uka te6t editor kesayanan anda.
;.
5etikkan kode proram di !awah ini dan simpan denan nama file ,ello9orld.'ava :
public class HelloWorld { public HelloWorld(){ } public void display(){ JFrame.setDefaultLookAndFeelDecorated(true); JLabel label = new JLabel("HelloWorld"); JFrame frame = new JFrame(); frame.getContentPane().add(label); frame.setVisible(true); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] str){ HelloWorld hello = new HelloWorld(); hello.display(); } }
Melakukan kompilasi program HelloWorld 5ompilasi proram terse!ut denan cara men'alankan proram 'avac ('ava compiler). Jika anda !eker'a di linkunan windows !uka command prompt& kemudian ketik proram !erikut ini :
c:\latihan> javac HelloWorld.java Jika anda !eker'a di linkunan "7#/linu6& !uka console dan ketikkan perintah !erikut ini :
shell$ javac HelloWorld.java
Menjalankan program HelloWorld +roses kompilasi akan menhasilkan file yan !erekstensi .class& file inilah yan akan kita eksekusi. Jika anda !eker'a di linkunan windows lakukan perintah !erikut ini:
JAVA FOUNDATION CLASS | HALAMAN 5
c:\latihan> java HelloWorld Jika anda !ekerka di linkunan "7#/?inu6 'alankan perintah !erikut ini:
shell$ java HelloWorld
Membuat Swing HelloWorld dengan Netbeans 6.1 7et!eans 0.2 dilenkapi denan "#$ !uilder yan dikenal denan *atisse. alam modul ini selan'utnya& *atisse akan diunakan untuk menye!ut 7et!eans "#$ 4uilder. ools ini sanat powerful dan produktif dalam mem!uat komponen "#$. ?ankah-lankah yan harus anda lakukan untuk mem!uat %win ,ello9orld denan *atisse adalah se!aai !erikut: 2.
4uat pro'ect !aru dalam 7et!eans& caranya pilih menu :
File > New Project ;.
?ankah !erikutnya anda harus menentukan kateori pro'ect yan akan anda !uat& caranya pilih :
General > Java Application nda akan di!awa ke dialo untuk menentukan nama pro'ect dan folder dimana anda meletakkan pro'ect terse!ut& pilih folder sesuai keininan anda. <.
5lik kanan di pro'ect yan !aru anda !uat& popup menu akan muncul& kemudian pilihlah menu :
New > JFrame Form... 5emudian masukkan nama class JFrame yan akan di!uat& misalnya ,elloworld.'ava& klik finish. =. ampilan 7et!eans akan !eranti denan tampilan "#$ !uilder& dimana di sisi kanan akan terlihat %win +allet. 5lik item ?a!el di %win +allet kemudian klik di atas JFrame& se!uah J?a!el akan di!uat.
HALAMAN 6
| JAVA SWING
Jendela esin dan +allete 7et!eans *atisse .
#ntuk memenuhi tu'uan kita mem!uat %win ,ello9orld& kita akan memasukkan strin 8,ello9orld ke dalam J?a!el yan !aru sa'a kita !uat. Caranya& do!el klik di atas J?a!el terse!ut& kursor muncul !ersama te6t field dan ketikkan 8,elloworld.
0.
5lik kanan di file ,ello9orld.'ava pada 'endela e6plorer di se!elah kiri& pilih menu Run File... untuk mencompile dan men'alankan class ,ello9orld.'ava atau tekan tom!ol %,$F A F0.
*atisse mempunyai sistem ?ayoutin yan sanat fleksi!le& sistem layout yan diunakan oleh *atisse adalah "roup?ayout. alam chapter !erikutnya kita akan !ela'ar !aaimana menunakan "roup?ayout ini denan !enar dan memanfaatkan keunulanya dalam menata component "#$ denan sanat rapi. %win helloworld ini hanya se!aian kecil sa'a dari peker'aan yan harus dilakukan dalam mem!anun aplikasi desktop !er!asis Java. %elan'utnya kita akan mem!ahas penunaan J?a!el& J4utton& JCheck4o6& Je6tField dan JBadio4utton untuk mem!uat aplikasi "#$ sederhana denan menunakan *atisse.
KOMPONEN SWING | HALAMAN 7
Komponen Swing %win toolkit menyediakan !anyak sekali komponen untuk mem!anun aplikasi "#$ desktop. %win toolkit 'ua menyediakan class-class untuk menanani interaksi antara aplikasi dan user menunakan standard input seperti key!oard dan mouse. 5omponen-komponen yan disediakan swin mencakup semua "#$ toolkit yan laim diunakan dalam apilasi desktop& seperti : Ja!el& J?ist& Jree& J4utton& J?a!el dan masih !anyak komponenkomponen lainnya yan sudah teru'i dan siap pakai. %elain komponen "#$& swin 'ua menyediakan fasilitas untuk proses undo& komponen untuk menolah te6t& internationaliation& 5omponen "#$ yan mendukun penyandan cacat (accessi!ility support) dan fasilitas dra-and-drop. ?ook and Feel merupakan fasilitas yan unik dalam swin. enan fasilitas ?ook and Feel ini kita !isa denan mudah meru!ah tampilan dari proram kita sesuai denan keininan dan tu'uan kita. *isalnya& aar proram terlihat fancy atau aar proram terlihat konsisten dalam seala keadaan. %win 'ua menyediakan li!rary Java ; untuk penolahan data secara visual& seperti menolah am!ar& o!'ect ;& !ahkan animasi. %win?a!s.or menyediakan li!ary %win +ainter yan merupakan penem!anan dari Java ;& %win +ainter ini memunkinkan aplikasi swin mempunyai tampilan yan indah dan terlihat profesional. Java 0.1 menam!ahkan !anyak sekali fitur-fitur !aru ke dalam packae swin& termasuk dukunan untuk li!rary Dpen"? menunakan JD"?& ray $con dan 9e! %ervice. enan adanya dukunan ini swin men'adi le!ih poweful dan mempunyai masa depan yan cerah.
Struktur Komponen Swing %ecara arsitektur& %win di!anun diatas arsitektur 9 (!stract 9indows oolkit). 9 adalah "#$ toolkit yan dikem!ankan oleh %un enineer se!elum swin muncul. 5elemahan utama 9 adalah fleksi!ilitas tampilan "#$& seperti paintin method yan masih sanat primitif. %win dimaksudkan untuk memper!aiki kekuranan dari 9 tanpa harus mem!uan teknoloi yan sudah di!uat dan mem!uat
HALAMAN 8
| JAVA SWING "#$ toolkit !aru dari nol. 5omponen 9 diletakkan dalam satu packae yaitu 'ava.awt& didalamnya terdapat komponen-komponen "#$ dasar& salah satunya adalah Component. Class Component adalah moyan dari se!aian !esar komponen 9 maupun %win. Check4o6& ?a!el& 4utton dan !e!erapa komponen 9 lainnya adalah turunan lansun dari class Component. 7amun dalam kenyataanya arsitektur demikian tidak mem!erikan fleksi!ilitas yan cukup memadai untuk mem!uat !er!aai macam komponen !aru yan di!utuhkan dalam desktop application. %win muncul denan mem!awa teknoloi 9 yan telah ditam!ahkan denan !anyak kemampuan. 7yaris semua komponen "#$ dari swin merupakan turunan class Container dan class Container adalah turunan dari class Component.
Bekerja dengan JLabel, JTextField dan JButton 4eker'a denan komponen swin menunakan *atisse sanat menyenankan dan mudah. "roup?ayout yan sanat fleksi!el memunkinkan kita untuk mem!uat aplikasi denan tampilan seperti yan kita harapkan. ?a!el& te6tfield dan tom!ol adalah komponen-komponen dasar yan selalu ada dalam setiap aplikasi !er!asis desktop. 5etia komponen ini mempunyai funsi yan sanat sederhana& te6tfield menyimpan data !er!entuk te6t (strin) yan relatif pendek & la!el !anyak diunakan untuk mem!erikan keteranan pen'elas terhadap komponen lain dan tom!ol diunakan user untuk men'alankan satu instruksi tertentu. 4erikut ini adalah contoh aplikasi sederhana yan melakukan pen'umlahan dua !uah !ilanan.
Contoh proram menunakan J?a!el& Je6tField dan J4utton #ntuk mem!uat aplikasi ini lankah-lankah !erikut ini: 2.
menunakan
*atisse&
lakukan
4uat pro'ect !aru di 7et!eans (kalau sudah mem!uat pro'ect&
KOMPONEN SWING | HALAMAN 9 tidak perlu mem!uat lai) denan cara memilih menu :
File > New Project 5emudian ikuti petun'uk yan di!erikan dialo. ;.
4uat class JFrame !aru& caranya denan memilih menu :
File > New File 5emudian akan muncul dialo seperti di !awah ini :
penting Jendela Des ign menampilkan visualisasi komponen GI! Jendela Sou r"e menampilkan kode program dari "las s #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 kateori :
Java GUI Forms > JFrame Form %eperti terlihat di dialo 7ew File dialo diatas& kemudian !eri nama +en'umlahan.'ava =.
4uat tampilan form seperti am!ar !awah ini& caranya denan klik Jendela +allete di se!alah kanan untuk memilih komponen apa yan akan di!uat& kemudian klik di 'endela esin untuk menempatkan komponen yan sudah dipilih tadi ke dalam form. ,asilnya terlihat seperti pada am!ar di !awah ini: Jendela desin 7et!ens *atisse
.
"anti nama setiap komponen aar mudah dikenali. 5lik kanan diatas setiap komponen yan ada dalam Jendela esin diatas& kemudian pilih menu :
Jendela $rope rties digunakan untuk mengedit properti dari komponen #ang seda ng akti& dalam jendela design! Jendela Inspe" tor menampilkan semua komponen swing dalam "lass #ang sedang akti& baik #ang keli'atan se"ara visual di jendela design atau tidak!
HALAMAN 10
| JAVA SWING
Klik kanan > Change Variable Name ... "anti nama komponen-komponen terse!ut (sesuai urutan dari kiri ke kanan& atas ke !awah) men'adi : l!l5eteranan& t6t& l!l+lus& t6t4& !tn,itun& l!l,asil. 0.
*enam!ahkan varia!le untuk menampun nilai yan akan di'umlahkan. 5lik tom!ol %ource untuk mem!uka 'endela yan menampilkan kode sum!er dari proram di atas kemudian tam!ahkan kode di !awah ini tepat di!awah definisi dari class +en'umlahan:
private String str = "Hasilnya adalah : "; private int a, b; 3.
*enanani penekanan tom!ol !tn,itun. 5lik kanan diatas komponen !tn,itun kemudian pilih menu :
Events > Action > actionPerformed nda akan di!awa ke 'endela %ource& dan akan menemukan kode proram seperti di !awah ini :
KOMPONEN SWING | HALAMAN 11
private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: } #!ah kode proram diatas men'adi :
private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: a = Integer.parseInt(txtA.getText()); b = Integer.parseInt(txtB.getText()); int hasil = a + b; lblHasil.setText(str + hasil); } E.
penting J+abel dan J,e)tF iel d mempun#ai met'od get,e)t dan set,e)t untuk mengambil dan mengeset te)t #ang ditampilkan!
Compile dan 'alankan proram. ekan tom!ol %,$F A F0& atau klik kanan file +en'umlahan.'ava kemudian pilih menu Bun File.
Catatan : ●
*ethod $nteer.parse$nt diunakan untuk meru!ah %trin men'adi $nteer.
●
*ethod !tn,itunction+erformed akan dipanil setiap kali kita memencet tom!ol !tn,itun.
%ekaran anda !isa melihat !ahwa !eker'a denan J?a!el& Je6tField dan J4utton sanat sederhana. #ntuk latihan& silahkan ru!ah funsi yan diunakan dalam proram diatas& misalnya perkalian dua !ilanan atau penuranan dua !ilanan.
Bekerja dengan JCheckBox dan JRadioButton JCheck4o6 dan JBadio4utton hanya !isa mempunyai dua !uah kemunkinan nilai& !enar atau salah. 5edua komponen ini diunakan untuk merepresentasikan data yan !erupa pilihan. JCheck4o6 diunakan 'ika pilihanya !erupa multiple selection& sedankan JBadio4utton diunakan 'ika pilihanya !erupa sinle selection. JBadio4utton diunakan misalnya untuk merepresentasikan pilihan 'enis kelamin. JCheck4o6 diunakan misalnya untuk merepresentasikan pilihan ho!!y. 4utton"roup diperlukan untuk menumpulkan JBadio4utton yan mempunyai rup pilihan yan sama. *isalnya rup pilihan 'enis kelamin diunakan untuk menumpulkan JBadio4utton yan
penting JC 'e" k(o ) da n J*adi o( utton se baikn#a digunakan 'an#a jika item pili'an#a s edikit 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 denan melihat nilai kem!alian dari method is%elected& 'ika dipilih maka nilai kem!alian method is%elected adalah !enar& dan false 'ika se!aliknya. %etiap JBadio4utton dan JCheck4o6 mempunyai te6t yan menerankan pilihan yan diwakilinya. *ethod ete6t dan sete6t diunakan untuk memanipulasi te6t. i!awah ini adalah contoh proram yan menunakan JCheck4o6 dan JBadio4utton.
Contoh aplikasi menunakan JCheck4o6 dan JBadio4utton i !aian atas aplikasi ini& terdapat dua JBadio4utton untuk merepresentasikan pilihan tipe warna& transparan atau !erwarna. i!awahnya terdapat pilihan warna yan dapat dipilih le!ih dari satu !uah menunakan JCheck4o6. #ntuk mem!uat proram diatas ikuti lankah-lankah !erikut ini: 2. 4uat class !aru !ertipe JFrame Form& kemudian !eri nama +ilihan.'ava ;. 4uat tampilan diatas menunakan *atisse. komponen yan harus di!uat adalah : ○
ua o!'ect JBadio4utton radioransparan.
:
radio4erwarna
dan
○
%atu o!'ect 4utton"roup : roupipe9arna.
○
mpat o!'ect JCheck4o6 : chk,i'au& chk4iru& chk*erah& chk5unin.
○
%atu o!'ect Je6trea : t6t9arna.
○
%atu o!'ect J%croll+ane : scroll9arna
KOMPONEN SWING | HALAMAN 13 #ntuk melihat semua komponen yan ada dalam Jendela esin& unakan Jendela $nspector di sisi kiri !awah. <. *asukkan o!'ect radio4erwarna dan radioransparan ke dalam o!'ect roupipe9arna. Caranya denan : a) *emilih komponen radio4erwarna di Jendela esin !) 5lik ta! code di Jendela +roperties c) +ilih properti : +ost-Creation Code d) *asukkan kode !erikut ini kedalam dialo yan muncul :
groupTipeWarna.add(radioBerwarna); ?akukan lankah yan sama terhadap o!'ect radioransparan. =. *enanani event ketika JBadio4utton diklik. Caranya denan : a) *emilih komponen radio4erwarna di Jendela esin !) 5lik kanan komponen radio4erwarna& kemudian pilih menu:
Event > Action > actionPerformed c) nda akan di!awa ke dalam Jendela Code& dan menemukan kode !erikut ini :
private void radioBerwarnaActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: } #!ahlah kode diatas men'adi :
private void radioBerwarnaActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: if(radioBerwarna.isSelected()){ lblTipeWarna.setText("Tipe warna : " + radioBerwarna.getText()); } } ?akukan lankah yan sama terhadap radioransparan. . 4uat se!uah private method untuk menanani event pemilihan terhadap JCheck4o6. *ethod tampilkan9arna ini nantinya akan dipanil setiap kali salah satu dari JCheck4o6 dipilih. yan dilakukan oleh metod tampilkan9arna adalah menecek status setiap JCheck4o6& apakah sedan dipilih atau tidak. Jika sedan dipilih maka te6t dari JCheck4o6 terse!ut akan ditampilkan dalam t6t9arna. Class %trin4uffer diunakan untuk menampun nilai te6t dari
penting J*adi o( utton #ang mempun#ai group #ang sama- 'arus dimasukkan dalam sebua' obje"t (uttonGroup #ang s ama!
HALAMAN 14
| JAVA SWING JCheck4o6 yan statusnya terpilih.
penting Cla ss String(u&&er sangat dianjurkan untuk digunakan sebagai " lass untuk memanipulasi String! $enggabungan s tring menggunakan operator . sangat tidak dianjurkanapala gi jika ukuran obje"t String%n#a s uda' "ukup besar!
private void tampilkanWarna(){ StringBuffer warna = new StringBuffer(); if(chkBiru.isSelected()){ warna.append(chkBiru.getText() + " "); } if(chkHijau.isSelected()){ warna.append(chkHijau.getText() + " "); } if(chkKuning.isSelected()){ warna.append(chkKuning.getText() + " "); } if(chkMerah.isSelected()){ warna.append(chkMerah.getText() + " "); } txtWarna.setText(warna.toString()); }
0. *enanani !erikut :
event
pemilihan
JCheck4o6.
Caranya
se!aai
a) +ilih komponen chk,i'au di Jendela esin. !) 5lik kanan komponen chk,i'au untuk memunculkan conte6t (popup) menu. c) +ilih menu :
Event > Action > actionPerformed d) nda akan di!awa ke Jendela Code& kemudian dalam method chk,i'auction+erformed terse!ut panil method tampilkan9arna. seperti di !awah ini :
private void chkHijauActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: tampilkanWarna(); } ?akukan hal ini untuk semua JCheck4o6. 3. Compile dan 'alankan proram denan menekan tom!ol %,$F A F0. Cara lain dalam menampilkan pilihan adalah denan menunakan J?ist dan JCom!o4o6. 5edua komponen ini mempunyai fleksi!ilitas yan le!ih tini dan le!ih mudah diunakan 'ika o!'ect yan dimasukkan dalam pilihan le!ih kompleks. J?ist dan JCom!o4o6 !isa mempunyai Componentditor aar pilihan yan ditampilkan tidak hanya !erupa te6t& !isa !erupa warna atau icon. 4aian !erikutnya akan mem!ahas !aaimana !eker'a menunakan J?ist
KOMPONEN SWING | HALAMAN 15 dan JCom!o4o6.
Bekerja dengan JList dan JComboBox JCom!o4o6 memerlukan tempat yan minimalis di!andinkan denan JBadio4utton& selain itu JCom!o4o6 mempunyai !entuk Com!o4o6 yan dapat diedit& sehina memunkinkan user untuk memilih pilihan yan tidak ada dalam item JCom!o4o6.
penting JCombo (o ) da n J+is t digunakan jika item pili'an bersi&at dinamis! JCombo (o ) da pat mempun#ai bentuk #ang dapat diedit se'ingga user dapa t memasukkan pili'an #ang tidak ada dalam da&tar! J+ist dapat mene rima pili'an lebi' dari satu!
Contoh JCom!o4o6 J?ist memunkinkan multiple selection denan menekan tom!ol : %,$F A ?eft Click atau CB? A ?eft Click. 5emampuan ini mem!antu user 'ika harus melakukan multiple selection. JCom!o4o6 dan J?ist sanat fleksi!el& kita dapat menam!ah dan menhapus item di dalamnya denan sanat mudah. %ehina cocok diunakan untuk merepresentasikan pilihan yan item pilihannya !ersifat dinamis. plikasi di !awah ini adalah contoh penunaan JCom!o4o6 dan J?ist.
Contoh proram menunakan JCom!o4o6 dan J?ist 4aian pertama proram ini terdapat se!uah JCom!o4o6 dan J?a!el& setiap kali item di dalam JCom!o4o6 dipilih& J?a!el di se!elahnya akan menampilkan item yan dipilih terse!ut.
HALAMAN 16
| JAVA SWING 4aian kedua proram ini terdapat se!uah J?ist dan Je6trea. %etiap kali item-item di dalam J?ist dipilih& Je6trea akan menampilkan item-item yan dipilih terse!ut dipisahkan denan koma (&). $kuti lankah-lankah !erikut ini untuk mem!uat proram di atas: 2. 4uatlah class JFrame ?istndCom!o.'ava.
Form
!aru
dan
!eri
nama
;. 4uat tampilan proram diatas menunakan *atisse& kemudian tam!ahkan komponen-komponen: a) mpat !uah J?a!el : l!l+eker'aan& l!l+ilihan+eker'aan& l!l,o!!y& l!l+ilihan,o!!y.
penting
!) %atu !uah JCom!o4o6 : cm!+eker'aan
Jendela $rope rties tida k 'an#a berisi properties dari komponen sw ing #ang seda ng akti& tetapi juga beris i , ab /ve nts dan ,ab Code!
d) %atu !uah Jte6trea : t6t+ilihan,o!!y
c) %atu !uah J?ist : lst,o!!y
<. *eru!ah isi JCom!o4o6. #ntuk meru!ah isi dari JCom!o4o6 dan J?ist kita akan menunakan Jendela +roperties& Jendela ini letaknya di se!elah kanan !awah& di!awah Jendela +allete dan akan muncul hanya 'ika 'endela esin yan dipilih.
,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 swing diinisialisasi!
Jendela +roperties +ilih komponen JCom!o4o6 di Jendela esin& Jendela +roperties akan menampilkan properties dari JCom!o4o6. +ada !aian model di dalam Jendela +roperties masukkan item +ela'ar& *ahasiswa& +rorammer& echnical 9riter dan ester. %etiap item dipisahkan denan koma (&). =. *eru!ah isi J?ist. +ilih J?ist di Jendela esin maka Jendela +roperties untuk J?ist akan muncul. i !aian model isikan item : *em!aca& Dlahraa& rekkin& Codin& *enonton Film& 4ersepeda dan *ena'ar. %etiap item dipisahkan denan koma (&).
KOMPONEN SWING | HALAMAN 17 . *enanani pemilihan JCom!o4o6. 5lik kanan JCom!o4o6 di Jendela esin& kemudian pilih menu :
Events > Action > actionPerformed Jendela Code akan ter!uka& tam!ahkan code seperti di !awah ini :
private void cmbPekerjaanActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: lblPilihanPekerjaan.setText( "Pekerjaan anda : " + cmbPekerjaan.getSelectedItem()); } method et%elected$tem dari JCom!o4o6 diunakan untuk memperoleh item yan sedan di pilih dalam JCom!o4o6. 0. *enanani event pemilihan dari J?ist. vent yan diunakan untuk menanani pemilihan item dari J?ist !er!eda denan JCom!o4o6. J?ist akan menaktifkan ?ist%election event ketika user memilih item dalam J?ist. #ntuk menanani event ini& lakukan lankah-lankah !erikut : a) 5lik kanan pada J?ist di dalam Jendela esin& kemudian pilih menu :
Events > ListSelection > valueChanged !) alam 'endela kode yan ketik kode seperti !erikut ini :
HALAMAN 18
| JAVA SWING
private void lstHobbyValueChanged( javax.swing.event.ListSelectionEvent evt) { // TODO add your handling code here: Object[] selectedItems = lstHobby.getSelectedValues(); if(selectedItems == null || selectedItems.length == 0) txtPilihanHobby.setText(""); else{ StringBuffer strValues = new StringBuffer(); for(Object item : selectedItems){ strValues.append(item.toString() + ", "); } txtPilihanHobby.setText( strValues.substring(0, strValues.length() 2)); } } Catatan : ●
penting JMenu(ar dan J,o ol( ar 'an#a bisa ditamba'kan ke dalam JFrame! JMenuItem a dala' struktur terluar da ri Menu #ang tidak bisa mempun#ai "'ild! J,o ol( ar pada umumn#a menampung J(utton #ang diberi I"on dan mempun#ai ba"kground transparan!
*ethod et%electedalues dari J?ist menem!alikan item-item yan terpilih.
Bekerja dengan Menu, Popup Menu dan Toolbar *enu& +opup menu dan ool!ar diunakan untuk melakukan naviasi dalam aplikasi. denan ketia komponen itu naviasi dalam aplikasi men'adi le!ih fleksi!el dan mudah diunakan oleh user. *enu dan ool!ar pada umumnya diletakkan di !aian atas dari aplikasi aar mudah ditemukan oleh user. %edankan +opup *enu !isa muncul di mana sa'a sesuai denan konteks aplikasi. J*enu4ar adalah class yan diunakan untuk menampun J*enu. J*enu dapat menampun satu atau le!ih J*enu$tem. J*enu$tem merupakan !aian terluar dari struktur menu yan tidak !isa mempunyai child. J%eparatordiunakan untuk memisahkan antara satu menu item dan menu item yan lain. Jika didalam menu terdapat su! menu& unakan J*enu untuk menampun su! menu terse!ut. %elain J*enu$tem& J*enu 'ua dapat menerima class JCheck4o6*enu$tem dan JBadio4utton*enu$tem. J+opup*enu mempunyai !anyak kesamaan di!andinkan denan J*enu4ar. +er!edaan utamanya adalah : J*enu4ar hanya !isa
KOMPONEN SWING | HALAMAN 19 !erada di atas se!uah 'endela JFrame. %edankan J+opup*enu !isa muncul di mana sa'a sesuai denan kontek s dari aplikasi. +er!edaan lainnya terletak di dalam penunaan umum keduanya. J*enu4ar !erisikan menu/instruksi yan !ersifat umum dan !erlaku untuk semua keadaan dalam aplikasi. %edankan J+opup*enu akan mempunyai menu/instruksi yan !er!eda-!eda !erdasarkan dari konteks aplikasi. Dleh karena itu J+opup*enu terkadan dise!ut 'ua se!aai konteks menu. ool!ar mem!erikan cara yan le!ih praktis di!andinkan menu& !ahkan !isa dikatakan !ahwa tool!ar adalah cara cepat untuk menakses menu. Dleh karena itu& setiap item dalam tool!ar!iasanya 'ua tersedia dalam menu. +ada umumnya tool!ar diwakili hanya denan am!ar/icon yan melam!ankan perintah dari tool!arnya. i internet !anyak tersedia tool!ar icon ratis yan dapat kita unakan. 4er!eda denan J*enu4ar dan J+opup*enu yan hanya !isa menerima menu item& Jool4ar dapat menampun J4utton atau control lainya. %eperti contohnya : JCheck4o6& JBadio4utton& Jtole4utton dan lainya. 7ormalnya& Jool4ar akan diisi denan J4utton yan dihilankan te6t-nya dan dianti denan icon. 5ita 'ua perlu meru!ah dekorasi J4utton aar tampilannya terlihat cantik dan menarik.
Contoh proram denan *enu& +opup *enu dan ool!ar #ntuk mem!uat proram seperti di atas& ada !e!erapa tahap yan perlu dilakukan. ahap pertama adalah mem!uat *enu& yan kedua adalah mem!uat +opup *enu dan yan ketia adalah mem!uat ool!ar.
Membuat Menu 4eker'a denan *enu dalam swin& antara lain :
Java meli!atkan enam komponen
2.
J*enu4ar : Class yan menampun semua menu& hanya !isa menampun J*enu se!aai child.
;.
J*enu : Class yan mempunyai child menu item. 4iasanya J*enu ini yan 'adi child lansun denan J*enu4ar
HALAMAN 20
| JAVA SWING <. J*enu$tem : #'un dari menu& disinilah o!'ect ction diletakkan& sehina ketika kita memilih J*enu$tem ada action tertentu yan di'alankan aplikasi. =.
JCheck4o6*enu$tem : #'un dari menu& namun !entuknya le!ih mirip JCheck4o6.
.
JBadio4utton*enu$tem : #'un dari menu& namun !entuknya le!ih mirip J4utton.
0.
J%eparator : pemisah antar J*enu$tem atau antar J*enu
%etiap komponen menu mempunyai funsi dan keunaan masinmasin. Jika kita perhatikan& menu dalam aplikasi umumnya mempunyai shortcut untuk menakses menu tanpa menunakan !antuan mouse. *isalnya menu File !iasanya dapat diakses menunakan tom!ol ? A F& menu Format dapat diakses denan ? A D. Fasilitas shortcut menu ini dise!ut se!aai 5ey!oard *nemonic. File mempunyai mnemonic F& Format mempunyai mnemonic o& dan seterusnya. +ada umumnya tampilan mnemonic dari se!uah menu diwakili denan huruf yan !eraris !awah.
penting Jendela Insp e"tor a kan memperli'atkan semua komponen sw ing baik #ang terli'at atau tidak terli'at dala m jendela design!
*atisse mempunyai fasilitas yan sanat D5 untuk !eker'a denan *enu& fasilitas dra-and-dropnya mem!antu !anyak peker'aan mem!anun aplikasi !ar!asis "#$ secara sinifikan. alam proram diatas kita akan mem!uat struktur menu se!aai !erikut:
Jendela Insp e"tor s angat berguna ketika kita bekerja dengan Menu! $roses penamba'anpengurangan dan pengaturan posisi menu semua dilaksanakan dari Jendela Insp e"tor
%truktur menu dari aplikasi $kuti lankah-lankah !erikut ini untuk mem!uat struktur menu seperti diatas: 2.
4uat se!uah class JFrame dan !eri nama ool!ar*enu.'ava
;.
*enam!ahkan J*enu4ar ke dalam JFrame. +ilih komponen
KOMPONEN SWING | HALAMAN 21 *enu 4ar dari Jendela +allete kemudian klik JFrame di Jendela esin. %e!uah class J*enu4ar akan ditam!ahkan di dalam JFrame. "anti namanya men'adi menu4ar. <. *enam!ahkan J*enu ke dalam J*enu4ar. 5lik kanan J*enu4ar yan !aru sa'a kita !uat di Jendela $nspector& kemudian pilih menu :
Add > JMenu "anti nama J*enu terse!ut men'adi menuFile. 5emudian alihkan perhatian anda ke Jendela +roperties
Jendela +roperties dari class J*enu $si properti te6t denan strin 8File. 5emudian set isi properti mnemonic denan strin 8f& hal ini akan menye!a!kan tampilanya menuFile men'adi File dan user dapat menekan tom!ol ? A F untuk menaktifkan menu menuFile. =. *enam!ahkan J*enu$tem. ?ankah !erikutnya adalah menam!ahkan J*enu$tem ke dalam J*enu menuFile yan telah di!uat di lankah se!elumnya. caranya& klik kanan di J*enu menuFile di Jendela $nspector& kemudian pilih menu :
Add > JMenuItem am!ahkan !erturut-turut menu7ew& menuDpen dan menu%ave. +ilih J*enu$tem dari Jendela $nspector& kemudian untuk masin-masin J*enu$tem set te6t dan mnemonic yan sesuai dari Jendela +roperties. .
*enam!ahkan J%eparator. alam struktur menu yan !aus& menu yan mempunyai funsi serupa diletakkan dalam urutan !erderdekatan dan dipisahkan denan separator (pemisah). ?ankah menam!ahkan J%eparatortidak !er!eda denan lankah menam!ahkan J*enu$tem& klik kanan di J*enu menuFile kemudian pilih menu:
HALAMAN 22
| JAVA SWING
Add > JSeparator 0.
*enam!ahkan J*enu. 4erikutnya kita akan menam!ahkan J*enu !aru ke dalam J*enu menuFile. J*enu yan !aru ini akan !ertindak se!aai su! menu. Caranya 'ua sama : klik kanan di J*enu menuFile kemudian pilih menu :
Add > JMenu 4eri nama menu%ettin& set te6t dan mnemonic yan sesuai pada Jendela +roperties. 3.
*enam!ahkan JCheck4o6*enu$tem. +erilaku JCheck4o6*enu$tem tidak !er!eda 'auh denan JCheck4o6 !iasa& !edanya hanyalah JCheck4o6*enu$tem !erada dalam struktur menu. Cara menam!ahkan JCheck4o6*enu$tem sama denan komponen lain : klik kanan J*enu menu%ettin kemudian pilih menu :
Add > JCheckBoxMenuItem 4eri nama chk?ine7um!er& set te6t dan mnemonic yan sesuai pada Jendela +roperties. JCheck4o6*enu$tem sedikit sepesial di!andinkan denan J*enu$tem& karena JCheck4o6*enu$tem memiliki properties selected. +roperties selected ini diunakan untuk menentukan apakah JCheck4o6*enu$tem dalam keadaan terpilih atau tidak. E.
*enam!ahkan JBadio4utton*enu$tem. alam contoh ini kita akan mempunyai dua !uah JBadio4utton*enu$tem& radio4inary dan radioe6t. 5eduanya di!uat denan lankah yan sama denan komponen lain& klik kanan di J*enu menu%ettin& kemudian pilih menu :
Add > JRadioButtonMenuItem %et te6t dan mnemonic yan sesuai dari Jendela +roperties. G.
*enam!ahkan 4utton"roup. %eperti halnya JBadio4utton& JBadio4utton*enu$tem 'ua memerlukan 4utton"roup aar hanya satu !uah JBadio4utton*enu$tem yan !isa dipilih. Cara menam!ahkan 4utton"roup sanat mudah& klik item 4utton"roup dari Jendela +allete kemudian klik Jendela esin& maka otomatis 4utton"roup akan ditam!ahkan. "anti namanya men'adi roupDpen*ethod. alam Jendela $nspector& 4utton"roup yan !aru di!uat tadi akan !erada dalam kateori Dther Components& seperti terlihat dalam am!ar di !awah ini :
H
KOMPONEN SWING | HALAMAN 23
4utton"roup !erada dalam kateori Dther Components 21. *enam!ahkan JBadio4utton*enu$tem ke dalam 4utton"roup. +ilih masin-masin JBadio4utton*enu$tem dari Jendela $nspector& kemudian perahatikan Jendela +roperties dari JBadio4utton*enu$tem terse!ut& pada !aian roup4utton pilih item roupDpen*ethod& seperti terlihat dalam am!ar di !awah ini :
+roperties dari JBadio4utton*enu$tem 22. Compile dan 'alankan class ool!ar*enu.'ava. 5lik kanan class ool!ar*enu dari Jendela esin kemudaian pilih menu Bun File atau tekan tom!ol %,$F A F0. 4eker'a denan *enu menunakan *atisse sanatlah menyenankan dan produktif. ,al ini !er!eda sekali 'ika harus menetik satu demi satu kode untuk menyusun struktur menu seperti contoh proram diatas. *em!uat +opup *enu menunakan *atisse 'ua sama mudahnya. ,anya sa'a kita harus menentukan dimana dan denan
HALAMAN 24
| JAVA SWING cara apa popup menu itu muncul& apakah denan penekanan tom!ol tertentu dari key!oard atau ketika tom!ol mouse ditekan.
Membuat $opup Menu +opup menu pada dasarnya tidak 'auh !er!eda di!andinkan denan menu !iasa& hanya sa'a popup menu dapat muncul di mana sa'a& tidak hanya di !aian atas JFrame seperti halnya J*enu4ar. %elain itu kita harus menentukan kapan popup muncul& pada umumnya popup akan muncul ketika user melakukan klik kanan terhadap suatu komponen swin. *isalnya& ketika suatu ta!le di klik kanan terdapat popup yan muncul& dan se!aainya. +opup menu terutama diunakan se!aai 8conte6t sensitive menu& dimana menu yan ditampilkan oleh popup menu terantun konteks dari aplikasi& semisal : komponen apa yan dikenai aksi klik kanan& !aaimana keadaan data dalam komponen terse!ut dan se!aainya. plikasi yan memerlukan interaksi yan sanat intens denan user se!aiknya menunakan popup menu untuk memudahkan user menakses action tertentu. ,al ini 'auh le!ih praktis di!andin user harus menakses menu dalam J*enu4ar di !aian atas JFrame. +opup menu dalam contoh proram diatas akan muncul ketika user melakukan klik kanan terhadap JFrame. menu yan ditampilkanya pun hanya ada tia !uah: cut& copy dan paste. $kuti lankah-lankah !eritkut ini untuk mem!uat +opup menu : 2. 4uka class ool!ar*enu.'ava& yan telah di!uat dalam lankah se!elumnya& dalam Jendela esin. ;. 5lik Jendela +allete dan pilih J+opup*enu& kemudian klik Jendela esin. %ecara otomatis J+opup*enu akan ditam!ahkan dalam class ool!ar*enu.'ava. J+opup*enu tidak terlihat dalam Jendela esin& namun anda !isa menkasesnya melalui Jendela $nspector. <. *enam!ahkan J*enu$tem. %eperti halnya J*enu4ar& J+opup*enu dapat memiliki child !erupa J*enu& J*enu$tem& JCheck4o6*enu$tem& JBadio4utton*enu$tem dan J%eparator. *enam!ahkan J*enu$tem ke dalam J+opup*enu sanat sederhana& caranya : klik kanan pada J+opup*enu di Jendela esin& kemudian pilih menu :
Add > JMenuitem "anti nama o!'ectnya men'adi menuCut& !eralihlah ke Jendela +roperties kemudian set te6t dan mnemonic yan sesuai. ?akukan lankah ini untuk J*enu$tem yan lain& menuCopy
KOMPONEN SWING | HALAMAN 25 dan menu+aste. =. *emunculkan J+opup*enu. 5etika tom!ol kanan mouse di klik diatas JFrame& J+opup*enu akan tampil. ar !ehavior terse!ut !er'alan& kita perlu menanani event mouseClick terhadap JFrame. Caranya : a) 5lik kanan JFrame di Jendela esin& kemudian pilih menu :
Events > Mouse > mouseClicked !) i dalam 'endela source yan ter!uka masukkan kode !erikut ini :
private void formMouseClicked( java.awt.event.MouseEvent evt) { // TODO add your handling code here: if(evt.getButton() == MouseEvent.BUTTON3){ popUpMenu.show( (Component)evt.getSource(), evt.getX(),evt.getY()); } } 5ondisi if diatas diunakan apakah tom!ol yan diklik mouse adalah tom!ol se!elah kanan& 'ika nilai kem!alian method et4utton sama denan nilai 4#D7< maka !enar tom!ol kanan yan ditekan. *ethod show diunakan untuk memunculkan popup menu& parameter pertama diisi denan Component dimana nantinya popup menu akan ditampilkan& sedankan parameter kedua dan ketia diisi denan letak koordinat popup menu akan ditampilkan. . %impan file ool!ar*enu.'ava& compile dan 'alankan. 5emudian co!a munculkan popup menu denan menklik kanan JFrame. +opup menu sanat !eruna 'ika aplikasi yan kita kem!ankan mem!utuhkan interaksi yan intensif denan user. +opup menu menyediakan cara mudah untuk menakses menu/action yan sesuai denan konteks dari aplikasi.
Membuat ,oolbar ool!ar mem!erikan dimensi lain dalam menakses menu d!andinkan menu ataupun popup menu. +ada umumnya ool!ar merupakan cara sinkat untuk menakses menu. *enu yan diwakili tool!ar adalah menu yan !ersifat umum dan tidak terikat pada konteks tertentu. 5eunaan lain dari tool!ar adalah mempercantik tampilan aplikasi& karena tool!ar !iasanya adalah tom!ol yan didekorasi denan
HALAMAN 26
| JAVA SWING icon yan menarik. %elain itu tool!ar 'ua mem!erikan kesempatan kepada user untuk menkustomisasi tampilan dari aplikasi. 5arena layout tool!ar sanat fleksi!el& user !isa memindah-mindahkan letak tool!ar di dalam aplikasi& di atas& di!awah atau disampin& atau !ahkan menam!an (floatin) diatas 'endela yan sedan aktif. alam contoh proram diatas kita akan mem!uat se!uah Jool4ar denan dua !uah J4utton yan telah didekorasi denan icon cantik. $con yan diunakan !anyak tersedia di internet& format file yan dipilih adalah .pn& karena format file ini palin !aus dalam menanani transparasi komponen. %e!elum mulai mem!uat Jool4ar& kita perlu mempersiapkan terle!ih dahulu icon yan akan diunakan se!aai dekorasi J4utton. $kuti lankah-lankah !erikut ini : 2.
4uatlah se!uah 'ava packae !aru untuk menampun semua icon yan akan diunakan. caranya klik kanan di 'endela +ro'ects !aian nama pro'ect& pilih menu :
New > Java Package 4eri nama imaes untuk 'ava packae yan !aru sa'a kita !uka. ;.
*emasukkan $con ke dalam packae. #ntuk memasukkan imae ke dalam packae kita perlu tahu dimana pro'ect disimpan& misalkan pro'ect disimpan dalam folder :
c:\javaswing 4uka file e6plorer& kemudian naviasi ke folder
penting (uild $roje"t akan ber'asil jika tidak ada satupun e rror dala m kode program! Sebelum melakukan build proje"t pastikan terlebi' da'ulu tidak ada error dalam kode! +akukan build setiap kali menamba'kan &ile non% ja va ke da lam &ol der sour"e &ile! 0gar &ile tersebut ikut ter"op# ke dalam &older build1"lasses
c:\javaswing\src\images Copy semua icon yan diperlukan ke dalam folder diatas. <.
4uild pro'ect. ?ankah ini diperlukan untuk mencompile semua file .'ava men'adi file .class. %elain itu proses ini 'ua akan menkopi file selain file .'ava (termasuk file icon) ke dalam folder !uildHclasses. Jika proses ini tidak dilaksanakan& maka ketika proram di'alankan& file icon tidak akan ditemukan dan proram men'adi error .
%etelah proses persiapan selesai& lakukan lankah-lankah !erikut ini untuk mem!uat ool!ar : 2. 4uka class ool!ar*enu.'ava yan sudah di!uat di lankah se!elumnya. ;. 4uat se!uah o!'ect Jool4ar& caranya : klik item Jool4ar dari Jendela +allete& kemudian klik JFrame di Jendela esin. %ecara otomatis se!uah o!'ect Jool4ar akan dimasukkan ke dalam JFrame. "anti namanya men'adi tool4ar.
KOMPONEN SWING | HALAMAN 27 <. *enam!ahkan J4utton dalam Jool4ar. 5lik item J4utton dalam Jendela +allete kemudian klik komponen Jool4ar yan !aru sa'a kita !uat tadi. J4utton !aru akan diletakkan diatas Jool4ar& anti nama J4utton terse!ut men'adi !tn7ew. ?etakkan lai satu !uah J4utton diatas Jool4ar dan !eri nama !tn*a6imie. =. *endekorasi ampilan J4utton. ar tampilan J4utton terlihat cantik& kita perlu meneset !e!erapa nilai dari properti J4utton& seperti terlihat pada am!ar di !awah ini :
Jendela +roperties J4utton a) e6t& hapus nilai te6tnya. !) 4order& pilih !ordernya men'adi empty !order dan set nilai !ordernya men'adi I&&&. u'uan pem!erian empty !order ini aar tom!ol !erukuran le!ih !esar di!andinkan denan icon yan akan diunakan nanti& dan setiap mouse melewati J4utton& ada efek transisi yan cantik. #ntuk menedit !order dari J4utton& *atisse menyediakan Jendela 4order untuk memilih !order yan kita ininkan untuk J!utton. 4order yan dipilih !isa sinle !order& atau composite !order yan terdiri dari !e!erapa !order.
HALAMAN 28
| JAVA SWING
Jendela 4order ditor dari J4utton c) DpaKue& uncheck nilai opaKue. 4ertu'uan aar tom!olnya !erwarna transparan& sehina mempunyai warna !ackround yan sama denan !ackround Jool4ar. d) $con& anti iconya denan icon yan telah disiapkan. #ntuk memasukkan icon ke dalam J4utton& tekan tom!ol di sampin pilihan $con di dalam Jendela +roperties& kemudian akan muncul ialo $con ditor seperti di !awah ini : Jendela icon editor +ilih radio !utton Classpath& kemudian tekan tom!ol %elect File dan pilih salah satu icon yan telah disiapkan. ekan D5. ?akukan lankah-lankah yan sama terhadap J4utton yan lain. . Compile dan 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 denan aplikasi terkadan tidak !er'alan denan !aik karena user mem!erikan aksi yan tidak valid kepada aplikasi. 5etika hal terse!ut ter'adi& aplikasi harus mem!eritahukan kepada user apa yan telah ter'adi dan !aaimana seharusnya user memper!aikinya. *odel interaksi seperti ini tepat dilaksanakan menunakan dialo. %kenario lain adalah ketika aplikasi memerlukan input dari user aar aplikasi !isa terus melaksanakan tuasnya& misalnya meminta konfirmasi apakah user yakin akan melaksanakan se!uah aksi pentin terhadap aplikasi seperti delete& update atau add data. ialo 'ua mem!erikan pem!atasan kepada user& se!elum dialo selesai diproses& user tidak akan !isa !erinteraksi denan !aian aplikasi lainya. ialo menceah hal ini ter'adi denan memastikan !ahwa 'endela yan !isa diaktifkan hanyalah 'endela dialo& sedankan 'endela aplikasi yan lain tidak dapat diaktifkan selama 'endela dialo masih aktif. plikasi sanat serin menunakan dialo untuk !erinteraksi denan user& tetapi 'enis interaksinya selalu seraam dan !erulan-
HALAMAN 30
| JAVA SWING ulan. %win menyediakan dialo yan didesin untuk keperluan yan serin muncul dalam aplikasi& seperti JDption+ane dan JFileChooser. %win 'ua menyediakan class Jialo 'ika kita inin mem!uat dialo custom sesuai keininan kita.
Membuat pre%de&ined dialog dengan J2ption$ane JDption+ane menyediakan !e!erapa dialo yan siap pakai dan serin diunakan dalam aplikasi. JDption+ane sanat memudahkan kita dalam meminta user suatu input tertentu atau mem!eritahu user apa yan ter'adi dalam aplikasi. JDption+ane mempunyai !anyak static method untuk menampilkan popup dialo denan mudah. erdapat empat method utama yan dapat kita unakan se!aai landasan mem!uat dialo. 5eempat method terse!ut secara rinci diam!arkan dalam ta!le !erikut ini: *ethod
eskripsi
showConfirmialo
*eminta konfirmasi daru user& seperti yes/no/cancel
show$nputialo
*eminta input dari user& !aik !erupa input te6t menunakan Je6tField maupun pilihan menunakan JCom!o4o6
show*essaeialo *em!eritahukan user tentan apa yan !aru sa'a ter'adi showDptionialo
"a!unan dari ketia 'enis dialo diatas
a!le method JDption+ane %win 'ua menyediakan method show$nternalLLL yan diunakan 'ika kita !eker'a denan J$nternalFrame. +arameter dari keempat method terse!ut menikuti pola yan konsisten. erurut dari kiri ke kanan& !erikut ini 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 tenah-tenah parent component. Jika nilai dari parentComponent diset null& maka dialo akan menunakan frame default dan dialo akan diletakkan ditenah-tenah layar monitor (terantun ?MF). ;. messae +esan yan deskriptif menerankan perihal dialo muncul. +ada umumnya messae !erupa pesan %trin akan diletakkan dalam dialo& namun 'enis o!'ect lain dii'inkan diunakan se!aai messae. D!'ect-o!'ect
yan yan 'ua yan
KOMPONEN SWING | HALAMAN 31 dii'inkan akan diperlakukan !er!eda& o!'ect-o!'ect terse!ut antara lain a) D!'ectI %etiap o!'ect akan ditampilkan dalam dialo !erurut dari atas ke !awah. turan ini !erlaku rekursif untuk semua o!'ect didalam array. !) Component Jika o!'ect yan dimasukkan se!aai messae !ertipe Component& maka Component terse!ut akan ditampilkan ditenah-tenah dialo. c) $con $con akan dimasukkan ke dalam se!uah J?a!el kemudian ditampilkan di se!elah kiri dari dialo. d) others D!'ect lainya akan ditampilkan dalam dialo denan menam!il nilai kem!alian dari method to%trin dari setiap o!'ect. <. messaeype *endefisikan 'enis dari pesan. +ada umumnya mem!erikan custom icon untuk setiap 'enis pesan. %etiap ?MF manaer akan memperlakukan setiap 'enis pesan denan !er!eda& namun per!edaanya tidak akan terlalu mencolok. +ilihan yan munkin dan icon yan mewakilinya adalah: a) BBDBN*%%" !) $7FDB*$D7N*%%" c) 9B7$7"N*%%" d) +?$7N*%%" (tanpa icon) =. optionype *endefisikan tom!ol-tom!ol yan akan ditampilkan di !aian !awah dari dialo. a) F#?ND+$D7 !) >%N7DND+$D7 c) >%N7DNC7C?ND+$D7 d) D5NC7C?ND+$D7 7amun kita tidak di!atasi untuk hanya menunakan empat 'enis set tom!ol diatas& kita dapat mendefisikan tom!ol-tom!ol
HALAMAN 32
| JAVA SWING yan akan muncul sesuai ke!utuhan. . options eskripsi yan le!ih detail dari set tom!ol yan diunakan dialo. 7ilai yan laim adalah se!uah array %trin !erisi te6t yan akan ditampilkan di setiap tom!ol. 7amun D!'ect lain 'ua dapat diterima& antara lain: a) Component Component akan diletakkan dalam !aris tom!ol secara lansun. !) $con %e!uah J4utton akan di!uat dan didekorasi denan icon ini. c) other D!'ect denan tipe selainnya akan diru!ah ke dalam !entuk %trin denan menam!il nilai kem!alian dari method to%trin dari o!'ect terse!ut. 0. icon $con yan diunakan untuk mendekorasi dialo. Jika icon ini didefinisikan maka akan menimpa icon default yan didefinisikan oleh messaeype. 3. title Judul dari dialo yan diletakkan di !aian palin atas dari dialo. E. initialalue 7ilai default dari pilihan yan munkin ada dalam dialo. #ntuk le!ih 'elasnya& !erikut ini !e!erapa contoh kode penunaan JDption+ane !eserta hasil tampilanya :
JOptionPane.showMessageDialog(null, "Simple plain dialog","Plain dialig", JOptionPane.PLAIN_MESSAGE);
ampilan dialo sederhana
KOMPONEN SWING | HALAMAN 33
JOptionPane.showMessageDialog(null, "Your action was succeed, “ + “you can proceed to next assigment", "Information dialog", JOptionPane.INFORMATION_MESSAGE);
ampilan dialo denan tipe dialo $nformation
JOptionPane.showMessageDialog(null, "You neet to be sure to do this action!", "Dialog Peringatan", JOptionPane.WARNING_MESSAGE);
ialo denan tipe 9arnin
JOptionPane.showMessageDialog(null, "Something goes wrong and generate error message", "Error Dialog", JOptionPane.ERROR_MESSAGE);
ialo denan tipe rror
JOptionPane.showConfirmDialog(null, "Choose yes or no","Confirmation Dialog", JOptionPane.YES_NO_OPTION, JoptionPane.WARNING_MESSAGE);
HALAMAN 34
| JAVA SWING
Dption dialo denan tipe $nformation dan pilihan >%N7D
JOptionPane.showConfirmDialog(null, "Choose yes, no or cancel","Confirmation Dialog", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
Dptionialo
JOptionPane.showInputDialog(null, "Input your name here","Input Dialog", JOptionPane.INFORMATION_MESSAGE);
$nputialo denan tipe messae $nformation
String[] options = {"Apple","Mango","Grape","Guava"}; JOptionPane.showInputDialog(null, "Choose this one Option","Input dialog", JOptionPane.WARNING_MESSAGE,null,options,"Apple");
$nputialo dialo denan tipe 9arnin& Dptions !erupa array of %trin dan initialalue O pple
KOMPONEN SWING | HALAMAN 35
Membuat JFileC'ooser JFileChooser diunakan untuk !ernaviasi dalam file system& kemudian memilih satu atau le!ih file atau folder dari list file dan folder. JFileChooser pada dasarnya adalah penem!anan dari dialo yan dapat diunakan untuk memilih file. JFileChooser dapat diunakan se!aai dialo untuk menyimpan file atau untuk mem!uka file. JFileChooser hanya mem!erikan fasilitas untuk memilih file atau folder& sedankan mekanisme untuk menyimpan atau mem!uka file dilakukan sendiri menunakan li!rary $/D. plikasi !erikut ini adalah contoh penunaan JFileChooser untuk mem!uka dan menyimpan file.
Contoh proram menunakan JFileChooser ampilan JFileChooser ketika tom!ol open ditekan adalah seperti di !awah ini :
ampilan JFileChooser #ntuk mem!uat aplikasi diatas lakukan lankah-lankah !erikut ini : 2.
4uat class JFrame Form !aru& !eri nama Chooser.'ava
;.
*asukkan dua !uah Je6tField : t6tDpen dan t6t%ave& dua !uah
HALAMAN 36
| JAVA SWING J!utton : !tnDpen dan !tn save& se!uah J?a!el : l!l%tatus. %esuaikan penataan komponen sesuai denan am!ar diatas. <.
am!ahkan se!uah o!'ect JFileChooser se!aai field dari class Chooser& !eri nama chooser.
public class Chooser{ JFileChooser chooser = new JFileChooser(); //kode lain di sini } =.
File7ame6tentionFilter diunakan se!aai file filter dalam JFileChooser. *etode filterinnya adalah mencocokkan ekstensi file dalam file system denan ekstensi yan ada dalam File7ame6tentionFilter. Contoh kode di !awah ini akan menye!a!kan JFileChooser mempunyai pilihan 8J+" File& dan 'ika pilihan terse!ut dipilih& maka file denan ekstensi 8'p& 8'pe&J+" atau8J+" sa'a yan akan ditampilkan oleh JFileChooser.
FileNameExtensionFilter JPEGFilter = new FileNameExtensionFilter( "JPEG File","jpg","jpeg",”JPG”,”JPEG”); chooser.addChoosableFileFilter(JPEGFilter); .
%et direktori yan akan ditu'u oleh JFileChooser. #ntuk menetahui dimana direktori aktif aplikasi& kita !isa menunakan system property 8user.dir. 5ode !erikut ini akan menye!a!kan JFileChooser di!uka pada direktori aktif aplikasi :
String dir = System.getProperty("user.dir"); chooser.setCurrentDirectory(new File(dir)); 0.
*enhandle event penekanan tom!ol !tn%ave. 5etika tom!ol !tn%ave ditekan& chooser akan menampilkan dialo save file& kemudian menam!il nama file yan dipilih dan menampilkannya dalam t6t%ave& serta menampilkanya dalam l!l%tatus. 4erikut ini kodenya :
KOMPONEN SWING | HALAMAN 37
private void btnSaveActionPerformed(ActionEvent evt) { // TODO add your handling code here: int ret = chooser.showSaveDialog(this); if(ret == JFileChooser.APPROVE_OPTION){ File f = chooser.getSelectedFile(); lblStatus.setText("Status : saving file" + f.getAbsolutePath()); txtSave.setText(f.getAbsolutePath()); } } 3.
*enhandle penekanan tom!ol !tnDpen. 5ode untuk menanani penekanan tom!ol !tnDpen mirip denan kode untuk menanani penenakan tom!ol !tn%ave& per!edaanya adalah !tnDpen akan menampilkan dialo open file& !erikit ini kodenya :
private void btnBrowseActionPerformed(ActionEvent evt){ // TODO add your handling code here: int ret = chooser.showOpenDialog(this); if(ret == JFileChooser.APPROVE_OPTION){ File f = chooser.getSelectedFile(); lblStatus.setText("Status : opening file" + f.getAbsolutePath()); txtOpen.setText(f.getAbsolutePath()); } } E.
Compile dan 'alankan aplikasinya denan menekan tom!ol %,$F A F0
4eker'a denan JDption+ane dan denan JFileChooser sanat sederhana. 5eduanya menunakan modal dialo untuk menam!il input dari user. *odal dialo akan menceah user menakses !aian aplikasi lain se!elum dialo ditutup& atau dalam hal ini memutuskan pilihan apa yan diam!il oleh user. *asih !anyak lai komponen swin yan disediakan oleh J5& anda tinal melan'utkan mem!aca dari referensi yan di!erikan modul ini pada !aian akhir untuk melan'utkan pem!ela'aran anda tentan Java desktop.
HALAMAN 38
| JAVA SWING
Konsep M3C *C *C adal adalah ah arsi arsitek tektu turr apli aplikas kasii yan yan memi memisa sahka hkan n kode kode-k -kod ode e apli aplikas kasii dala dalam m tia tia lapi lapisa san& n& *ode *odel& l& iew iew dan dan Cont Contro rol. l. *C *C termasuk termasuk dalam dalam arsitektura arsitekturall desin desin pattern pattern yan menhendaki menhendaki oranisasi kode yan terstruktur dan tidak !ercampur aduk. 5etika aplikasi aplikasi sudah sanat sanat !esar dan menanani menanani struktur data yan kompleks& harus ada pemisahan yan 'elas antara domain model& komponen view dan kontroler yan menatur penampilan model dalam view. rsitektur *C ini memunkinkan adanya peru!ahan dalam domain domain model tanpa harus harus menu!ah menu!ah code untuk menampilkan menampilkan domain model terse!ut. ,al ini sanat !ermanfaat ketika aplikasi mempunyai domain model dan view komponen sanat !esar dan kompleks.
iaram interaksi antar komponen dalam arsitektur *C (9ikipedia.or) *odel *odel adalah adalah repres represent entasi asi dari dari o!'ect o!'ect yan yan sedan sedan diolah diolah oleh oleh aplika aplikasi& si& dalam dalam Java& Java& model model ini !iasan !iasanya ya direpr direprese esesen sentas tasikan ikan se!aai Java 4ean. Java 4ean adalah class Java !iasa atau +DJD (+lain Dld Java D!'ect). %yarat se!uah +DJD dianap se!aai Java 4ean adalah : 2. *emp *empun unya yaii cons constr truc ucto torr defa defaul ult& t& cons constr truc ucto torr yan yan tida tidak k mempunyai parameter. ;. %emua %emua field-f field-fiel ield d yan !isa diakse diakses s dilenka dilenkapi pi denan denan etter 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 representasi *odel dalam Java untuk ntity +erson. +erson. 4e!erapa 4e!erapa oran terkadan terkadan salah menartika menartikan n model ini se!a se!aa aii data data akse akses s doma domain in.. ima imana na data data dari dari sum! sum!er er data& data& misalnya misalnya data!ase& data!ase& diam!il dan diolah. diolah. +ada hakekatnya *odel adalah representasi data dari o!'ect se!enarnya& !ukan kumpulan kode untuk menakses data dari data!ase. +endekatan +endekatan ter!aik adalah adalah memisahkan memisahkan kode untuk melakukan akses sum!er data ke dalam lapisan tersendiri& lapisan ini !iasanya dise!ut dise!ut se!aai se!aai service. service. %ervice %ervice diimpleme diimplementasik ntasikan an dalam dalam !entuk class-class yan dise!ut se!aai manaer& misalnya %P?*anaer& +rint*anaer& Beport*anaer& L*?*anaer& 9e!%ervice*anaer dan seterusnya. enan !eitu kode akan men'adi le!ih rapi dan terstruktur. terstruktur. *anfaat palin palin terasa terasa adalah adalah kemudahan kemudahan pencarian pencarian kesal kesalah ahan an dan dan pena penam! m!ah ahan an modu modull-mo modu dull !aru !aru tida tidak k haru harus s merom!ak seluruh struktur aplikasi. iew adalah komponen untuk merepresentasikan *odel dalam !entuk !entuk visual visual.. %emisa %emisall kompon komponen en swin& swin& sepert sepertii : Ja!le Ja!le&& J?ist& J?ist& JCom!o4o6 dan se!aainya. iew 'ua !ertanun 'awa! untuk menankap interaksi user terhadap sistem& semisal : klik mouse& penekanan tom!ol key!oard& !arcode scannin dan se!aainya. Cont Contro roll ller er se!e se!ena narn rnya ya hany hanya a sekum sekumpu pula lan n kode kode-ko -kode de untu untuk k mensinkronisasi keadaan *odel dan iew. Jika ada peru!ahan data dari dari *odel& *odel& Contro Controlle llerr harus harus menup menupdat date e tampil tampilan an iew. iew. an se!aliknya 'ika user mem!erikan event terhadap iew& Controller haru harus s men menup upda date te *ode *odell sesu sesuai ai den denan an hasi hasill inter interak aksi si user user terhadap iew.
Model dalam Komponen Swing %e!aa %e!aaian ian !esar !esar kompon komponen en swin swin mempun mempunyai yai model. model. J4utto J4utton n mempunyai model yaitu 4utton*odel yan memean state dari J4utton Q apa key!oard mnemonicnya& apakah J4utton terse!ut sedan sedan dipilih dipilih atau tidak tidak dan seterus seterusnya nya.. da pula kompone komponen n swin swin yan yan mempun mempunyai yai le!ih le!ih dari dari satu satu model. model. J?ist J?ist mempun mempunya yaii
HALAMAN 40
| JAVA SWING ?ist*odel ?ist*odel yan memean isi dari J?ist dan ?ist%election*od ?ist%election*odel el untuk mencatat item J?ist yan sedan dipilih. +ada +ada !anyak !anyak kasus kasus normal normal kita kita tidak tidak perlu perlu pusin pusin memiki memikirka rkan n model ini. %emisal kita tidak perlu memikirkan model dari J4utton karena pada kasus umum kita tidak perlu memodifikasi model dari J4utton. ?alu& ?alu& kenapa kenapa model model kompon komponen en swin swin di!uat di!uatR R lasan lasan utaman utamanya ya adalah adalah fleksi!ilit fleksi!ilitas as untuk menentukan menentukan !aaiman !aaimana a data disimpan disimpan dan diam!i diam!ill dari dari kompon komponen en swin. swin. *isaln *isalnya ya kita kita mempun mempunyai yai apli aplikas kasii spre spread adsh shee eett yan yan men menu una naka kan n komp kompon onen en Ja! Ja!le le&& karakteristik utama spreadsheet adalah !anyak cell yan koson& denan !eitu kita !isa memilih model data yan sesuai denan karakteristik terse!ut. Contoh lainnya adalah Ja!le yan diunakan untuk menampilkan data dari data!ase denan 'umlah !aris luar !iasa !anyak. 5ita !isa menatur aar tampilan Ja!le di!uat halaman-per-halaman dalam menampilkan !aris data& tidak semua data ditampilkan dalam satu halaman& halaman& hal ini ditu'ukan untuk efisiensi efisiensi dan mempertahankan mempertahankan aar aar aplika aplikasi si tetap tetap respon responsif sif walau walau !eker' !eker'a a denan denan data data yan yan !esar. *odel dalam komponen swin 'ua mempunyai keuntunan lain& yaitu tidak perlu ada dua dua data terpisah& untuk struktur data aplikasi dan untuk komponen swin. 5eunaan *odel yan cukup pentin 'ua adalah adanya konsep event-listene event-listener& r& dimana dimana 'ika ter'adi event peru!ahan peru!ahan data dalam model& semua listener yan terdaftar dalam model terse!ut akan di!eritahu dan tindakan yan tepat dapat diam!il untuk menanani event event yan yan muncul muncul.. %e!aa %e!aaii contoh contoh&& untuk untuk menam! menam!ahk ahkan an item item dala dalam m J?is J?istt kita kita !isa !isa mema meman ni ill meth method od add$ add$te tem m dari dari J?$s J?$st. t. +enam!ahan item dalam J?ist ini akan menaki!atkan ?ist*odel memicu event dalam J?ist dan listener lainnya. 5omponen swinS dalam hal ini J?istSakan diupdate tampilanya untuk merefleksikan peru!ahan item dalam ?ist*odel. 9alaupun terkadan !anyak yan menye!ut arsetektur komponen swin se!aai *C& tetapi tetapi pada dasarnya dasarnya arsitektur arsitektur komponen swin swin tidak tidak sepenu sepenuhny hnya a *C. *C. 5ompon 5omponen en swin swin secara secara umum umum di!uat di!uat aar aar iew iew dan Contro Controlle llerr dileta diletakkan kkan dalam dalam satu satu tempat tempat (cla (class ss)) yait yaitu u clas class s #$ yan yan dise disedi diak akan an oleh oleh ?ook?ook-an andd-Fe Feel el.. rsitektur komponen swin le!ih tepat dise!ut se!aai 8rsitektur denan *odel yan terpisah. %elan'utnya kita akan mem!ahas !e!erapa model yan serinkali harus kita kustomisasi sesuai denan ke!utuhan. %edankan model yan nyaris tidak pernah kita ru!ahS4utton*odelStidak di!ahas dalam !aian ini.
KONSEP MVC | HALAMAN 41
TableModel a!le*odel adalah class model yan palin serin dikustomisasi. 5arakteristik data dari Ja!le yan !er!entuk koleksi data dua dimensi mem!utuhkan perhatian khusus aar efisien diunakan dalam aplikasi. Jika kita tidak hati-hati& maka aplikasi kita !isa men'adi sanat lam!at dan tidak efisien. a!le*odel adalah interface yan diunakan oleh Ja!le untuk mendefinisikan ciri-ciri dari data ta!ular yan akan ditampilkan oleh Ja!le. *isalnya : 'umlah kolom& nama kolom& class dari o!'ect dalam kolom& 'umlah !aris dan nilai setiap cell. enan adanya data-data ini Ja!le dapat secara efisien menentukan !aaimana menampilkan data terse!ut. 4erikut ini adalah kode untuk menampilkan koleksi o!'ect +erson. Class rray?istT+ersonU adalah implementasi dari enerics& konsep dalam Java yan diunakan untuk mendefinisikan isi dari koleksi. rray?istT+ersonU artinya adalah mem!uat se!uah o!'ect koleksi rray?ist yan harus diisi oleh o!'ect +erson dan tidak !isa diisi oleh o!'ect lainya& misalnya %trin.
public class PersonTableModel extends AbstractTableModel{ private List
persons; public PersonTableModel(List 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 !straca!le*odel& method isCelldita!le selalu menem!alikan nilai false& artinya semua cell tidak dapat diedit. 5emudian method setaluet adalah method koson !elaka& artinya 'ika kita memanil method ini tidak akan ter'adi apa-apa. Class kedua adalah efaulta!le*odel yan telah menimplementasi semua method a!stract dari interface a!le*odel. Bepresentasi data efaulta!le*odel menunakan dua 'enis data ta!ular& yaitu array dua dimensi& D!'ectII& dan ector dari ector& ectorTectorTD!'ectUU. Jika kita mempunyai struktur data selain kedua 'enis terse!ut kita harus melakukan konversi data ke dalam salah satu !entuk struktur data terse!ut. Cara yan le!ih cerdas adalah mendefinisikan sendiri class yan menimplement interface a!le*odel seperti class Customera!le*odel diatas. %etelah a!le*odel selesai didefinisikan kita tinal memanil method seta!le*odel dari o!'ect Ja!le& atau mem!uat o!'ect Ja!le !aru menunakan constructor yan menerima arumen a!le*odel. Contohnya seperti potonan kode di !awah ini :
JTable table = new JTable(new DefaultTableModel()); JTable table1 = new JTable(); table1.setModel(new DefaultTableModel());
ListModel J?ist adalah komponen swin yan mempunyai dua model sekalius& ?ist*odel dan ?ist%election*odel. ?ist*odel diunakan untuk mendefinisikan item/element yan dikandun oleh J?ist. %edankan ?ist%election*odel diunakan untuk mendefinisikan !aaimana representasi data 'ika ter'adi proses pemilihan di J?ist. %eperti halnya a!le*odel& ?ist*odel mempunyai dua class yan menimplement ?ist*odel& !stract?ist*odel dan efault?ist*odel. 5ita !isa menunakan salah satu dari tia tipe
KONSEP MVC | HALAMAN 43 terse!ut untuk mem!uat o!'ect ?ist*odel. Cara pertama denan mem!uat class !aru yan menimplement ?ist*odel. Cara kedua denan mem!uat class !aru yan mene6tends !stract?ist*odel dan cara ketia denan lansun menunakan efault?ist*odel. %truktur data J?ist tidak terlalu rumit seperti Ja!le& dan pada umumnya& cukup hanya denan menunakan efault?ist*odel sudah memenuhi se!aaian !esar ke!utuhan penunaan J?ist. 4erikut ini contoh !aaimana mem!uat ?ist*odel untuk data customer& contoh ini menunakan cara kedua untuk mem!uat o!e'ct ?ist*odel& yaitu denan cara mem!uat class !aru yan mene6tends !stract?ist*odel :
public class CustomerListModel extends AbstractListModel{ private ArrayList customer = new ArrayList(); public CustomerListModel(List cust){ customers.addAll(cust); } public Object getValueAt(int index) { return customers.get(index); } public int getSize() { return customers.size(); } } $mplementasi ?ist*odel sanat mudah dan tidak serumit a!le*odel& namun implementasi dari ?ist%election*odel sanat rumit& karena kita harus menimplementasi dua puluh !uah method. ?e!ih !aik menunakan implementasi standard dari ?ist%election*odel yaitu efault?ist%election*odel.
HALAMAN 44
| JAVA SWING
Menangani /vent vent dan ?istener adalah implementasi dari pattern D!server dalam Java. +attern D!server sanat !eruna diunakan untuk mendesin komunikasi yan konsisten antara o!'ect yan !erdiri sendiri dan o!'ect-o!'ect yan !erantun padanya. D!server desin pattern meli!atkan dua o!'ect utama& o!'ect pertama !erlaku se!ai %u!'ect dan o!'ect lainya !erlaku se!aai D!server. D!'ect %u!'ect merupakan pusat perhatian dari o!'ect D!server& peru!ahan keadaan dari o!'ect %u!'ect selalu dipantau oleh D!server. D!server dapat melakukan reister-unreister terhadap %u!'ect. Jika D!server tertarik denan perilaku dan keadaan dari %u!'ect& D!server dapat mereister dirinya kepada %u!'ect. 4eitu 'ua se!aliknya 'ika D!server tidak tertarik terhadap keadaan atau perilaku %u!'ect& D!server tidak perlu melakukan resistrasi atau kalau sudah terlan'ur reuister dapat melakukan unreister. %u!'ect mempunyai !anyak aspek perilaku dan keadaan yan dapat dipantau oleh D!server. #ntuk setiap aspek& %u!'ect menyediakan method untuk reister-unreister dan menyediakan interface yan harus diimplement oleh D!server yan inin memantau aspek terse!ut. +ada satu titik tertentu& %u!'ect akan mem!eritahu (notify) D!server tentan perilaku atau keadaanya. %u!'ect akan menumpulkan informasi tentan keadaan atau perilakunya kemudian menirimkan pesan kepada D!server lewat interface yan telah disepakati keduanya& pola ini dikenal 'ua se!ai vent+assin. +attern D!server dimaksudkan untuk menurani keterantunan satu o!'ect terhadap o!'ect lain& istilah kerennya adalah ecouplin. enan mekanisme reister-unreister& D!server dapat secara le!ih leluasa memutuskan untuk memantau %u!'ect tertentu atau tidak. *ekanisme notify memudahkan %u!'ect mem!eritahu keadaan dan perilakunya kepada D!server yan sedan memantaunya. i !aian !erikutnya kita akan melihat !aaimana pattern D!server diimplementasikan dalam swin. kan di'elaskan pula !aaimana swin menimplementasikan mekanisme reisterunreister dan notify dalam menanani interaksi user terhadap komponen swin.
MENANGANI EVENT | HALAMAN 45
Event Listener dalam Swing +attern D!server meli!atkan dua o!'ect %u!'ect dan D!server& dalam swin D!server dikenal se!aai ?istener. 5emudian& ketika %u!'ect akan mem!eritahu (notify) D!server tentan apa yan sedan ter'adi dalam o!'ect %u!'ect& ada satu informasi yan akan di-passin oleh %u!'ect ke D!server& informasi ini dise!ut se!aai vent o!'ect. %edankan ke'adian ketika %u!'ect melakukan notify kepada D!server dise!ut se!aai vent trierin. ar pen'elasan diatas mudah dipahami& kita akan mem!uat aplikasi sederhana yan menimplementasikan pattern D!server. plikasi sederhana ini terdiri dari dua class utama yaitu %u!'ect dan D!server. Class %u!'ect akan men'alankan se!uah loop tanpa !atas& di dalam loop terse!ut %u!'ect akan meminta input dari user !erupa se!uah kata yan diakhiri denan penekanan enter. 5etika user menekan enter& %u!'ect akan menotify D!server. alam proses notifikasi terse!ut& %u!'ect menumpulkan informasi tentan event pemasukan kata oleh user& informasi terse!ut !erupa : kata apa yan dimaksukkan dan o!'ect su!'ect dimana event pemasukan kata terse!ut ter'adi (source). 5emudian D!server akan menerima informasi dari %u!'ect dan mencetak informasi terse!ut ke standard output. 4erikut ini tampilan dari aplikasi sederhana ini : type a word : ifnu print from observer : first observer event from : subject observed key presed is ifnu %u!'ect akan mencetak strin 8type a word : dan menunu user untuk memasukkan satu kata dan menekan enter. *isalnya dalam contoh diatas 8ifnu. 5emudian %u!'ect akan menhimpun informasi tentan sum!er event (%u!'ect itu sendiri) dan kata yan diketikkan user (ifnu). %etelah itu& %u!'ect mem!eritahu (notify) D!server !ahwa telah ter'adi event pemasukan kata denan menyertakan informasi yan telah dihimpun %u!'ect. D!server menerima informasi dari %u!'ect !ahwa telah ter'adi event pemasukan kata oleh user& selan'utnya D!server akan men'alankan tindakan-tindakan untuk menanani event terse!ut. indakan terse!ut adalah : mencetak informasi D!server& source& dan kata yan dimasukkan oleh user. i dalam class %u!'ect terdapat field 2. 5oleksi D!server (listeners) ;. 7ama (name) <. 5ata yan dimasukkan user (wordntered) 5emudian ada 'ua method :
HALAMAN 46
| JAVA SWING 2.
Constructor yan menerima parameter %trin& parameter ini diunakan se!aai penenal (name) dari o!'ect %u!'ect. ;. Beister-unreister D!server (reister?istener& remove?istener) <. *ethod private untuk menotify D!server (trier?istener) =. *ethod untuk menerima input kata dari user (run+roram) 4erikut ini kode lenkapnya :
public class Subject { private Set listeners = new HashSet(); private String wordEntered; private String name; public Subject(String subjectName){ name = subjectName; } public void runProgram(){ while(true){ Console c = System.console(); wordEntered = c.readLine("type a word : "); if(wordEntered.equals("exit")) break; else triggerListener(); } } private void triggerListener(){ KeyboardPressedEvent event = new KeyboardPressedEvent(); event.setSource(this); event.setWord(wordEntered); for(KeyboardPressedListener l : listeners){ l.keyPressed(event); } } public void registerObserver( KeyboardPressedListener l){ listeners.add(l); } public void removeObserver( KeyboardPressedListener l){ listeners.remove(l); } public String toString(){ return name; } } $nterface 5ey!oard+ressed?istener diunakan se!aai 8kontrak antara %u!'ect dan D!server. $nterface ini men'amin !ahwa D!server yan akan memantau event pemasukan kata dari user dalam %u!'ect mempunyai method key+ressed. *ethod key+ressed
MENANGANI EVENT | HALAMAN 47 ini nanti yan akan dipanil oleh %u!'ect ketika event pemasukan kata oleh user ter'adi di %u!'ect.
public interface KeyboardPressedListener { public void keyPressed(KeyboardPressedEvent e); } Class D!server menimplement interface 5ey!oard+ressed?istener dan nantinya akan didaftarkan ke su!'ect se!aai D!server. *ethod key+ressed diimplementasikan denan mencetak informasi yan diperoleh dari %u!'ect ke standard output.
public class Observer implements KeyboardPressedListener{ private String name; public Observer(String name){ this.name = name; } public void keyPressed(KeyboardPressedEvent e) { System.out.println("print from observer : " + name + "\n\tevent from : " + e.getSource() + "\n\tkey presed is " + e.getWord() );}} Class 5ey!oard+ressedvent adalah Java 4ean !iasa yan menyimpan informasi ke'adian pemasukan kata oleh user& didalamnya hanya ada field source dan word serta etter-setter method untuk kedua field terse!ut.
public class KeyboardPressedEvent { private Object source; private String word; public Object getSource() { return source; } public void setSource(Object src) { source = src;} public String getWord() { return word; } public void setWord(String wrd) { word = wrd; } } %ampai disini& class-class diatas masih !erdiri sendiri dan !elum ada class yan mempunyai method main. 7ah& disinilah kode class *ainClass untuk menyatukan semua o!'ect diatas men'adi aplikasi utuh.
HALAMAN 48
| JAVA SWING
public class MainClass { public static void main(String[] str){ Subject subject = new Subject("subject observed"); Observer observer = new Observer("first observer"); subject.registerObserver(observer); subject.runProgram(); } } ?ankah-lankah adalah : 2.
dalam
menunakan
pattern
D!server
ini
*em!uat o!'ect su!'ect dari class %u!'ect
Subject subject = new Subject("subject observed"); ;.
*em!uat o!'ect o!server dari class D!server
Observer observer = new Observer("first observer"); <.
aftarkan o!'ect o!server ke o!'ect su!'ect
subject.registerObserver(observer); =.
Jalankan proram utamanya
subject.runProgram(); +attern D!server ini diunakan secara intensif dalam komponen swin. erutama untuk menanani event dari input peripheralS key!oard& mouse& !arcode readerSyan ter'adi di komponen swin SJe6tField& J4utton& Ja!leS. alam !aian-!aian selan'utnya kita akan !ela'ar !aaimana menanani event pada komponen swin.
ActionListener ction?istener diunakan untuk mendenarkan action dari event : ●
5lik terhadap J4utton
●
+emilihan menu item
●
+enekanan tom!ol enter dalam Je6tField
*ethod dalam ction?istener hanya satu yaitu action+erformed yan menerima arumen o!'ect ctionvent. ctionvent !erisi informasi-informasi pentin ketika ction event ter'adi& termasuk tom!ol modifiers apa yan sedan ditekan. om!ol modifiers antara lain : CB?& ?& * dan %,$F. *ethod untuk menentukan tom!ol modifiers apa yan sedan aktif adalah
MENANGANI EVENT | HALAMAN 49 et*odifiers. *ethod etctionCommand diunakan menam!il command strin yan didefinisikan oleh J4utton.
untuk
i !aian se!elumnya kita telah !eker'a menunakan komponen swin& dan sudah !erlatih !aaimana menanani event klik mouse terhadap J4utton. *ari kita lihat lai aplikasi sederhana !erikut :
Contoh aplikasi sederhana yan menanani event actionvent pada J4utton *enanani klik mouse pada J4utton dalam 7et!eans cukup denan memilih J4utton di Jendela esin kemudian klik kanan dan pilih menu :
Events > Action > ActionPerformed %etelah itu anda akan di!awa ke 'endela kode dan !aris !erikut ini akan di!uat secara otomatis oleh 7et!eans :
private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { } 5emudian kita akan menempatkan kode untuk menanani penekanan tom!ol di !aian !awah !aris //DD. %e!enarnya 7et!eans men-enerate !e!erapa lai kode di !aian yan tidak dapat diedit& !erikut ini cuplikanya :
btnHitung.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt){ btnHitungActionPerformed(evt); } }); *ethod addction?isterner ini mempunyai funsi yan sama denan method reister?istener pada class %u!'ect yan kita !ahas di !aian se!elumnya. addction?isterner !erfunsi untuk mendaftarkan D!server ke %u!'ect. +er!edaan ter!esar disini adalah 7et!eans tidak mem!uat pu!lic class D!server !aru untuk menimplementasi interface ction?istener. etapi 7et!eans mem!uat anonymous innerclass yan menimplement interface ction?istener. +erhatikan petikan kode !erikut ini :
HALAMAN 50
| JAVA SWING
new ActionListener() { public void actionPerformed(ActionEvent evt){ btnHitungActionPerformed(evt); } >an dilakukan oleh kode diatas se!enarnya adalah: 2. *em!uat Class !aru yan tidak punya nama (anonymous) ;. Class !aru terse!ut turunan dari D!'ect dan menimplement interface ction?istener <. *enimplementasi method a!strac action+erformed =. *ethod action+erformed dari class tak !ernama ini akan memanil method !tn,itunction+erformed dari class parentnya. %ecara umum 7et!eans akan mem!uat se!uah anonymous innerclass seperti diatas untuk setiap penananan event. ari sisi kerapian kode metode ini sanat !aus& karena 7et!eans menyem!unyikan kerumitan kode untuk menanani event seperti diatas. 5ita tidak perlu susah-susah mem!uat se!uah pu!lic class D!server tersendiri untuk menanani event. Cukup denan anonymous innerclass.
KeyListener 5ey?istener akan mendenarkan penekanan tom!ol oleh komponen yan !erada dalam keadaan fokus. %emua komponen swin dapat menerima 5ey?istener se!aai D!server. 5ey?istener dapat mendenarkan tia event !er!eda : penekanan tom!ol& pelepasan tom!ol dan penetikan tom!ol. 5etianya ditanani oleh method yan !er!eda-!eda& yaitu : key+ressed : dipanil ketika ter'adi penekanan tom!ol ● key!oard. keyBeleased : dipanil ketika tom!ol key!oard dilepaskan. ● keyyped : dipanil ketika tom!ol diketikkan& alias ditekan ● kemudian dilepaskan. *ethod ini dipanil 'ika tom!ol yan ditekan mempunyai representasi karakter unicode& seperti tom!ol anka dan tom!ol huruf. %edankan penekanan tom!ol modifiers seperti ?& CB?& BBD9& C+%?DC5& 7#*?DC5& $7% dan lainnya tidak akan menaki!atkan method ini dipanil. 5etia method diatas menerima parameter 5eyvent. #ntuk menetes tom!ol apakah yan ditekan oleh user& diunakan method et5eyCode. 5emudian hasil kem!alian method et5eyCode di!andinkan denan field static kepunyaan class 5eyvent yan diawali denan huruf 5& seperti : 5N7B& 5N& 5N4& 5N2& 5N?FNBBD9 dan seterusnya.
MENANGANI EVENT | HALAMAN 51 *ethod et5eyChar diunakan untuk menentukan karakter apa yan diwakili oleh tom!ol yan ditekan. Jika tom!ol yan ditekan adalah tom!ol modifiers maka method et5eyChar akan menem!alikan karakter 5eyvent.C,BN#7F$7.
plikasi sederhana yan menanani penekanan tom!ol key!oard #ntuk mem!uat aplikasi yan mendenarkan penekanan tom!ol key!oard seperti diatas lakukan lankah-lankah !erikut ini : 2.
4uat class JFrame !aru& !eri nama Frame5ey+ressed.
;. am!ahkan dua l!l5eyyped.
!uah
J?a!el&
!eri
nama
l!l%tatus
<. l!l%tatus diunakan untuk menandakan adanya key+ressed dan keyBeleased yan ter'adi !erurutan
dan event
=.
l!l5eyyped diunakan untuk menandakan adanya tom!ol yan diketik.
.
+ilih JFrame di Jendela esin& klik kanan& dan pilih menu :
Events > Key > keyPressed 0.
Jendela Code akan ter!uka& modifikasi method form5ey+ressed men'adi seperti !erikut ini :
private void formKeyPressed(KeyEvent evt) { // TODO add your handling code here: if(evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED) lblStatus.setText( "Anda menekan tombol : CHAR_UNDEFINED"); else lblStatus.setText("Anda menekan tombol : " + evt.getKeyChar()); } 3.
+ilih JFrame di Jendela esin& klik kanan& dan pilih menu :
HALAMAN 52
| JAVA SWING
Events > Key > keyReleased E.
Jendela Code akan ter!uka& modfikasi method form5eyBeleased men'adi seperti !erikut ini :
private void formKeyReleased(KeyEvent evt) { // TODO add your handling code here: if(evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED) lblStatus.setText( "Anda melepaskan tombol : CHAR_UNDEFINED"); else lblStatus.setText("Anda melepaskan tombol : " + evt.getKeyChar()); } G.
+ilih JFrame di Jendela esin& klik kanan& dan pilih menu :
Events > Key > keyTyped 21. Jendela Code akan ter!uka& modfikasi method form5eyyped men'adi seperti !erikut ini :
private void formKeyTyped(KeyEvent evt) { // TODO add your handling code here: lblKeyType.setText("Anda mengetikkan tombol : " + evt.getKeyChar()); }
MouseListener dan MouseMotionListener *ouse?istener mendenarkan interaksi mouse terhadap komponen swin. *ouse?istener dapat didaftarkan pada semua komponen swin. *ouse?istener mendenarkan event : mouse+ressed : event ini ter'adi ketika user menekan salah ● satu tom!ol mouse diatas komponen swin. mouseBeleased : setelah tom!ol ditekan& komponen swin akan ● menerima pelepasan tom!ol mouse. etapi 'ika tom!ol mouse dilepaskan pada saat pointer mouse tidak !erada diatas komponen swin& maka event ini tidak akan ter'adi. mouseClicked : event ini muncul ketika user melakukan click ● tom!ol mouse diatas komponen swin. mousentered : ketika mouse memasuki area diatas komponen ● swin& event ini akan dipicu. mouse6ited : muncul ketika mouse akan meninalkan area ● diatas komponen swin 5etika user menekan tom!ol mouse (click)& event mouse+ressed di!uat& kemudian mouseBeleased dan akhirnya mouseClicked
MENANGANI EVENT | HALAMAN 53 muncul terakhir. *ouse*otion?istener 'ua dapat didaftarkan se!aai listener pada semua komponen swin. *ouse*otion?istener dipisahkan dari *ouse?istener karena penananan event mouse*ove yan le!ih !erat dan intensif. *ouse*otion?istener mendenarkan dua envent: mouse*oved : ter'adi ketika user menerakkan mouse diatas ● komponen swin mouseraed : ter'adi ketika user menekan tom!ol mouse ● sekalius menerakkanya diatas komponen swin %emua method diatas menerima arumen !erupa class *ousevent. *ethod etClickCount diunakan untuk menentukan 'umlah click yan ter'adi dalam waktu yan !erdekatan. *ethod etClickCount 'ua diunakan untuk menentukan apakah klik yan ter'adi adalah sinle klik atau dou!le klik. *ethod et4utton diunakan untuk menentukan tom!ol mana yan ditekan oleh user. +ada umumnya mouse yan tersedia di pasaran mempunyai tia tim!ol yan dapat di klik& tom!ol kiri& tom!ol tenah dan tom!ol kanan. *ethod et4utton akan menem!alikan nilai *ousevent.4#D72 'ika tom!ol kiri ditekan& *ousevent.4#D7; 'ika tom!ol tenah ditekan dan *ousevent.4#D7< 'ika tom!ol kanan ditekan. *ethod etL dan et> akan menem!alikan koordinat dimana *ousevent ter'adi. 5oordinat yan diunakan adalah koordinat relatif. 5oordinat (1&1) !erada di po'ok kiri atas dari komponen swin& semakin ke!awah nilai > semakin !esar dan semakin ke kanan nilai L semakin !esar. 7ilai koordinatnya dinyatakan dalam satuan pi6el. plikasi di !awah ini adalah se!uah JFrame yan mempunyai J?a!el di dalamnya. 5etika ter'adi event mouseClick dan mouse*ove& J?a!el akan menampilkan dimana event terse!ut ter'adi. Jika event klik yan muncul& maka te6t dari J?a!el akan !erisi 8clicked at (6&y)& sedankan event move hanya akan memunculkan koordinat 8(6&y) sa'a.
Contoh aplikasi sederhana yan menani *ousevent ?akukan lankah-lankah !erikut ini untuk mem!uat aplikasi seperti diatas :
HALAMAN 54
| JAVA SWING 2.
4uat class JFrame !aru& !eri nama Frame*ouse*otion.
;.
?etakkan se!uah J?a!el !aru& !eri nama l!l%tatus.
<.
+ilih JFrame di Jendela esiner& klik kanan dan pilih menu :
Set Layout > Null Layout ?ankah ini !ertu'uan untuk mem!uat aar JFrame menunakan null layout. 5alau tidak menunakan null layout kita tidak !isa meletakkan J?a!el pada sem!aran posisi. =.
+ilih kem!ali JFrame& klik kanan dan pilih menu
Events > Mouse > mouseClicked .
modifikasi kode pada Jendela Code yan tampil men'adi seperti di !awah ini :
private void formMouseClicked(MouseEvent evt) { lblStatus.setText("clicked at (" + evt.getX() + "," + evt.getY() + ")"); lblStatus.setLocation(evt.getX(),evt.getY()); } 5ode diatas menanani penekanan tom!ol mouse& kemudian menu!ah te6t J?a!el dan memindahkan J?a!el ke posisi dimana event mouseClicked ter'adi. 0.
+ilih JFrame lai di Jendela esin& klik kanan dan pilih menu :
Events > MouseMotion > mouseMoved 3.
*odifikasi kode yan muncul pada Jendela Code men'adi seperti di !awah ini :
private void formMouseMoved(MouseEvent evt) { lblStatus.setText("(" + evt.getX() + "," + evt.getY() + ")"); lblStatus.setLocation(evt.getX(),evt.getY()); } E.
Compile dan 'alankan aplikasi di atas.
*asih !anyak lai vent-?istener yan disediakan oleh J5. ari !a! di atas kita sudah dapat menerti denan !aik konsep vent?istener dan pattern D!server yan mendasarinya. enan kemampuan ini kita !isa denan mudah menerti !aaimana event-listener yan lain !eker'a. vent-?istener 'ua dapat di'alankan terhadap Java 4ean menunakan +ropertyChane?istener dan +ropertyvent. 5onsep ini dapat diunakan untuk menamati peru!ahan pada field Java 4ean.
KONEKSI DATABASE DENGAN JDBC | HALAMAN 55
Koneksi Database Dengan JD(C Mengenal JDBC Java ata!ase Connectivity adalah +$ yan diunakan Java untuk melakukan koneksi denan aplikasi lain atau denan !er!aai macam data!ase. J4C memunkinkan kita untuk mem!uat aplikasi Java yan melakukan tia hal: konek ke sum!er data& menirimkan Kuery dan statement ke data!ase& menerima dan menolah resultset yan diperoleh dari data!ase. J4C mempunyai empat komponen : 2.
J4C +$ J4C +$ menyediakan metode akses yan sederhana ke sum!er data relational (B4*%) menunakan pemroraman Java. denan menunakan J4C +$& kita !isa mem!uat proram yan dapat meneksekusi %P?& menerima hasil Besult%et& dan menu!ah data dalam data!ase. J4C +$ 'ua mempunyai kemampuan untuk !erinteraksi denan linkunan terdistri!usi dari 'enis sum!er data yan !er!eda-!eda. J4C +$ adalah !aian dari Java +latform yan disertakan dalam li!rary J5 maupun JB. J4C +$ sekaran ini sudah mencapai versi =.1 yan disertakan dalan J5 0.1. J4C +$ =.1 di!ai dalam dua packae yaitu : 'ava.sKl dan 'ava6.sKl.
;. J4C river *anaer Class river*anaer dari J4C !ertuas untuk mendefisikan o!'ect-o!'ect yan dapat diunakan untuk melakukan koneksi ke se!uah sum!er data. %ecara tradisional river*anaer telah men'adi tulan punun arsitektur J4C. <. J4C est %uite J4C est %uite mem!antu kita untuk mencara driver mana yan cocok diunakan untuk melakukan se!uah koneksi ke sum!er data tertentu. es yan dilakukan tidak memerlukan resource !esar ataupun tes yan komprehensif& namun cukup tes-tes sederhana yan memastikan fitur-fitur pentin J4C dapat !er'alan denan lancar. =. J4C-D4C 4ride
HALAMAN 56
| JAVA SWING 4rie ini menyediakan fasilitas J4C untuk melakukan koneksi ke sum!er data menunakan D4C (Dpen ata4ase Connectivity) driver. %e!aai catatan& anda perlu meload driver D4C di setiap komputer client untuk dapat menunakan !ride ini. %e!aai konsekuensinya& cara ini hanya cocok dilakukan di linkunan intranet dimana isu instalasi tidak men'adi masalah. enan keempat komponen yan dipunyainya& J4C men'adi tools yan dapat diandalkan untuk melakukan koneksi& menam!il data dan meru!ah data dari !er!aai macam sum!er data. *odul ini hanya akan mem!ahas dua komponen pertama dari keempat komponen yan dipunyai oleh J4C& yaitu J4C +$ dan river*anaer. %um!er data yan diunakan adalah Belational ata!ase.
Database Driver J4C memerlukan data!ase driver untuk melakukan koneksi ke suatu sum!er data. ata!ase driver ini !ersifat spesifik untuk setiap 'enis sum!er data. ata!ase driver !iasanya di!uat oleh pihak pem!uat sum!er datanya& namun tidak 'aran 'ua komunitas atau pihak ketia menyediakan data!ase driver untuk se!uah sum!er data tertentu. +erlu dipahami sekali lai !ahwa data!ase driver !ersifat spesifik untuk setiap 'enis sum!er data. *isalnya& ata!ase river *y%Kl hanya !isa diunakan untuk melakukan koneksi ke data!ase *y%Kl dan !eitu 'ua data!ase driver untuk +ostre %P? 'ua hanya !isa diunakan untuk melakukan koneksi ke data!ase +ostre %P?. ata!ase driver untuk setiap 4*% pada umumnya dapat didownload dari we!site pem!uat 4*% terse!ut. 4e!erapa vendor 4*% menye!ut ata!ase driver ini denan se!utan Java Connector (J/Connector). ata!ase driver !iasanya di!unkus dalam file yan !erekstensi 'ar. %etiap data!ase driver harus menimplement interface ' ava.sKl.river.
Membuat Koneksi *elakukan koneksi ke data!ase meli!atkan dua lankah: *eload driver dan mem!uat koneksi itu sendiri. Cara meload driver sanat mudah& pertama letakkan file 'ar data!ase driver ke dalam classpath. 5emudian load driver denan menam!ahkan kode !erikut ini:
KONEKSI DATABASE DENGAN JDBC | HALAMAN 57
Class.forName(“com.mysql.jdbc.Driver”); 7ama class data!ase driver untuk setiap 4*% !er!eda& anda !isa menemukan nama class terse!ut dalam dokumentasi driver data!ase yan anda unakan. alam contoh ini& nama class data!ase driver dari *y%Kl adalah com.mysKl.'d!c.river. *emanil method Class.for7ame secara otomatis mem!uat instance dari data!ase driver& class river*anaer secara otomatis 'ua dipanil untuk menelola class data!ase driver ini. Jadi anda tidak perlu menunakan statement new untuk mem!uat instance dari class data!ase driver terse!ut. ?ankah !erikutnya adalah mem!uat koneksi ke data!ase menunakan data!ase driver yan sudah diload tadi. Class river*anaer !eker'a sama denan interface river untuk menelola driver-driver yan diload oleh aplikasi& 'adi dalam satu sesi anda !isa meload !e!erapa data!ase driver yan !er!eda. 5etika kita !enar-!enar melakukan koneksi& J4C est %uite akan melakukan serankaian tes untuk menentukan driver mana yan akan diunakan. +arameter yan diunakan untuk menentukan driver yan sesuai adalah #B?. plikasi yan akan melakukan koneksi ke data!ase menyediakan #B? penenal dari server data!se terse!ut. %e!aai contoh adalah #B? yan diunakan untuk melakukan koneksi ke *y%Kl :
jdbc:mysql://[host]:[port]/[schema] contoh konkritnya :
jdbc:mysql://localhost:3306/latihan %etiap vendor 4*% akan menyertakan cara untuk menentukan #B? ini di dalam dokumentasi. nda tinal mem!aca dokumentasi terse!ut tanpa harus khawatir tidak menemukan informasi yan anda perlukan. *ethod river*anaer.etConnection !ertuas untuk mem!uat koneksi:
Connection conn = DriverManager.getConnection( “jdbc:mysql://localhost:3306/latihan”); alam ke!anyakan kasus anda 'ua harus memasukkan parameter username dan password untuk dapat melakukan koneksi ke dalam data!ase. *ethod etConnection menerima #sername se!aai parameter kedua dan pasword se!aai parameter ketia& sehina kode diatas dapat diru!ah men'adi :
HALAMAN 58
| JAVA SWING
Connection conn = DriverManager.getConnection( “jdbc:mysql://localhost:3306/latihan”, ”root”,””); Jika salah satu dari driver yan diload !erhasil diunakan untuk melakukan koneksi denan #B? terse!ut& maka koneksi ke data!ase !erhasil dilaksanakan. Class Connection akan memean informasi koneksi ke data!ase yan didefinisikan oleh #B? terse!ut. %etelah sukses melakukan koneksi ke data!ase& kita dapat menam!il data dari data!ase menunakan perintah Kuery ataupun melakukan peru!ahan terhadap data!ase. !aian !erikut ini akan menerankan !aaimana cara menam!il dan memanipulasi data dari data!ase.
Mengambil dan Memanipulasi Data dari Database +roses penam!ilan data dari data!ase memerlukan suatu class untuk menampun data yan !erhasil diam!il& class terse!ut harus menimplement interface Besult%et. D!'ect yan !ertipe Besult%et dapat mempunyai level funsionalitas yan !er!eda& hal ini terantun dari tipe dari result set. ?evel funsionalitas dari setiap tipe result set di!edakan !erdasarkan dua area: ●
enan cara !aaimana result set itu dapat dimanipulasi
●
4aaimana result set itu menanani peru!ahan data yan dilakukan oleh proses lain secara !ersamaan (concurrent).
J4C menyediakan tia tipe result set untuk tu'uan !er!eda: 2.
>+NFDB9BND7?> : result set terse!ut tidak !isa !er'alan mundur& reslut set hanya !isa !er'alan ma'u dari !aris pertama hina !aris terakhir. result set hanya menam!arkan keadaan data ketika Kuery di'alankan atau ketika data diterima oleh resul set. Jika setelah itu ada peru!ahan data dalam data!ase& result set tidak akan diupdate alias tidak ada peru!ahan dalam result set tipe ini.
;.
>+N%CBD??N$7%7%$$ : result set dapat !er'alan ma'u mundur. result set dapat !er'alan ma'u dari row pertama hina terakhir atau !ererak !e!as !erdasarkan posisi relatif atau a!solute.
KONEKSI DATABASE DENGAN JDBC | HALAMAN 59 <.
>+N%CBD??N%7%$$ : result set dapat !er'alan ma'u mundur. result set dapat !er'alan ma'u dari row pertama hina terakhir atau !ererak !e!as !erdasarkan posisi relatif atau a!solute.
$nstance dari o!'ect !ertipe Besult%et diperlukan untuk menampun hasil kem!alian data dari data!ase. %e!elum kita !isa memperoleh instance dari Besult%et& kita harus mem!uat instance dari class %tatement. Class %tatement mempunyai method e6ecutePuery yan diunakan untuk men'alankan perintah Kuery dalam data!ase kemudian menem!alikan data hasil eksekusi Kuery ke dalam o!'ect Besult%et. 4erikut ini adalah contoh kode untuk mem!uat instance class %tatement& kemudian men'alankan Kuery untuk menam!il data dari data!ase yan hasilnya dipean oleh Besult%et :
Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResulSet rs = statement.executeQuery(“select * from Customers”); Besult%et akan meletakkan kursornya (posisi pem!acaan !aris) di se!uah posisi se!elum !aris pertama. #ntuk menerakkan kursor ma'u& mundur& ke suatu posisi relatif atau ke suatu posisi a!solute tertentu& unakan method-method dari Besult%et: ●
ne6t() -- menarahkan kursor ma'u satu !aris.
●
previous() -- menarahkan kursor mundur satu !aris.
●
first() -- menarahkan kursor ke !aris pertama.
●
last() -- menarahkan kursor ke !aris terakhir.
●
!eforeFirst() -- menarahkan kursor ke se!elum !aris pertama.
●
after?ast() -- menarahkan kursor ke setelah !aris terakhir.
●
relative(int rows) -- menarahkan kursor relatif dari posisinya yan sekaran. %et nilai rows denan nilai positif untuk ma'u& dan nilai neatif untuk mundur.
●
a!solute(int row7um!er) Q menarahkan kursor ke posisi tertentu sesuai denan nilai row7um!er& dan tentu sa'a nilainya harus positif.
$nterface Besult%et menyediakan method etter untuk menakses nilai dari setiap kolom dalam !aris yan sedan aktif. +arameter funsi etter !isa menerima nilai inde6 dari kolom ataupun nama kolomnya. 7amun !eitu& penunaan nilai inde6 le!ih efisien di!andin menunakan nama kolom.
HALAMAN 60
| JAVA SWING 7ilai inde6 dimulai denan satu hina !anyaknya kolom. +enunaan nama kolom adalah case insensitive& artinya huruf kecil atau huruf !esar tidak men'adi masalah. et%trin diunakan untuk menam!il kolom denan tiper data char& varchar atau tipe data strin lainya. et$nt diunakan untuk menam!il kolom denan tipe data inteer. 4erikut ini dalah contoh proram lenkap dari melakukan koneksi hina menam!il data dari data!ase.
Class.forName(“com.mysql.jdbc.Driver); Connection conn = DriverManager.getConnection( “jdbc:mysql://localhost:3306/latihan”, ”root”,””); Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResulSet rs = statement.executeQuery(“select * from Customers”); while(rs.next()){ System.out.println(rs.getInt(“id”)); System.out.println(rs.getString(“Nama”)); } *ethod e6ecutePuery hanya dapat men'alankan perintah %P? select& unakan method e6ecute#pdate untuk men'alankan perintah insert& update dan delete. ,asil dari eksekusi insert& update dan delete tidak menem!alikan result set& tetapi menem!alikan se!uah nilai inteer yan merepresentasikan status hasil eksekusi method e6ecute#pdate. 4erikut ini contoh insert& update dan delete :
result = statement.executeUpdate( "update Customers set nama ='roby' where nama='andy'"); result = statement.executeUpdate( "delete Customers where nama='andy'"); *enunakan e6ecutePuery dan e6ecute#pdate sanat mudah dan fleksi!le& namun sanat tidak efisien& +repared%tatement menawarkan keunulan dalam !entuk efisiensi.
Menggunakan PreparedStatement *emanil method e6ecute#pdate !erulan-ulan& misalnya melakukan insert ratusan atau ri!uan !aris& sanat tidak efisien.
KONEKSI DATABASE DENGAN JDBC | HALAMAN 61 ,al ini dise!a!kan karena 4*% harus memproses setiap Kuery yan dikirimkan dalam !e!erapa lankah: memparsin Kuery& mencompile Kuery dan kemudian !aru meneksekusi Kuery terse!ut. +repared%tatement menawarkan solusi yan le!ih !aik dalam menanani keadaan terse!ut. +repared%tatement menyaratkan Kuery yan akan dieksekusi didefinisikan terle!ih dahulu ketika +repared%tatement di!uat. 5emudian Kuery terse!ut dikirimkan ke dalam data!ase untuk dicompile terle!ih dahulu se!elum diunakan. 5onsekuensinya& +repared%tatement !ukan hanya mempunyai Kuery& tetapi mempunyai Kuery yan sudah dicompile. 5etika +repared%tatement di'alankan& 4*% tidak perlu melakukan kompilasi ulan terhadap Kuery yan di'alankan +repared%tatement. ,al inilah yan menye!a!kan +repared%tatement 'auh le!ih efisien di!andinkan menunakan method %tatement.e6ecute#pdate. 4erikut ini contoh pem!uatan +repared%tatement menunakan class Connection yan telah di!uat se!elumnya :
PreparedStatement ps = conn.prepareStatement( “update T_PERSON set name = ? where name = ?”); +erhatikan tanda R yan ada dalam Kuery diatas& tanda R dise!ut se!aai parameter. 5ita !isa mem!erikan nilai yan !er!eda ke dalam parameter dalam setiap pemanilan +repared%tatement. *ethod set%trin& setFloat& set$nt dan !e!erapa method lain diunakan untuk memasukkan nilai dari setiap parameter. *ethod terse!ut mempunyai dua parameter& parameter pertama adalah int yan diunakan untuk menentukan parameter +repared%tatement mana yan akan di!eri nilai. +arameter kedua adalah nilai yan akan dimasukkan ke dalam +repared%tatement& tipe data dari parameter kedua terantun dari method yan diunakan. 4erdasarkan kode diatas& !erikut ini contoh penunaan method +repared%tatement.set%trin :
ps.setString(1,”andy”); ps.setString(2,”rizal”); 5ode diatas mem!erikan contoh !aaimana memasukkan nilai ke dalam parameter +repared%tatement. 4aris pertama memasukkan %trin 8andy ke dalam parameter pertama dan !aris kedua memasukkan %trin 8rial ke parameter kedua. %ehina pemanilan Kuery oleh +repared%tatement !erdasarkan kode diatas sama denan Kuery statement di !awah ini :
“update T_PERSON set name = 'andy' where name = 'rizal'” 4erikut ini contoh lenkap penunaan +repared%tatement untuk melakukan update dan insert data :
HALAMAN 62
| JAVA SWING
PreparedStatement pInsert = conn.prepareStatement( "insert into Person(name) values(?)"); pInsert.setString(1,"dian"); pInsert.executeUpdate(); PreparedStatement pUpdate = conn.prepareStatement( "update Person set name=? where name=?"); pUpdate.setString(1,"andry"); pUpdate.setString(2,"andri"); pUpdate.executeUpdate(); alam contoh diatas& insert dan update data hanya dilaksanakan sekali sa'a& hal ini tidak mem!erikan am!aran yan tepat untuk melihat keunulan +repared%tatement di!andinkan %tatement.e6ecute#pdate.
Batch Execution *isalnya kita inin men-insert seratus !aris data dalam se!uah loop& kita !isa menunakan fasilitas !atc e6ecution dari +repared%tatement. !atch e6ecution menumpulkan semua eksekusi proram yan akan dilaksanakan& setelah semuanya terkumpul !atch e6ecution kemudian menirimkan kumpulan eksekusi proram secara !ersamaan ke 4*% dalam satu kesatuan. *etode ini sanat efisien karena menurani overhead yan diperlukan proram untuk !erkomunikasi denan 4*%. alam contoh di !awah ini kita akan menunakan !atch e6ecution untuk melakukan insert data se!anyak seratus kali.
PreparedStatement pInsert = conn.prepareStatement( "insert into Person(nama) values(?)"); for(int i=0;i<100;i++){ pInsert.setString(1,"user ke " + i); pInsert.addBatch(); } pInsert.executeBatch(); %etiap kali iterasi& method set%trin dipanil untuk menisikan se!uah strin ke dalam +repared%tatement& kemudian method add4atch dipanil untuk menumpulkan !atch dalam satu wadah. %etelah iterasi selesai& method e6ecute4atch dipanil untuk melaksanakan semua keseratus instruksi insert secara !erurut denan sekali sa'a melaksanakan koneksi ke data!ase.
Menangani Transaction ukunan transaction oleh J4C terantun denan ata!asenya&
KONEKSI DATABASE DENGAN JDBC | HALAMAN 63 karena ada data!ase yan mendukun transaction dan ada pula data!ase yan tidak mendukun transaction. *y%P? mendukun transaction 'ika kita menunakan $nno4 se!aai sistem ta!lenya& kalau kita menunakan *y$%* maka transaction tidak didukun. ransaction merupakan konsep pentin dari data!ase. ransaction memastikan peru!ahan data dilaksanakan denan kaidah C$ (tomicity& Consistency& $solation& ura!ility). 5aidah ini memastikan semua proses peru!ahan data !er'alan secara !enar& 'ika ada yan salah maka semua peru!ahan dalam satu kesatuan loika harus di!atalkan (roll!ack). *ari kita evaluasi kode diatas aar menunakan transaction& sehina 'ika satu proses insert aal& maka semua insert yan dilaksanakan se!elumnya akan di!atalkan :
try{ connection.setAutoCommit(false); PreparedStatement pInsert = conn.prepareStatement( "insert into Person(nama) values(?)"); for(int i=0;i<100;i++){ pInsert.setString(1,"user ke " + i); pInsert.addBatch(); } pInsert.executeBatch(); connection.commit(); connection.setAutoCommit(true); } catch (SQLException ex) { try{ connection.rollback(); }catch(SQLException e){ } }
DAO dan Service Pattern kses terhadap data!ase merupakan !aian yan sanat pentin dari aplikasi data!ase. +enunaan pattern yan sesuai dapat mem!erikan manfaat sanat !esar. +attern yan serin diunakan dalam akses data!ase adalah D (ata ccess D!'ect) dan %ervice/Facade pattern. 5edua pattern ini diunakan untuk menerapkan 8separation of concern atau pemisahan kode proram !erdasarkan funsi kode proram. %emua kode untuk akses data harus dipisahkan denan kode untuk penaturan user inteface. ,al ini memunkinkan kode akses data yan di!uat untuk aplikasi desktop& denan mudah
HALAMAN 64
| JAVA SWING diunakan untuk aplikasi we!. +enerapan konsep separation of concern secara disiplin& dapat menhasilkan kode proram yan dapat dites secara otomatis menunakan J#nit atau 4#nit. #nit testin merupakan paramater utama dalam menentukan apakah kode proram yan kita hasilkan mempunyai mutu yan tini atau tidak. Coverae unit testin yan tini mencerminkan kode proram yan !erkualitas tini pula. ao pattern !erisi semua kode untuk menakses data& seperti Kuery. %emua kode yan sepesifik terhadap implementasi akses data !erhenti di sini& lapisan le!ih atas tidak !oleh tahu !aaimana akses data diterapkan& apakah menunakan J4C murni atau ,i!ernate atau J+. ?apisan lainya hanya perlu tahu funsionalitas dari suatu method di dalam D class& tidak perlu tahu !aimana method terse!ut diimplementasikan. Class D akan mempunyai method seperti save& delete& et4y$d atau etll. +raktek yan laim diunakan adalah satu !uah ntity/a!le akan mempunyai satu !uah class D. i !awah ini adalah contoh Class D menunakan J4C untuk ta!le NC"DB> :
KONEKSI DATABASE DENGAN JDBC | HALAMAN 65
public class CategoryDaoJdbc { private Connection connection; private PreparedStatement insertStatement; private PreparedStatement updateStatement; private PreparedStatement deleteStatement; private PreparedStatement getByIdStatement; private PreparedStatement getAllStatement; private final String insertQuery = "insert into T_CATEGORY(name,description)" + " values(?,?)"; private final String updateQuery = "update T_CATEGORY set name=?, description=? " + " where id=?"; private final String deleteQuery = "delete from T_CATEGORY where id=?"; private final String getByIdQuery = "select * from T_CATEGORY where id =?"; private final String getAllQuery = "select * from T_CATEGORY"; public void setConnection(Connection connection) { try { this.connection = connection; insertStatement = this.connection.prepareStatement( insertQuery,Statement.RETURN_GENERATED_KEYS);
HALAMAN 66
| JAVA SWING
updateStatement = this.connection.prepareStatement( updateQuery); deleteStatement = this.connection.prepareStatement( deleteQuery); getByIdStatement = this.connection.prepareStatement( getByIdQuery); getAllStatement = this.connection.prepareStatement( getAllQuery); } catch (SQLException ex) { } } public void save(Category category) { try { if (category.getId() == null) { insertStatement.setString(1,
KONEKSI DATABASE DENGAN JDBC | HALAMAN 67
category.getName()); insertStatement.setString(2, category.getDescription()); int id = insertStatement.executeUpdate(); category.setId(id); } else { updateStatement.setString(1, category.getName()); updateStatement.setString(2, category.getDescription()); updateStatement.setInt(3, category.getId()); updateStatement.executeUpdate(); } } catch (SQLException ex) { }
} public void delete(Category category) { try { deleteStatement.setInt(1, category.getId()); deleteStatement.executeUpdate(); } catch (SQLException ex) { } } public Category getById(Long id) { try { getByIdStatement.setLong(1, id); ResultSet rs = getByIdStatement.executeQuery(); //proses mapping dari relational ke object if (rs.next()) { Category category = new Category(); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setDescription( rs.getString("description")); return category; } } catch (SQLException ex) { } return null; } public List getAll() { try { List categories = new ArrayList();
HALAMAN 68
| JAVA SWING
ResultSet rs = getAllStatement.executeQuery(); while(rs.next()){ Category category = new Category(); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setDescription( rs.getString("description")); categories.add(category); } return categories; } catch (SQLException ex) { } return null; } } %ervice pattern diunakan utamanya untuk menyederhanakan class-class D yan ada& misalnya kita mempunyai 1 !uah ta!le maka laimnya akan ada 1 !uah class D. Class D terse!ut perlu disederhanakan& caranya adalah denan menelompokkan class-class D dalam satu modul aplikasi ke class %ervice. *isalnya D yan !erhu!unan denan user manaement ke dalam class #ser%ervice. ransaction diatur dalam class %ervice& praktek yan laim diunakan adalah satu method dalam class service adalah satu scoop transaction. Jadi ketika method dalam service mulai dieksekusi transaction akan dimulai (!ein)& ketika method akan !erakhir& transaction akan dicommit. 4erikut ini adalah contoh class %ervice :
KONEKSI DATABASE DENGAN JDBC | HALAMAN 69
public class ServiceJdbc { private CategoryDaoJdbc categoryDao; private Connection connection;
public void setDataSource(DataSource dataSource){ try { connection = dataSource.getConnection(); categoryDao = new CategoryDaoJdbc(); categoryDao.setConnection(connection); } catch (SQLException ex) { } } public void save(Category category){ try { connection.setAutoCommit(false); categoryDao.save(category); connection.commit(); connection.setAutoCommit(true); } catch (SQLException ex) { try{ connection.rollback(); }catch(SQLException e){ } } } public void delete(Category category){ try { connection.setAutoCommit(false); categoryDao.save(category); connection.commit(); connection.setAutoCommit(true); } catch (SQLException ex) { try{ connection.rollback(); }catch(SQLException e){ } } } public Category getGroup(Long id){ return categoryDao.getById(id); } public List getGroups(){
HALAMAN 70
| JAVA SWING
return categoryDao.getAll(); } } %etelah class D dan service !erhasil di!uat& mari kita lihat !aaimana cara menunakannya :
public class MainJdbc { public static void main(String[] args) {
MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUser("root"); dataSource.setPassword("admin"); dataSource.setDatabaseName("latihan"); dataSource.setServerName("localhost"); dataSource.setPortNumber(1527);
ServiceJdbc service = new ServiceJdbc(); service.setDataSource(dataSource);
Category category = new Category(); category.setName("administrator"); service.save(category); System.out.println("id : " + category.getId()); System.out.println("name : " + category.getName()); try { dataSource.getConnection().close(); } catch (SQLException ex) { }
} }
%etelah menenal J4C& kita akan mem!ahas cara menakses data!ase yan le!ih !aik denan manunakan J+. enan menunakan J+ kode proram yan akan di!uat akan le!ih rinkas dan terlihat konsep DD+ di!andin denan J4C murni. J+ adalah framework DB* untuk memetakan ta!el dalam data!ase dan class dalam konsep DD+. enan menunakan J+ kode proram kita akan le!ih rapi dan terlihat DD+.
JAVA PERSISTENCE API (JPA) | HALAMAN 71
Java $ersisten"e 0$I 4J$05 ,ampir semua aplikasi !isnis menunakan data!ase. 5onsep data!ase relasional sudah populer 'auh se!elum konsep o!'ectoriented diunakan oran. Dleh karena itu& apapun !ahasa pemroraman yan kita unakan& menunakan data!ase adalah suatu keniscayaan. alam interaksi kita denan data!ase& ada !e!erapa masalah yan umum kita temukan& diantaranya •
per!edaan dialek %P? antar merek data!ase
•
per!edaan konsep relasional dan o!'ect-oriented
•
peninkatan kiner'a (performance)
+ada !uku ini kita akan mem!ahas tentan framework yan dise!ut D!'ect/Belational *appin (DB*). J+ termasuk framework dalam kateori DB*. enan kita menunakan DB*& maka !anyak masalah umum di atas yan dapat diselesaikan tanpa kita harus mem!uat solusi sendiri. *ari kita ela!orasi.
$erbedaan dialek S6+ *asin-masin vendor data!ase !erusaha mempertahankan pelanannya denan cara mem!uat nilai tam!ah di produk mereka& yan mem!edakan produknya denan produk pesain. 7ilai tam!ah ini tentunya di!erikan dalam !entuk fitur-fitur canih yan dimiliki data!ase. 5arena antarmuka utama data!ase dan user (dalam hal ini prorammer) adalah perintah %P?& maka kita sekaran melihat !anyak sekali per!edaan %P? antar merek data!ase. 4ahkan untuk kasus sederhana sa'a& menam!il 21 !aris pertama dari hasil Kuery& para vendor data!ase ini tidak !isa sepakat. +er!edaan ini sanat menyulitkan !ila kita inin mem!uat produk aplikasi. #ntuk men'ankau pasar yan luas& produk kita harus !isa diunakan di !er!aai kondisi dan konfiurasi. 5ita harus !isa mendukun pelanan yan menunakan +ostre%P? maupun Dracle. +er!edaan dialek %P? menye!a!kan kita harus meneluarkan !iaya tam!ahan untuk mendukun !er!aai 'enis data!ase. Framework DB* men'em!atani antara kode proram denan %P?. 5ita tidak lai men'alankan %P? sesuai merek data!ase& tapi kita menunakan Puery ?anuae yan disediakan DB*. 4ila suatu
HALAMAN 72
| JAVA SWING saat kita inin menanti data!ase& kita cukup menkonfiurasi DB* untuk !eranti dialek.
$erbedaan konsep relasional dan obje"t%oriented Cara !erpikir kita dalam mendesain struktur ta!el data!ase sanat !er!eda denan paradima yan kita unakan pada waktu mendesain struktur o!'ek aplikasi kita. *ari kita lihat !e!erapa konsep !erikut: •
eKuality
•
inheritance
•
relationship
5onsep eKuality mem!ahas !aaimana kita menyatakan !ahwa o!'ect a sama denan o!'ect b. i dalam !ahasa Java& kedua o!'ect dinyatakan sama 'ika !erada dalam lokasi memori yan sama& sehina !isa di!andinkan denan operator OO. %elain itu& kita 'ua !isa mem!uat definisi kita sendiri tentan kesamaan denan cara men-override method eKuals. i data!ase& suatu record dise!ut sama denan record lainnya !ila kedua record memiliki nilai primary key yan sama dan tersimpan dalam ta!el yan sama. 4ahasa pemroraman !erorientasi o!'ek seperti Java menenal konsep inheritance. enan konsep ini& !anyak teknik pemroraman canih yan !isa dilakukan. 5onsep ini tidak ada di data!ase. Belasi di kode Java ditentukan oleh method yan kita sediakan untuk naviasi. %e!aai contoh& !ila satu Cateory memiliki !anyak rticle di dalamnya& ada !e!erapa kemunkinan yan !isa dilakukan: •
class Cateory !isa melihat semua rticle dan se!aliknya& rticle tahu dalam Cateory apa dia !erada
public class Category { public List articles; } public class Article { private Category category; } •
class rticle tahu tentan Cateory& tapi Cateory !isa melihat rticle yan ada di dalamnya
JAVA PERSISTENCE API (JPA) | HALAMAN 73
public class Category { } public class Article { private Category category; } •
class Cateory !isa melihat isi rticle& tapi rticle tidak tahu Cateory tempat dia disimpan.
public class Category { public List articles; } public class Article { } ata!ase tidak menenal konsep naviasi. 4ila kita punya struktur data!ase seperti ini:
create table Category ( id INT, name VARCHAR ); create table Article ( id INT, category_id INT, title VARCHAR ); *aka kita !isa mendapatkan !aik rticle maupun Cateory denan Kuery seperti ini
select * from Article where category_id = ? DB* men'em!atani per!edaan ini& sehina kita !isa mem!uat kode proram denan le!ih rapi.
$eningkatan kinerja da !anyak hal yan !isa kita lakukan untuk menoptimasi akses data!ase& diantaranya: •
data!ase connection poolin
•
lay-loadin
•
deferred %P?
•
menurani hit ke data!ase
•
Kuery result cache
#rusan connect/disconnect dari data!ase merupakan urusan yan rumit. 4anyak lankah yan terli!at di sana& misalnya inisialisasi koneksi& proses otentikasi& dan se!aainya.
HALAMAN 74
| JAVA SWING plikasi !esar !iasanya menoptimasi urusan connect/disconnect ini denan menunakan teknik connection poolin. +ada waktu dinyalakan& aplikasi lansun mem!uat !anyak koneksi sekalius (pool). 4ila ada kode proram yan inin menunakan koneksi untuk men'alankan %P?& maka koneksi diam!il dari pool dan di!erikan. %etelah selesai men'alankan %P?& koneksi tidak ditutup& melainkan dikem!alikan ke pool. enan cara ini& overhead proses connect/disconnect dapat dikurani. enan menunakan DB*& semua koneksi data!ase diatur di satu tempat& sehina menu!ah konfiurasi dari koneksi !iasa men'adi connection-poolin tidak !erpenaruh !esar terhadap keseluruhan kode proram. idak semua data yan kita am!il dari data!ase akan diunakan. 5adankala se!aian !esar data yan diam!il akan di!uan. entunya ini mem!oroskan ker'a C+#& penunaan memori& dan 'ua !andwidth. 4e!erapa DB* mendukun fitur lay-loadin& yaitu menam!il data kalau !enar-!enar diperlukan. 4ila aplikasi kita menunakan DB*& perintah %P? ke data!ase dieksekusi oleh DB*& !ukan oleh kode proram kita. 5arena itu& DB* memiliki ke!e!asan untuk men'alankan %P? kapan sa'a& asal tidak menacaukan aplikasi kita. 5e!e!asan ini diunakan oleh DB* untuk menunda dan menumpulkan eksekusi %P?& sehina !isa di'alankan secara efisien. +ada aplikasi !esar& umumnya application server dan data!ase server diinstal di mesin yan !er!eda. #ntuk menaksesnya diunakan akses melalui 'arinan (network). Dleh karena itu& akses ke data!ase harus diperhitunkan denan teliti& aar tidak terlalu !anyak perintah atau data yan 8menye!erani 'arinan. DB* senantiasa !erusaha menurani komunikasinya denan data!ase& sehina kiner'a aplikasi dapat ditinkatkan. *enam!il data dari memori selalu 'auh le!ih cepat daripada menam!il data dari disk atau 'arinan. 5arena kontrol penuh yan dimilikinya atas hu!unan ke data!ase& DB* dapat menunakan cache denan leluasa. DB* dapat menamati data mana yan 'aran !eru!ah& dan kemudian akan menyimpannya di memori (cache). 4ila kode proram kita meminta data terse!ut& DB* tidak perlu menakses data!ase& melainkan lansun menam!ilnya dari cache. $ni akan sanat mempercepat eksek usi aplikasi.
Persiapan Instalasi %eperti li!rary Java lainnya& J+ tidak mem!utuhkan instalasi
JAVA PERSISTENCE API (JPA) | HALAMAN 75 khusus. Cukup masukkan file *.jar yan di!utuhkan ke dalam C?%%+,. 7et4eans 0.2 sudah disertai denan li!rary implementasi J+& yaitu toplink essensial. 5ita tinal menam!ahkan sa'a li!rary toplink essential ke dalam pro'ect yan sudah kita !uat.
0plikasi (log *en'elaskan konsep sa'a terasa kuran meniit apa!ila tidak disertai aplikasi. alam !uku ini& kita akan mem!uat aplikasi !lo& yaitu aplikasi untuk memuat tulisan atau artikel di we!site.
Fungsionalitas 0plikasi Fitur dari aplikasi ini adalah: *enulis artikel ● *enelompokkan artikel ke dalam kateori ● *em!erikan komentar untuk masin-masin artikel ● ● rtikel memiliki informasi tentan penulis (author) ● uthor dapat loin ke dalam aplikasi
Dasar-dasar ORM Mapping Seder'ana #ntuk contoh awal& kita akan melakukan mappin untuk class Category. Class ini hanya memiliki tia properti sa'a& id& name& dan description. 4erikut adalah kode Javanya.
public class Category { private Integer id; private String name; private String description; // getter dan setter } Class ini akan kita simpan di data!ase. 4erikut struktur ta!elnya& ditulis dalam dialek *y%P?.
create table Category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), description VARCHAR(255) ); #ntuk kesederhanaan& kita samakan dulu nama ta!el dan nama class. emikian 'ua denan nama property di kode Java dan nama kolom di ta!el data!ase. +ada !aian selan'utnya& kita akan lihat
HALAMAN 76
| JAVA SWING !aaimana cara memetakan nama yan !er!eda. J+ mendukun dua cara untuk mem!uat pemetaan& denan L*? dan nnotation. 5ita akan menam!il pendekatan nnotation& karena le!ih mudah dan sederhana. enan pendekatan ini& kita tidak perlu memelihara dua file (Java dan L*?). 4erikut class Category yan sudah dianotasi.
@Entity public class Category { @Id @GeneratedValue private Integer id; private String name; private String description; }
Kon&igurasi J$0 %etelah kita mem!uat ta!el dan class Java& sekaran kita akan mem!uat konfiurasi J+. 7et4eans 0.2 mempunyai fasilitas yan memudahkan konfiurasi J+. ?ankah pertama adalah mem!uat koneksi ke dalam data!ase *y%P? denan menunakan data!ase tools net!eans. 4uka ta! service& kemudian e6pand !aian data!ase. 5alau kita !elum mempunyai data!ase& kita !isa mem!uat data!ase terle!ih dahulu denan melakukan klik kanan di node mysKl dan pilih menu create data!ase& !eri nama trainin. 5alau sudah ada data!ase (schema) yan di!uat se!elumnya& node mysKl dapat die6pand untuk melihat data!ase terse!ut. ?ankah !erikutnya adalah mem!uat koneksi ke dalam data!ase yan sudah di!uat. 6pand node mysKl& klik kanan di node data!ase trainin& pilih menu connect. Janan lupa untuk mencek pilihan 8Bemem!er +assword. 5oneksi ini nanti akan kita unakan untuk mem!uat +ersistence #nit. +ersistence #nit adalah konfiurasi yan diunakan oleh J+ untuk meletakkan parameter username& password& url dan dialect yan diunakan untuk melakukan koneksi ke data!ase. +roses mem!uat +ersistence #nit sanat mudah& pilih menu : file
→
new file
→
persistence
persistence unit
→
JAVA PERSISTENCE API (JPA) | HALAMAN 77
*asukkan koneksi yan sudah di!uat pada lankah se!elumnya di !aian 8ata!ase Connection. 5emudian pilih 8a!le "eneration %tratey aar ketika kita akan men'alankan aplikasi& semua ta!le akan dienerate dari ntity. 5ita akan mem!ahas le!ih lan'ut tentan ntity di !a! !erikutnya& tidak perlu !inun dahulu& tenan sa'a. ,asil dari +ersistence #nit adalah file L*? denan mana persistence.6ml dan terletak di packae *-$7F& isinya seperti !erikut ini :
HALAMAN 78
| JAVA SWING
oracle.toplink.essentials.PersistenceProvider com.artivisi.desktop.model.Group com.artivisi.desktop.model.Person file persistence.6ml diatas se!aiknya di!uat denan otomatis menunakan tools dari net!eans& dan 'anan di!uat secara manual denan diketik& karena file 6ml terse!ut case sensitif dan harus !enar secara sintask& sehina kalau diketik manual akan !eresiko menhasilkan kesalahan ketik.
Men#impan dan Mengambil 2bje"t %ekaran& konfiurasi sudah siap. 5ita akan menco!a untuk menyimpan dan menam!il o!'ect dari data!ase denan menunakan J+. emonstrasi sederhana dapat di!uat denan class sederhana yan memiliki method main& sehina !isa di'alankan. 4erikut kerankanya.
JAVA PERSISTENCE API (JPA) | HALAMAN 79
public class DemoJpa { public static void main(String[] xx){ } } %elan'utnya& kode proram kita akan di!uat dalam method main.
/ntit#ManagerFa"tor# +ertama& kita harus mem!aca konfiurasi yan sudah kita !uat tadi. 5onfiurasi yan telah diaktifkan akan menhasilkan o!'ect EntityManagerFactory. EntityManagerFactory ini hanya di!uat sekali sa'a sepan'an aplikasi !er'alan.
EntityManagerFactory entityManagerFactory=
penting Jang an terla lu lama men#impan obje"t /ntit#Manager! (iasan#a- session dibuka di awa l met'oddan se gera 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
%elan'utnya& kita instankan dulu o!'ect Category yan akan disimpan.
// buat object category yang mau disave Category category = new Category(); category.setName("berita"); category.setDescription("berita hangat");
Men#impan obje"t ke database 5ita !isa lansun menyimpan o!'ect terse!ut denan menunakan EntityManager J+. Janan lupa menunakan
HALAMAN 80
| JAVA SWING Transaction.
EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist(category); entityManager.getTransaction().commit(); entityManager.close(); EntityManager adalah o!'ect sekali pakai. 5ita am!il EntityManager dari EntityManagerFactory& unakan untuk operasi persistence& dan kemudian lansun ditutup. %iklus hidup EntityManager !er!eda denan ntity*anaerFactory. ntity*anaerFactory umurnya sama denan aplikasi& di!uat satu !uah& pada saat aplikasi mulai di'alankan& dan diunakan terus sepan'an aplikasi !er'alan. 5ita !isa mem!ai-pakai (share) ntity*anaerFactory ke !er!aai o!'ect yan !er'alan !er!arenan (concurrent)& karena ntity*anaerFactory di!uat secara thread- safe& sehina aman untuk pemakaian api kita tidak !isa multi-threadin . menunakan EntityManager di !anyak o!'ek sekalius. %etelah di'alankan& kode di atas akan memasukkan satu record ke ta!el Category dalam data!ase.
Mengambil data dari database D!'ect yan ada dalam data!ase 'ua !isa diam!il denan cara yan tidak 'auh !er!eda. 4ila kita sudah tahu $ o!'ect terse!ut& kita !isa lansun menam!ilnya dari data!ase. 5ode untuk mem!uka EntityManager& men'alankan transaction& menyelesaikan (commit)& dan menutup transaction EntityManager tidak ditulis& karena sama denan di atas.
Category c = (Category) entityManager.createQuery(“select c from Category where c.id=:id”).setParameter("id", 1).getSingleResult(); System.out.println("ID: "+c.getId()); System.out.println("Name: "+c.getName()); idak sulit !ukanR 5ita tidak perlu menulis %P? lai. api ini tidak !erarti kita !oleh tidak menerti %P?. %eperti kita akan lihat pada !aian selan'utnya& pemahaman %P? sanat pentin aar kita !isa menunakan J+ denan optimal.
JAVA PERSISTENCE API (JPA) | HALAMAN 81
Membuat skema database +ada contoh se!elumnya& kita mem!uat ta!el di data!ase denan menunakan perintah %P? lansun di data!ase. %e!etulnya& J+ 'ua !isa mem!uatkan ta!el untuk kita. am!ahkan !aris !erikut dalam konfiurasi persistence.xml.
da !e!erapa opsi yan !isa toplink.ddl-eneration ini& yaitu:
diunakan
untuk
property
•
drop-and-create-tables: denan opsi ini& J+ akan mem!uat semua ta!el pada saat inisialisasi ntity*anaer Factory. 4eitu ntity*anaerFactory ditutup& semua ta!el akan di-drop.
•
create:-ta!les opsi ini hanya akan mem!uat t a!el pada saat EntityManagerFactory diinisialisasi. J+ tidak men-drop ta!el pada saat EntityManagerFactory ditutup.
%elan'utnya kita akan mem!uat class-class untuk data access o!'ect (D).
Membuat Categor#Dao Class Category akan memiliki !e!erapa method& diantaranya: •
save : untuk menyimpan o!'ect ke data!ase
•
findById : untuk menam!il o!'ect dari data!ase !erdasarkan $ yan di!erikan
7antinya CategoryDao tidak hanya memiliki dua method sa'a. api untuk awal& cukup kita pindahkan apa yan ada di class DemoJpa di atas ke dalam CategoryDao. 4erikut keranka CategoryDao.
public class CategoryDao { public void save(Category cat){} public Category findById(Integer id){} } %elan'utnya& CategoryDao !utuh ntity*anaerFactory untuk melakukan interaksi denan data!ase melalui J+. 5ita !erikan EntityManagerFactory melalui setter-in'ection .
HALAMAN 82
| JAVA SWING
public class CategoryDao { private EntityManager entityManager; public void setEntityManager( EntityManager em) { this.entityManager = em; } }
Menggunakan /ntit#Manager %elan'utnya& mari kita isi method save. i dalam method ini harus ada loika untuk menentukan apakah operasi save yan akan dilakukan adalah insert atau update. 5onvensi yan diunakan adalah: 'ika id dari entity masih null maka entity terse!ut !elum ada di dalam data!ase& sehina operasi insert yan akan dilaksanakan. %e!aliknya& 'ika idnya tidak null maka operasi update yan akan dilaksanakan:
public void save(Category cat) { if(cat.getId()==null){ entityManager.persist(cat); } else { entityManager.merge(cat); } } method findById.
public Category findById(Integer id){ return (Category) entityManager.createQuery( "select g from Group g where g.id=:id") .setParameter("id", id) .getSingleResult(); }
Client Code 5ita dapat mem!uat kode sederhana untuk menetes kiner'a CategoryDao. 4uat class emoao yan memiliki method main. $sikan kode proram !erikut dalam method main.
JAVA PERSISTENCE API (JPA) | HALAMAN 83
EntityManagerFactory factory = Persistence.createEntityManagerFactory(“JpaPU”); CategoryDao categoryDao = new CategoryDao(); categoryDao.setEntityManager(factory.createEntityManager( )); Category cat = new Category(); cat.setName("Tutorial JPA"); cat.setDescription("Belajar JPA"); categoryDao.save(cat); %etelah di'alankan& co!a periksa isi data!ase. #ntuk menam!il data& kita 'ua !isa menunakan method findById. 4uat class JpaDemo lenkap denan method main. $si method main adalah se!aai !erikut.
EntityManagerFactory factory = Persistence.createEntityManagerFactory(“JpaPU”); CategoryDao categoryDao = new CategoryDao(); categoryDao.setEntityManager(factory.createEntityManager( )); Category cat = categoryDao.findById(1); System.out.println("ID: " + cat.getId()); System.out.println("Name: " + cat.getName()); System.out.println("Description: "+cat.getDescription()); 5ode di atas !ila di'alankan akan menampilkan tulisan se!aai !erikut:
ID: 1 Name: Tutorial JPA Description: Belajar JPA
Pemetaan Relasi %elan'utnya& setelah kita dapat menkonfiurasi dan melakukan test terhadap ker'a J+& sekaran kita !isa melankah ke topik yan le!ih !ermanfaat& yaitu mem!uat mappin yan le!ih !eraam. +ada !a! ini& kita akan memetakan seluruh struktur data!ase aplikasi !lo kita. 4erikut class-class yan akan terli!at:
HALAMAN 84
| JAVA SWING •
User : mencerminkan semua account yan dapat loin ke aplikasi.
•
Author : mencerminkan penulis yan menaran artikel atau menulis !erita. %atu author memiliki satu user& dan se!aliknya. 5ita memisahkan class User dan Author& karena User !erisi informasi tentan security& i'in akses& password& dan informasi keamanan lainnya. %edankan class Author menyimpan informasi !erkaitan tentan informasi personal& seperti nama lenkap& tanal lahir& dan se!aainya.
•
Group : !erisi !anyak User& unanya nanti untuk memudahkan penaturan i'in akses.
•
Category : mencerminkan kelompok artikel. da kateori !erita& osip& opini& dan se!aainya
•
Article
•
Comment : komentar atas artikel tertentu
,u!unan antar class terse!ut dapat diam!arkan se!aai !erikut:
%truktur o!'ect tidak sama denan struktur data!ase& walaupun aak mirip. 4erikut adalah struktur ta!el dalam data!ase.
JAVA PERSISTENCE API (JPA) | HALAMAN 85
%ekaran& setelah kita menetahui desain o!'ek dan desain data!ase& mari mulai melakukan pemetaan.
Pertimbangan dalam pemetaan %eperti sudah disinun sekilas dalam !aian se!elumnya& ada !e!erapa ketidak sesuaian (mismatch) antara desain o!'ek dan desain data!ase. ,u!unan antar ta!el di data!ase 'auh le!ih sederhana daripada hu!unan antar class di aplikasi !erorientasi o!'ek. alam kaitannya denan hu!unan antar class& ada !e!erapa hal yan harus kita perhatikan& yaitu: •
kasta class
•
naviasi
•
'enis collection
•
optionality
•
transitive persistence
HALAMAN 86
| JAVA SWING *ari kita !ahas satu persatu.
Kasta J+ menenal tia kasta o!'ect: entity& component& dan value type. *ari kita lihat contohnya.
+ada domain model di atas& kita lihat seoran Author memiliki informasi nomer yan !isa dihu!uni. 5arena 'aman sudah semakin canih& satu oran !isa dihu!uni di !anyak nomer& yaitu nomer telepon rumah& kantor& ponsel "%*& ponsel C*& dan 'ua nomer fa6. #ntuk menelompokkan semua nomer ini& kita mem!uat satu class khusus yaitu ContactNumber. +emetaan o!'ek seperti ini dise!ut denan istilah fine-rained . rtinya& informasi dikelompokkan secara detail dan spesifik. iap class memiliki informasi yan terinci. 5arena class adalah tipe data& !isa dikatakan !ahwa kita telah mem!uat tipe data !aru& yaitu ContactNumber. +ertanyaannya& !aaimana kita akan menyimpan data ini ke data!aseR ata!ase tidak menenal tipe data khusus. 5ita hanya !isa menunakan tipe data yan telah disediakan seperti $7& atau BC,B. 5ita tidak !isa mem!uat tipe data !aru ContactNumber dalam data!ase. da tia alternatif yan !isa kita unakan untuk memetakan ContactNumber ke data!ase. ia alternatif ini mencerminkan kasta o!'ect dalam J+. 2. 5asta tertini& adalah ntity o!'ect. %e!uah ntity memiliki ta!el sendiri& primary key sendiri& dan kehidupan sendiri. Class Author adalah se!uah ntity. ;.
5asta di !awah ntity dise!ut Component. ia memiliki
JAVA PERSISTENCE API (JPA) | HALAMAN 87 ta!el sendiri dan kadan-kadan memiliki primary key sendiri. etapi& Component hidup menempel pada ntity dan tidak !isa !erdiri sendiri. 5alau inan ntitynya dihapus& maka Component akan ikut dihapus dari data!ase. Class ContactNumber adalah contoh Component. <.
5asta palin rendah dise!ut alue ype. %ama denan Component& hidupnya menempel pada ntity. alue ype tidak memiliki ta!el sendiri. $nformasi yan dimilikinya disimpan pada ta!el induknya. aftar email yan dimiliki Author (List emails) adalah contoh alue ype.
da !e!erapa kriteria yan !isa diunakan untuk menentukan kasta suatu o!'ect. enan menunakan kriteria ini& kita dapat memetakan desain o!'ect ke desain relasional denan !aik. 4erikut kriterianya: 2.
%hared Beference. pakah o!'ect tertentu mempunyai referensi ke o!'ect lainR +ada contoh kita di atas& class Author memiliki hu!unan denan class User dan class Article. Dleh karena itu& 'elas !ahwa class Author akan men'adi ntity. i data!ase& ta!el Author dan User akan terlihat seperti ini.
Class ContactNumber hanya diunakan oleh class Author. Class ini !ahkan tidak memiliki referensi ke class induknya& yaitu class Author. $ni ditun'ukkan oleh hu!unan composition antara class Author dan ContactNumber. Dleh karena itu& data ContactNumber dimasukkan ke dalam ta!el yan sama denan data Author& seperti dapat dilihat pada am!ar di atas. ;. 5ehidupan.
HALAMAN 88
| JAVA SWING pakah suatu o!'ect memiliki kehidupan yan terpisah dari o!'ect yan !erhu!unan denannyaR ata Author masih akan tetap tersimpan walaupun Article yan ditulisnya dihapus. idak demikian halnya denan ContactNumber. 4eitu data Author dihapus& data ContactNumber tidak memiliki relevansi lai. D!'ect yan memiliki kandidat ntity. <.
kehidupan
sendiri
merupakan
Jumlah #ntuk memahami pentinnya 'umlah dalam pemetaan& mari kita lihat hu!unan antara Article dan Comment.
%atu Article memiliki !e!erapa Comment. %ama denan ContactNumber& kehidupan Comment 'ua sanat terantun pada Article. 5alau Article dihapus& Comment tidak lai relevan. pa yan mau dikomentari kalau artikelnya tidak adaR %atu Author hanya memiliki satu ContactNumber& tapi satu Article memiliki !anyak Comment. +er!edaan 'umlah ini akan menentukan susunan ta!elnya. 4erikut susunan ta!el Article dan Comment.
JAVA PERSISTENCE API (JPA) | HALAMAN 89
enan mempertim!ankan ketia hal di atas& !erikut adalah kasta untuk masin-masin o!'ect dalam desain domain model kita. Class
Kasta
rticle
ntity
uthor
ntity
Cateory
ntity
Comment
Component
Contact7um!er
alue ype
"roup
ntity
#ser
ntity
#ser?evel
alue ype
7avigasi 5ita harus memikirkan urusan arah naviasi (direction) dalam merancan pemetaan. ua class dikatakan memiliki naviasi dua arah (!idirectional) apa!ila kita dapat menakses class yan satu dari class yan lain& dan se!aliknya. %e!aai contoh& User dan Group mempunyai hu!unan !idirectional& 'adi kode Javanya kirakira seperti ini.
public class User { private Set groups = new HashSet(); } sedankan class Group !erisi seperti ini
HALAMAN 90
| JAVA SWING
public class Group { private Set members = new HashSet(); } User dan Author unidirectional& artinya dari class User kita dapat menakses class Author. api dari class Author kita tidak dapat menakses class User. 4erikut kode Javanya.
public class User { private Author author; } dalam class Author& tidak ada property User.
public class Author { // tidak ada property User } #rusan naviasi ini hanya ada di kode Java. papun desain naviasi yan kita !uat& tidak mempenaruhi struktur ta!el kita.
Jenis Colle"tion alam desain kita di atas& ada !e!erapa hu!unan one-to-many dan many-to-many. #rusan many ini direpresentasikan dalam Java denan menunakan Collections Framework. 5ita menenal !e!erapa interface dalam Collections Framework denan sifatnya masin-masin: •
Set : D!'ek yan disimpan dalam Set tidak !oleh ada yan sama. Set tidak !isa meninat urutan. Jadi kita tidak !isa menharapkan o!'ek yan dimasukkan pertama akan muncul pertama 'ua. Set !iasanya diinisialisasi denan menunakan implementasi HashSet.
•
List : 4er!eda denan Set& List mampu meninat urutan. +erilakunya mirip denan array. 5ita dapat menatur urutan o!'ek yan disimpan di dalamnya. D!'ek List !isa diurutkan melalui perintah order by dalam %P?& atau denan adanya nilai inde6& yan menun'ukkan urutan o!'ek di dalam List. 4iasanya List diinisialisasi denan implementasi ArrayList.
•
SortedSet : $nterface ini diunakan !ila kita inin menyimpan o!'ek yan tidak !oleh sama& tapi menininkan ada urutan tertentu. 5ita dapat memasan Comparator ke dalam SortedSet untuk menatur urutan penyimpanan o!'ek. 4iasanya SortedSet diinisialisasi menunakan TreeSet.
•
Map : $nterface ini menyimpan pasanan key dan value. 4iasanya diinisialisasi menunakan HashMap.
JAVA PERSISTENCE API (JPA) | HALAMAN 91
5ita memiliki !e!erapa hu!unan many dalam domain model kita. 4erikut adalah pemilihan 'enis collection !eserta pertim!anannya. Relasi
Collection
Pertimbangan
uthor Q mail
%etT%trinU
alamat email tidak !oleh terduplikasi. 4usiness reKuirement tidak menharuskan adanya prioritas tertentu antar email
uthor Q rticle
?istTrticleU
kita inin menampilkan daftar artikel !erdasarkan tanal ter!itnya.
rticle Q Comment
?istTCommentU urutan masuknya komentar sanat pentin& karena ter'adi diskusi antar penun'un. #ntuk memastikan urutan& kita menunakan ?ist denan nilai inde6.
#ser Q "roup
%etT"roupU
%atu user tidak !oleh tercatat dua kali se!aai mem!er roup yan sama
"roup Q #ser
%etT#serU
%atu roup tidak !oleh diikuti dua kali oleh satu user yan sama
2ptionalit# *asalah optionality ini hanya ada di sisi data!ase. ari sudut pandan desain o!'ect& optionality tidak men'adi pertim!anan. *ari kita lihat lai relasi antara User dan Author. +ada kasus kita& satu User pasti memiliki satu Author& dan se!aliknya. esain seperti ini direalisasikan di data!ase denan ? !erikut:
create table T_AUTHOR ( id INT PRIMARY KEY AUTO_INCREMENT ); create table T_USER ( id INT PRIMARY KEY AUTO_INCREMENT, author_id INT NOT NULL ); %eperti kita lihat& ta!el T_USER di atas memiliki forein key author_id. 5olom author_id terse!ut di!erikan atri!ut NOT NULL karena dia adalah forein key& sehina harus diisi. esain seperti ini akan men'adi masalah 'ika !usiness reKuirement menentukan !ahwa User !elum tentu punya informasi Author (optional ). Jika menunakan desain di atas& maka kita terpaksa
HALAMAN 92
| JAVA SWING menhilankan atri!ut NOT NULL pada author_id. Cara ini kuran elean& karena forein key tidak diperuntukkan aar !isa diisi NULL. i !e!erapa merek data!ase& forein key dilaran NULL. Cara yan le!ih !aik adalah denan menunakan 'oin ta!le. %kema data!ase denan 'oin ta!le men'adi seperti ini.
create table T_AUTHOR ( id INT PRIMARY KEY AUTO_INCREMENT ); create table T_USER ( id INT PRIMARY KEY AUTO_INCREMENT ); create table T_USER_AUTHOR ( user_id INT, author_id INT, PRIMARY KEY(user_id, author_id) ); 5esimpulannya& kita harus mempertim!ankan faktor optionality dalam mendesain struktur ta!el data!ase.
,ransitive $ersisten"e ,al lainnya yan harus dipertim!ankan dalam melakukan pemetaan adalah efek suatu operasi entity (save& update& delete) terhadap entity lain yan terhu!un denannya. *isalnya& author ndy menulis artikel !aru. 4erikut kode proram untuk menyimpannya ke data!ase.
Author endy = entityManager.createQuery(“select a from Article a where a.id=:id”) .setParameter(“id”,100).getSingleResult(); Article tutorial = new Article(); tutorial.setTitle(“Belajar JPA”); tutorial.setAuthor(endy); endy.getArticles().add(tutorial); entityManager.persist(endy); +ada kasus di atas& class Article adalah ntity& 'adi J+ tidak otomatis melakukan insert. Jika di'alankan& kode di atas akan menhasilkan error& yan menye!utkan !ahwa o!'ect tutorial !elum ada di data!ase& sehina tidak !isa dihu!unkan denan o!'ect endy.
JAVA PERSISTENCE API (JPA) | HALAMAN 93 ar tidak error& kita harus men'alankan save terhadap o!'ect tutorial terle!ih tutorial terle!ih dulu.
entityManager.persist(tutorial); entityManager.persist(endy); 5ita dapat menhilankan perintah save terhadap o!'ect tutorial denan denan menaktifkan menaktifkan transitive transitive persistenc persistence& e& yaitu cascade-save. cascade-save. enan enan opsi ini& !eitu o!'ect o!'ect endy di-save& endy di-save& J+ akan melakukan save terhadap semua o!'ect yan terhu!un denan o!'ect endy. endy. ransitive persistence 'ua dapat diaplikasikan untuk update dan delete. %etelah %etelah kita memahami memahami pertim!an pertim!anan an dalam mem!uat mappin& mappin& mari sekaran kita !uat deklarasi pemetaannya.
Enum Type 5ita mulai dari yan palin sederhana& yaitu tipe data enum. alam domain model kita& enum diunakan untuk menentukan i'in akses user. *ari kita lihat class User. User.
public class User { private Integer id; private String username; private String password; private UserLevel level; } Class User ini User ini menunakan fitur !aru dalam Java & yaitu ypesafe num. dapun enum UserLevel tidak UserLevel tidak sulit& kodenya seperti ini.
public enum UserLevel { CONTRIBUTOR, EDITOR, ADMINISTRATOR } 5ita memiliki dua pilihan pilihan !aaimana !aaimana UserLevel ini UserLevel ini akan disimpan dalam ta!el& yaitu: •
ordi ordin nal : menyi enyim mpan nila ilai inde6 nde6 dari ari enum enum ters terse! e!ut ut.. CD7B$4#DB akan disimpan denan nilai 2& $DB denan nilai ;& dan *$7$%BDB *$7$%BDB denan nilai <. Drdinal Drdinal adalah modus default.
•
strin : menyimpan nilai teks enum. i data!ase& nilainya akan disi disimp mpan an se!a se!aa aii tipe tipe data data enumeration !ila !ila tersed tersedia& ia& atau atau varchar. varchar.
#ntuk memetakan enum& cukup !erikan anotasi @Enumerated. @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 5ita memili memiliki ki satu satu value value type& type& yaitu yaitu List emails emails pada class Author. 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 emails = new HashSet(); } enan informasi mappin di atas& T_AUTHOR_EMAIL akan T_AUTHOR_EMAIL akan terlihat seperti ini.
ta!el
T_AUTHOR T_AUTHOR dan
+ada T_AUTHOR_EMAIL terlihat T_AUTHOR_EMAIL terlihat !ahwa kedua kolom ( author_id dan author_id dan email) email) di!uat men'adi primary key. $ni adalah konsekuensi dari tipe collection Set& Set& yan tidak meni'inkan duplikasi di dalamnya.
JAVA PERSISTENCE API (JPA) | HALAMAN 95
One to One Dne Dne to Dne Dne men menhu hu!u !un nka kan n dua dua entit entity. y. 5ita 5ita men menu una nakan kan hu!u hu!un nan an ini ini untu untuk k Author Author da dan User. User. >an perlu diperhatik diperhatikan an hanyalah hanyalah class class User& User& karena naviasinya cuma satu arah. 4erikut class User. User.
public class User { @OneToOne @JoinColumn(name = "author_id", nullable = false) private Author author; } 5ita menatur kolom forein key author_id aar author_id aar tidak !oleh null. null. $ni !erkaitan denan masalah optionality yan sudah di'elaskan di atas.
Many to One +ada +ada cont contoh oh apli aplika kasi si kita kita&& mapp mappin in *any any to Dne Dne ada ada pada pada hu!un hu!unan an antar antara a class class Article Article da dan Category. Category. 7aviasinya satu arah arah&& dari dari Article ke Category. enan demiki demikian& an& pada pada class class Category. enan Category& Category& tidak ada property Article. Article.
public class Category { @Id @GeneratedValue private Integer id; private String name; private String description; } +ada class Article& Article& kita kita mend mendekl eklar aras asik ikan an prop proper erty ty Category& Category& denan mappin @ManyToOne se!aai @ManyToOne se!aai !erikut.
public class Article { @ManyToOne @JoinColumn(name = "category_id", nullable = false) private Category category; } eklarasin eklarasinya ya tidak 'auh !er!eda denan @OneToOne. @OneToOne. +emetaan di atas mencerminkan skema data!ase se!aai !erikut.
HALAMAN 96
| JAVA SWING
One to Many +ist dengan order b# 5ita memiliki !e!erapa kasus Dne o *any. +ertama& kita lihat dulu tipe collection List yan menunakan sortin di sisi data!ase melalui perintah order by. ,u!unan ini ada antara Author dan Article. 5arena hu!unannya dua arah (!idirectional)& maka kita akan melihat mappin di kedua sisi class. 4erikut am!ar domain modelnya.
i sisi Article& mappin *any-to-Dne Author sama denan Category yan kita sudah !uat se!elumnya.
public class Article { @ManyToOne @JoinColumn(name = "author_id", nullable = false) private Author author; } i sisi Author&
public class Author { @OneToMany(mappedBy = "author") @OrderBy("publishDate") private List articles = new ArrayList(); } +emetaan di atas akan menhasilkan struktur ta!el data!ase se!aai !erikut.
JAVA PERSISTENCE API (JPA) | HALAMAN 97
5ita menunakan anotasi @OrderBy untuk menentukan urutan munculnya Article. Jika anotasi terse!ut kita hilankan& J+ akan menurutkannya !erdasarkan id. +ada mappin di atas& kita menunakan keyword mappedBy. 5eyword ini dikenal 'ua denan atri!ut inverse=true pada mappin L*?. 5eyword inverse atau mappedBy mem!eritahukan J+ !ahwa isi List adalah ntity o!'ect& !ukan Component. enan demikian& kalau o!'ect Author dihapus& J+ tidak akan otomatis menhapus 'ua Article.
penting J$0 mampu membua t pemetaan satu ara' da ri 0ut'or ke 0rti"le- ba'kan tanpa a dan#a propert# aut'or di sisi 0rti"le! $emetaan satu ara' ini tetap dilakukan dengan adan#a &oreign ke# aut'or8id di ,8 0*,IC+/ ,api konsekuensin#a J$0 tida k ta' u a paka ' &oreign ke# aut'or8id tersebut suda' dipetakan atau belum! Ini sebabn#a mengapa kita 'arus menggunakan ke#word inverse!
%elain menatur masalah keterantunan& keyword inverse ini 'ua menatur eksekusi %P?. *ari kita !ahas internal J+ sedikit. sosiasi dua arah antara Author dan Article se!etulnya terdiri dari dua asosiasi satu arah& yaitu dari Author ke Article& dan se!aliknya. i dalam data!ase& asosiasi ini diimplementasikan denan forein key author_id yan ada dalam ta!el T_ARTICLE. enan demikian& satu hu!unan forein key dipetakan dua kali oleh J+. 5onsekuensinya& dua mappin ini akan menhasilkan dua kali eksekusi %P?. Co!a perhatikan skenario !erikut.
HALAMAN 98
| JAVA SWING
Author endy = entityManager.createQuery(“select a from Article a where a.id=:id”) .setParameter(“id”,100).getSingleResult(); Article tutorial = new Article(); tutorial.setTitle(“Belajar JPA”); tutorial.setAuthor(endy); endy.getArticles().add(tutorial); entityManager.persist(tutorial); entityManager.persist(endy); Bankaian kode proram di atas akan menhasilkan eksekusi %P? se!aai !erikut:
select * from T_AUTHOR where id=100; insert into T_ARTICLE (title, author_id) values ('Belajar JPA', 100); update T_ARTICLE set author_id=100 where title='Belajar JPA'; 5ita lihat di atas& J+ men'alankan %P? update& padahal se!elumnya author_id sudah diset menurut id authornya. $ni dise!a!kan karena forein key author_id dipetakan dua kali. J+ tidak !isa mendeteksi ini secara otomatis& karena tidak memunkinkan secara loika. Jadi& kita harus mem!eri tahu J+ !ahwa author_id sudah dipetakan oleh class rticle. %etelah kita menunakan keyword mappedBy& kode proram di atas akan menhasilkan eksekusi %P? se!aai !erikut.
penting Inverse tidak ber'ubungan denga n "as"ade! Cas"ade 'an#a men#uru' J$0 untuk memeriksa apaka' entit# lain #a ng ter'ubung suda' di% save9update9delete atau belum
select * from T_AUTHOR where id=100; insert into T_ARTICLE (title, author_id) values ('Belajar JPA', 100); 5eyword mappedBy menye!a!kan J+ mena!aikan pemetaan di sisi uthor. >an dipantau oleh J+ hanyalah sisi rticle. enan demikian& !ila kita save seperti ini:
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:
ke data!ase.
#ntuk
Article tutorial = new Article(); tutorial.setAuthor(endy) entityManager.persist(tutorial); 4ila kita sudah menaktifkan transitive persistence& maka kita !isa melakukannya seperti ini:
Article tutorial = new Article(); tutorial.setAuthor(endy) entityManager.persist(endy); 4aaimana 'ika kita inin mem!alik sisi inverseR *isalnya& kita inin aar J+ mena!aikan sisi Article. 5eyword mappedBy atau inverse tidak dapat diunakan di sisi @ManyToOne. #ntuk melakukan hal ini& kita unakan keyword updateble dan insertable. i sisi Article& kita tam!ahkan updatable dan insertable.
public class Article { @ManyToOne @JoinColumn( name = "author_id", nullable = false updatable = false, insertable = false ) private Author author; } i sisi Author& kita hilankan sa'a mappedBy.
public class Author { @OneToMany @OrderBy("publishDate") private List articles = new ArrayList(); }
Many to Many 4ila kita sudah menuasai pemetaan Dne-to-*any& maka *any-to*any tidak sulit. +er!edaannya hanya terletak di anotasinya. >an tadinya @OneToMany& dianti men'adi @ManyToMany. %ama denan Dne-to-*any& kita harus menentukan sisi mana yan
HALAMAN 100
| JAVA SWING inverse. +ada contoh kali ini& sisi inverse terletak pada class User. 4erikut isi class User.
public class User { @ManyToMany(mappedBy = "members") private Set groups = new HashSet(); } 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 members = new HashSet(); } +emetaan many-to-many mem!utuhkan ta!el perantara. notasi @JoinTable diunakan untuk menatur nama ta!el dan kolom dalam ta!el perantara. Jika kita menhilankan anotasinya& maka J+ akan mencari ta!el !ernama T_GROUP_T_USER denan nama kolom groups_id dan members_id. 4erikut adalah struktur ta!el data!ase yan dipetakan oleh anotasi di atas.
Parent-Child erakhir& kita akan mem!uat pemetaan parent-child. $ni merupakan pemetaannya yan serin kita unakan. +emetaan ini !iasanya !er!entuk one-to-many. %isi one menentukan kondisi sisi many. 4ila ter'adi save& update& atau delete pada sisi one& maka sisi many akan terpenaruh. %e!aai contoh& kita akan menunakan relasi parent-child ini pada hu!unan antara Author dan Article. 4ila Author dihapus& maka seluruh Article yan pernah ditulisnya 'ua akan ikut terhapus.
JAVA PERSISTENCE API (JPA) | HALAMAN 101 #ntuk menaktifkan parent-child ini& kita u!ah pemetaan di sisi Author se!aai Author se!aai !erikut.
public class Author { @OneToMany( mappedBy = ”author”, cascade = CascadeType.ALL ) @OrderBy("publishDate") private List articles = new ArrayList(); } +ada contoh di atas& kita menaktifkan fitur cascade untuk semua 'enis operasi& yaitu save& update& dan delete. 4ila kita hanya inin cascade untuk operasi save dan delete& anotasinya men'adi seperti ini.
public class Author { @OneToMany( mappedBy = ”author”, cascade = {CascadeType.PERSIST, CascadeType.REMOVE} ) @OrderBy("publishDate") private List articles = new ArrayList(); }
Mengambil Objek dari Database J+ menyediakan !anyak cara untuk menam!il data dari data!ase. 4er!aai pilihan cara ini disesuaikan denan preferensi prora proramme mmer. r. da oran oran yan yan le!ih le!ih menyuk menyukai ai aya aya %P? karena karena le!ih le!ih rinka rinkas s dan mudah. mudah. da 'ua yan yan le!ih le!ih menyuk menyukai ai aya aya prora proramma mmatic tic !erori !erorienta entasi si o!'ek o!'ek karena karena type-s type-safe afe.. 4e!era 4e!erapa pa prorammer yan merupakan alumni *icrosoft ccess 'ua !isa ikut menikmati J+ denan Puery 4y 6ample.
JPA Query Language (JPAQL) J+P? adalah !ahasa Kuery J+ yan mirip denan %P?. 4edanya& dalam dalam J+P? kita menunakan menunakan nama o!'ect dan property& !ukan nama ta!el dan kolom.
6uer# Seder'ana #ntuk
contoh
pertama&
mari
kita
implementasikan
HALAMAN 102
| JAVA SWING ArticleDao.findAll().. ArticleDao.findAll()
public class ArticleDao { public List findAll() { return entityManager.createQuery( “selct a from Article a”).getResultList(); } } Puery di atas akan menhasilk menhasilkan an semua o!'ect Article Article yan ada dalam data!ase.
$agination 4ila aplikasi kita menyimpan menyimpan ri!uan artikel& tentunya kita inin inin menam!il data secara !ertahap& halaman per halaman (pain). %P? yan diunakan diunakan untuk paination paination ini !iasanya !iasanya !er!eda antar data!ase. enan J+& kita !isa menunakan satu J+P? sa'a. J+ nantinya akan mener'emahkan sesuai denan merek data!ase yan kita unakan. #ntuk #ntuk menam menam!il !il artikel artikel per halama halaman& n& kita kita overlo overload ad method method findAll aar aar meneri menerima ma para parame meter ter startIndex startIndex da dan pageSize. pageSize. +ara +arame meter ter startIndex adalah adalah inde6 inde6 yan yan menun' menun'ukka ukkan n record record pertama dalam halaman& sedankan pageSize menun'ukkan pageSize menun'ukkan 'umlah record per halaman. 4erikut overloadin method findAll. findAll.
public List findAll (int startIndex, int pageSize){ return entityManager .createQuery("select a from Article a") .setFirstResult(startIndex) .setMaxResults(pageSize) .getResultList(); }
$arameter (inding 4aaim 4aaimana ana kalau kalau kita kita mau menir menirim im parame parameter ter ke KueryR KueryR J+ mendukun mendukun parameter !indin& !indin& mirip mirip denan denan PreparedStatement di J4C. 4ila kita inin menam!il menam!il artikel artikel yan ditulis penaran penaran tertentu& tertentu& !erikut kodenya.
JAVA PERSISTENCE API (JPA) | HALAMAN 103
public List findByAuthor(Author author) { String query = "from Article a "; query += " where a.author.id a.author.id = :authorId "; return entityManager .createQuery(query) .setParameter("authorId", author.getId()) .getResultList();
} %ela %elain in itu& itu& kita kita 'ua 'ua !isa !isa men menu una naka kan n para parame mete terr !ert !ertip ipe e java.util.Date. java.util.Date. Contohnya Contohnya !ila kita inin mendapatkan mendapatkan artikel artikel yan diter!itkan setelah tanal tertentu. 4uat method articlesPublishedAfter dalam articlesPublishedAfter dalam ArticleDao. ArticleDao.
public List articlesPublishedAfter (Date publishDate) { String query = "from Article a "; query += "where "where a.publishDate > :publishDate"; return entityManager.createQuery(query) .setParameter("publishDate", publishDate) .getResultList(); }
7amed 6uer# 5ita 5ita !isa isa mene enelu luar arka kan n J+ J+P? dar dari dala dalam m o!'e o!'ek k DAO DAO dan memi memind ndah ahka kann nnya ya ke clas class s nti ntity ty.. ari ari clas class s DAO& DAO& kita kita cuku cukup p memanil nama Kuery terse!ut. Fitur ini dise!ut 7amed Puery. *isaln *isalnya& ya& kita kita inin inin menam menam!il !il artike artikell !erdas !erdasark arkan an kateor kateori. i. 4erikut J+P?-nya.
from Article a where a.category.id = :categoryId J+P? ini !isa kita letakkan dalam class Article. Article. 4erikut deklarasi class Article. Article.
HALAMAN 104
| JAVA SWING
@Entity @Table(name = "T_ARTICLE") @NamedQueries({ @NamedQuery( name = "articleByCategory", query = "from Article a "+ "where a.category.id = :categoryId" ) }) public class Article { } 7amed Puery ini dipanil dari findByCategory seperti ini.
ArticleDao dalam method
public List findByCategory(Category category) { return entityManager .createNamedQuery("articleByCategory") .setParameter("categoryId", category.getId()) .getResultList(); }
*estri"tion 5ita menunakan restriction untuk mem!atasi 'umlah record yan dihasilkan. *irip denan %P?& kita menunakan keyword where untuk mem!atasi hasil Kuery. Contohnya& kita menam!il artikel yan diter!itkan setelah tanal tertentu. J+P?nya tampak seperti ini:
from Article a where a.publishDate > :publishDate ,ampir semua operator yan !iasa kita unakan di Java dapat diunakan. 4erikut ta!el operator yan didukun& diurutkan !erdasarkan prioritas eksekusinya: Operator
Penjelasan
.
naviasi o!'ect
A-
untuk mem!uat men'adi positif/neatif
V/
perkalian dan pem!aian
A-
pen'umlahan dan penuranan
O TU
sama denan atau tidak sama denan
T& U& TO& UO
per!andinan
I7D 497& I7D ?$5& per!andinan& mirip denan sintaks %P? I7D $7& $% I7D 7#?? $% I7D *+>& I7D **4B IDF
penecekan collection
JAVA PERSISTENCE API (JPA) | HALAMAN 105 7D& 7& DB
operator loika
*isalnya& !ila kita inin menam!il artikel yan !ukan kateori 4erita& Kuery-nya seperti ini:
String jpaql = “from Article a “; jpaql += “where a.category <> :category”; List hasil = entityManager.createQuery(jpaql).getResultList(); 5ita menunakan karakter % untuk menantikan karakter apa sa'a dalam 'umlah !erapa sa'a. *isalnya& kita inin mencari artikel yan diawali denan huruf & maka kita unakan J+P? seperti ini:
from Article a where a.title like 'A%' ?alu !aaimana kalau kita inin mencari artikel yan diawali denan karakter %R "unakan escape character \& sehina J+P?nya men'adi seperti ini:
from Article a where a.title like '\%' 4ila kita menunakan le!ih dari satu persyaratan& unakan keyword and atau or sesuai ke!utuhan. Contohnya& kita inin mencari artikel yan 'udulnya diawali huruf & dan nama penarannya 'ua diawali denan huruf .
from Article a where a.title like 'A%' and a.author.fullname like 'A%' Contoh lain& !ila kita inin mencari artikel yan diawali huruf dan 'ua huruf 4& J+P?nya seperti ini.
from Article a where a.title like 'A%' or a.title like 'B%' 5ita !isa menurutkan hasil pencarian denan menunakan keyword order by& sama seperti %P?. 4erikut contoh penurutan artikel !erdasarkan 'udulnya.
String jpaql = “from Article a “; jpaql += “order by a.title asc ”; List hasil = entityManager.createQuery(jpaql).getResultList(); 5ita menunakan keyword asc& yan artinya ascendin untuk menurutkan dari kecil ke !esar. #ntuk urutan se!aliknya& unakan keyword desc& yan artinya descendin.
HALAMAN 106
| JAVA SWING
6uer# untuk Colle"tion da !e!erapa keyword yan dapat diunakan untuk memanipulasi collection. *isalnya& kita inin mencari roup yan tidak punya mem!er.
from Group g where g.members is empty tau mencari user yan tera!un dalam rup denan nama tertentu.
from User u, Group g where g.name=? and u member of g.members
$roje"tion 4ila tadi kita sudah menentukan sum!er data denan keyword from dan !atasan hasil denan keyword where& sekaran kita !isa menentukan format hasil yan dikeluarkan denan keyword select. *ari kita lihat lai Kuery user yan men'adi anota rup.
from User u, Group g where g.name=? and u member of g.members +ada Kuery di atas& kita !isa memilih untuk hanya menam!il data user sa'a denan menunakan select. Puery di atas !isa ditulis men'adi seperti ini:
select u from User u, Group g where g.name=? and u member of g.members enan Kuery seperti itu& kita !isa mem!uat method di class GroupDao se!aai !erikut:
public List membersOf(String groupName) { String jpaql = "select u "; jpaql += "from User u, Group g "; jpaql += "where g.name = :groupName "; jpaql += "and u member of g.members'; return entityManager .createQuery(jpaql) .setString("groupName", groupName) .getResultList(); }
Join J+ memiliki kemampuan untuk mena!unkan !e!erapa o!'ek sekalius. %e!aai contoh& kita inin menampilkan nama penulis
JAVA PERSISTENCE API (JPA) | HALAMAN 107 yan pernah menisi artikel denan kateori ,eadline 7ews. Puery ini meli!atkan tia o!'ek& yaitu Author& Article& dan Category.
select au.fullname from Article ar join ar.author as au where ar.category .name like 'Headline%' Puery di atas akan menhasilkan !e!erapa record denan nama yan sama. #ntuk mem!uan hasil yan duplikat& unakan keyword distinct.
select distinct au.fullname from Article ar join ar.author as au where ar.category.name like 'Headline%'
*eport 6uer# Beport Kuery adalah Kuery yan menandalkan kemampuan data!ase untuk melakukan areasi terhadap data yan 'umlahnya !anyak. 4iasanya report Kuery !anyak memanfaatkan areate function seperti sum & count& group by& dan having. %e!aai contoh& !ila kita inin menhitun 'umlah artikel yan sudah ditulis seoran author& kita !isa menunakan Kuery !erikut.
select count (a) from Article a where a.author.fullname = 'endy' tau kita !isa 'ua menhitun dikomentari penun'un.
!erapa artikel
yan tidak
select count (a) from Article a where a.comments is empty
Sub:uer# J+ 'ua mendukun Kuery di dalam Kuery. %e!aai contoh& kita inin menampilkan penulis mana yan pernah mem!uat artikel denan nama kateori !erakhiran 7ews.
HALAMAN 108
| JAVA SWING
select distinct (au) from Author au, Article ar where ar.category.id in ( select c.id from Category c where c.name like '%News' )
Native SQL Jika J+P? di atas masih 'ua tidak mencukupi& kita !isa lansun meneksekusi %P? ke data!ase melalui J+. %e'auh ini& J+ sudah mencukupi untuk aplikasi !lo kita. api sekedar untuk menam!ah penetahuan& mari kita am!il 21 artikel ter!aru denan menunakan native %P? *y%P?. %P?nya se!aai !erikut
select * from T_ARTICLE order by publishDate desc limit 0,10 %P? di atas kita unakan dalam rticleao se!aai !erikut.
public List topTenNative() { String sql = "select * from T_ARTICLE "; sql += "order by publishDate desc limit 0,10"; }
return entityManager .createNativeQuery(sql,Article.class) .getResultList();
#ntuk menunakannya& kita panil methodnya seperti !iasa. Client code tidak perlu tahu implementasi internalnya. ari sisi client code& sama sa'a seperti menakses J+P?.
JASPER REPORT | HALAMAN 109
Jasper *eport Pengenalan *enampilkan report atau laporan merupakan hal yan pentin dan umum diunakan oleh aplikasi manapun& terutama yan !ersifat sistem informasi. Dleh karena itu kita akan mem!ahas !aaimana mem!uat desain report& menisi report denan data& lalu mem!erikan hasilnya kepada penuna. alam Java& terdapat !er!aai teknoloi untuk mem!uat report diantaranya adalah& ●
JasperBeport& http://'asperreport.sourcefore.net/
●
4$B& http://www.!irt-e6chane.com/
●
ata ision& http://datavision.sourcefore.net/
JasperBeport merupakan reportin tools yan palin populer di Java dan !ahkan !e!erapa aplikasi +,+ menunakan JasperBeport se!aai solusi untuk menampilkan report.
Instalasi +ersiapan yan perlu kita lakukan adalah: 2. *eninstall Java %5& versi yan diunakan adalah J5 2.0.1. nda dapat mendownload J5 terse!ut dari we!site http://'ava.sun.com ;. *eninstall 7et4eans 0.1 <. *eninstall iBeport =. *eninstall *y%P? Java %5 diperlukan se!aai toolkit untuk menem!ankan aplikasi Java. i dalamnya terdapat Java compiler& 'ava virtual machine dan 'ava li!rary standard. anpa %5 kita tidak akan !isa menem!ankan aplikasi Java. 7et4eans adalah $ ($nterated evelopment nvironment) yan dikem!ankan oleh %un *icrosystems. 7et4eans difokuskan untuk menem!ankan aplikasi 'ava secara produktif& didalamnya terdapat !anyak wiard yan menotomatisasi penem!anan aplikasi& menhindarkan developer dari low level confiuration yan rumit. iBeport adalah visual desiner untuk mem!uat reportin menunakan li!rary 'asperreport. anpa iBeport development
HALAMAN 110
| JAVA SWING report men'adi sanat susah dan tidak efisien *y%P? diunakan se!aai !asis data yan akan di!uatkan reportnya.
Alur Proses JasperReport #ntuk mem!uat dan menampilkan se!uah report ada !e!erapa hal yan harus dilakukan& 2.
*erancan report menunakan visual report desiner& seperti iBeport. File dihasilkan !er-ekstensi V.'r6ml.
;.
*enkompilasi desain report aar siap diisi data. ,asil rancanan report yan sudah dikompilasi !erekstensi V.'asper. da !er!aai cara untuk menkompilasi desain report& ●
i dalam kode 'ava atau&
●
*enunakan 7 task.
Cara yan kedua merupakan pendekatan yan palin umum diunakan karena kita tidak munkin menu!ah desain report pada saat run-time atau setelah aplikasi di-deploy. <.
*enisi report denan data. ata yan di!erikan dapat !er!aai 'enis sesuai denan ke!utuhan& hal ini akan di!ahas pada !a! selan'utnya. Beport yan sudah diisi data !erekstensi V.'rprint.
=.
*enentukan 'enis report yan inin ditampilkan. %aat ini JasperBeport mendukun !er!aai 'enis format seperti& +F& L?%& BF& D& ,*?& C%& dan plain te6t.
Istilah Umum dalam JasperReport %e!elum mem!ahas le!ih 'auh menenai JasperBeport perlu diketahui !e!erapa istilah umum yan !iasa diunakan& ●
Beportin data *enisi data ke dalam report dapat dilakukan denan menunakan& ○
Field& untuk menampilkan data yan !erasal dari Kuery data!ase atau datasource.
○
+aramater& untuk menampilkan parameter report. 4entuk dari parameter adalah *ap denan tipe key dan
JASPER REPORT | HALAMAN 111 value !erupa %trin. ○
●
aria!le& se!aai data yan dapat dimanipulasi dan diunakan !erkali-kali dalam report.
?ayout report 4iasanya desain report terdiri dari !e!erapa !aian yaitu& ○
4ackround.
○
itle& 'udul dari report.
○
+ae header& !aian di setiap awal halaman.
○
Column header& !aian di setiap awal ta!el.
○
etail& !aian yan menampilkan data yan !erasal dari Kuery atau data source. %etiap data dapat ditampilkan secara vertikal dari atas ke !awah atau horiontal dari kiri ke kanan.
○
Column footer& !aian di setiap akhir ta!el.
○
+ae footer& !aian di !aian footer setiap halaman.
○
?ast pae footer& sama seperti pae footer namun hanya muncul pada halaman terakhir.
○
%ummary& !aian yan hanya ditampilkan sekali di akhir report.
iReport sebagai Visual Designer #ntuk mendesain report instalasinya sanat mudah.
kita
akan
menunakan
iBeport&
●
+enuna 9indows !isa menunduh file installer iBeport& meninstall dan lansun men'alankannya.
●
4ai penuna sistem operasi V7i6 !isa menunduh file arsipnya !erupa tar. dan menekstraknya. %etelah itu men'alankannya denan&
cd /home/user/iReport-2.0.4 sh iReport.sh 4erikut tampilan muka dari iBeport&
HALAMAN 112
| JAVA SWING
Konfigurasi Koneksi Database dalam iReport %e!elum menulis %P? dalam report& kita perlu menkonfiurasi koneksi data!ase. Caranya denan&
Data > Connection / Data Sources New > Pilih Database JDBC Connection > Next $sikan form konfiurasi seperti !erikut&
Name: MySQLConnection JDBC Driver: com.mysql.jdbc.Driver JDBC URL: jdbc:mysql://localhost/ejb3 Username: belajar Password: java 5onfiurasi di atas menasumsikan kita sudah mempunyai data!ase yan !ernama !ela'ar denan username dan password !ela'ar / 'ava. 4erikut script untuk mem!uat schema !erdasarkan konfiurasi di atas&
JASPER REPORT | HALAMAN 113
CREATE DATABASE ejb3; CREATE TABLE T_PERSON GRANT ALL ON belajar.* TO belajar@localhost IDENTIFIED BY 'java'; FLUSH PRIVILEGES;
Menampilkan Data dalam Report da dua pendekatan umum untuk menampilkan atau menisi data ke dalam report& ●
$nline %P?& menampilkan data melalui %P? yan disimpan pada file desain report.
●
ata%ource& menampilkan data melalui interface ata%ource yan disediakan oleh JasperBeport. ata%ource ini didefinisikan di dalam kode Java sehina report hanya !erfunsi untuk menampilkan data sa'a.
+endekatan pertama merupakan pendekatan yan palin sederhana. Dleh karena itu kita akan mem!ahas menampilkan data melalui inline %P?. #ntuk mendefinisikan %P? dalam report dapat dilakukan denan&
File > New Document Beri nama report dengan PersonReport > OK Edit > Report Query ulis %P? dalam Kuery editor&
select * from T_PERSON 5emudian tekan tom!ol 8Bead Fields untuk memappin kolom ta!el denan field lalu tekan tom!ol 8D5. da !e!erapa field !aru sesuai denan kolom di ta!el N+B%D7 yaitu& personNid& name& email& dan !irthdate. ?alu pindahkan field di atas ke !aian 8detail dalam report. ,asilnya seperti !erikut&
HALAMAN 114
| JAVA SWING
5emudian tam!ahkan 'udul dan la!el untuk setiap field data denan menunakan menu tool!ar 8%tatic e6t. esain akhir report akan seperti !erikut&
ampilkan hasil report denan cara&
Build > Execute (with active connection) Janan lupa untuk menyimpan report yan sudah di!uat denan nama PersonReport.jrxml&
File > Save
Kompilasi Report dengan Ant %etelah desain sudah 'adi maka kita perlu mem!uat ant taret
JASPER REPORT | HALAMAN 115 untuk menkompilasi seluruh desain report. Caranya&
Klik tab Files > Buka file build.xml %etelah itu kita definisikan terle!ih dahulu dimana lokasi kode 'ava dan report !erada dan menatur classpath untuk li!rary yan di!utuhkan dalam kompilasi report.
%etelah lokasi dan classpath ditentukan& maka lankah terakhir adalah mendefinisikan ant taret untuk menkompilasi seluruh file report denan ekstensi V.'r6ml.
Jalankan ant taret denan nama 8compile report denan cara&
Klik kanan build.xml > Run Target > Other Target Klik compile-report kan muncul output seperti ini&
HALAMAN 116
| JAVA SWING
init: deps-module-jar: deps-ear-jar: deps-jar: library-inclusion-in-archive: library-inclusion-in-manifest: compile: compile-report: Compiling 1 report design files. File : /home/ifnu/NetBeansProjects/jasper/jasper/report/PersonRe port.jrxml ... OK. BUILD SUCCESSFUL (total time: 4 seconds)
Integrasi JasperReport dengan Swing $nterasi 'asperreport denan %win se!elumnya dapat dilakukan denan mudah. da !er!aai skenario untuk menampilkan halaman atau data dalam %win yaitu& ●
*enampilkan dalam J+anel menunakan JBiewer
●
*enampilkan dalam JFrame menunakan Jasperiewer
●
*eneksport lansun hasil report ke dalam format file seperti +F& 6cell atau 9ord
+endekatan pertama dan kedua sama dari sisi kode& hanya sa'a ditampilkan denan menunakan komponen yan !er!eda. Cara yan palin laim adalah denan menunakan JBiewer& dimana kita !isa meletakkan viewer report di manapun kita ininkan& karena JBiewer adalah J+anel.
ResultSet rs = stmn.executeQuery(); String jasper = JasperCompileManager.compileReportToFile( System.getProperty("user.dir") + "/src/jasper/report/person.jrxml"); JRResultSetDataSource resource = new JRResultSetDataSource(rs); String result = JasperFillManager.fillReportToFile(jasper, new HashMap(), resource); JRViewer viewer = new JRViewer(result, false);
JASPER REPORT | HALAMAN 117
Menampilkan Report Menggunakan DataSource %e!elumnya kita telah menco!a pendekatan pertama untuk menampilkan report yaitu denan menyimpan kode %P? di dalam report. 5ekuranan dari pendekatan ini adalah dari sisi code mainta!ility& karena kode %P? terpisah dari source code aplikasi. ki!atnya akan ter'adi !anyak duplikasi& misalnya kita sudah punya kode %P? di source code aplikasi untuk menampilkan seluruh daftar +erson dan kemudian kita inin menampilkan report daftar +erson dalam !entuk +F. *aka yan selan'utnya dilakukan adalah copy-paste kode %P? dari source code aplikasi ke dalam report. 4ayankan 'ika kita mempunyai 21 report yan menampilkan daftar +erson denan kode %P? yan sama denan source code aplikasi lalu kita menu!ah salah satu nama kolom dari ta!el N+B%D7& maka tentu seluruh report harus diu!ah dan dicompile ulan. JasperBeport menyediakan solusi untuk hal ini denan menunakan ata%ource. ata%ource !erfunsi untuk menyimpan data yan inin ditampilkan& misalkan dari data!ase& kemudian dikirim ke dalam report untuk selan'utnya ditampilkan. da !er!aai 'enis ata%ource yan dapat kita unakan !erdasarkan tipe data yan inin disimpan& ●
JB*aprrayata%ource untuk menyimpan tipe data array of map
●
JB*apCollectionata%ource collection of map
●
JB4eanrrayata%ource untuk menyimpan tipe data array of !ean
●
JB4eanCollectionata%ource collection of !ean
●
JBa!le*odelata%ource ta!lemodel di swin
●
JBLmlata%ource untuk menyimpan tipe data 6ml
untuk
untuk
untuk
menyimpan
menyimpan menyimpan
tipe
tipe tipe
data
data data
ata%ource yan umum diunakan adalah JB4eanCollectionata%ource. 5ita akan menampilkan daftar +erson& denan mem!uat Collection dari +erson !ean yan kemudian akan di!erikan ke JB4eanCollectionata%ource. +ertama di!uat terle!ih dahulu Person.jaa&
HALAMAN 118
| JAVA SWING
public class Person { private int id; private String name; private String email; // Generate getter and setter } 4uka file PersonReport.jrxml yan di!uat se!elumnya melalui iBeport denan te6t editor misalnya& notepad. 5uran le!ih hasilnya seperti ini&
5ita dapat lansun menunakan file PersonReport.jrxml di atas aar dapat menampilkan ata%ource. >an perlu dilakukan adalah& ●
,ilankan ta Kuery%trin
●
%esuaikan nama field dan tipenya denan property pada class +erson & sehina +ersonBeport.'r6ml men'adi&
4erikut file +ersonBeport.'r6ml setelah diu!ah&
%elan'utnya adalah mem!uat enerate report&
PersonReport.jaa untuk men-
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", "[email protected]")); users.add(new Person("2", "Endy Muhardin", "[email protected]")); users.add(new Person("3", "Ifnu Bima", "[email protected]")); return users; } } 4iasanya untuk kasus nyata& daftar +erson pada method prepareata%ource() dipanil denan menunakan %P? Kuery. %etelah kelas +ersonBeport di'alankan maka hasil report dapat dilihat di /home/dhiku/'asper/+ersonBeport.pdf.
HALAMAN 120
| JAVA SWING
Mengirim Parameter %elain ata%ource& adapula parameter yan dapat dikirimkan ke dalam report. *isalkan kita inin mencetak 'udul report secara dinamis yan dikirim dari kode Java. 4erikut lankah-lankah untuk menirimkan parameter& 2.
%iapkan parameter di report
View > Parameter Klik New Isi parameter name, “judul” Klik OK ;.
4erikan parameter ke report
// Compile Report dan siapkan DataSource HashMap param = new HashMap(); // Fill Report JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, param, dataSource); // Export Report
Menggunakan Scriptlet %criptlet adalah kode Java yan diselipkan pada saat proses fill report. +roses fill report terdiri dari !e!erapa tahap& scriptlet dapat men'alankan kode Java pada se!elum dan sesudah tahap-tahap terse!ut misalnya& ●
%e!elum atau sesudah report diinisialisasi
●
%e!elum atau sesudah setiap halaman report diinisialisasi
●
%e!elum atau sesudah setiap kolom diinisialisasi
●
%e!elum atau sesudah setiap roup diinisalisasi
●
%e!elum atau sesudah setiap !aris atau record diinisialisasi
#ntuk mem!uat scriptlet maka kita harus mem!uat se!uah class yan men-e6tend kelas JB!stract%criptlet. 4erikut contoh scriptlet yan akan di'alankan setiap se!elum !aris diinisialisasi&
JASPER REPORT | HALAMAN 121
public class PersonScriplet extends JRAbstractScriptlet { public int number = 0; public void beforeDetailEval() throws JRScriptletException { String name = (java.lang.String)getFieldValue("name"); System.out.println("number" + ". " + name); number++ } } #ntuk menunakan kelas +erson%criptlet di dalam +ersonBeport caranya adalah se!aai !erikut&
Edit > Report Properties Klik tab “Scriptlet Class” Pilih “Use this scriptlet class ...” Ketik PersonScriptlet Jika menunakan packae& maka masukkan full path untuk kelas scriptlet& misalkan com.artivisi.report.+erson%criptlet. Jalankan kem!ali kelas +ersonBeport yan sudah di!uat se!elumnya& seharusnya selain menhasilkan daftar +erson& 'ua akan mem!erikan output ke console !erupa& 1. Hadikusuma Wahab 2. Endy Muhardin 3. Ifnu Bima
HALAMAN 122
| JAVA SWING
$enutup enan ilmu yan sudah diperoleh dalam pelatihan ini& anda sudah !isa mulai untuk mem!uat proram Java desktop sederhana. +ada awalnya pasti terasa sulit& sikapi denan pantan menyerah dan selalu cari cara yan le!ih !aik dalam mem!uat aplikasi. ?ankah selan'utnya anda !isa mulai aktif !ertanya atau men'awa! hal-hal yan !erhu!unan denan Java. *edia yan !isa diunakan !anyak sekali& !isa forum milis atau diskusi denan teman. $ni cara ter!aik untuk menetes apakah pemahaman anda menenai Java sudah cukup lenkap atau anda masih perlu !ela'ar le!ih !anyak lai. %etelah yakin denan kemampuan anda& !erfikirlah untuk menam!il sertifikasi profesional Java. +elatihan untuk persiapan sertifikasi Java !anyak tersedia di lem!aa pelatihan. 5alau anda merasa terlalu !erat menam!il kursus persiapan sertifikasi& !erlatihlah sendiri menunakan materi yan !anyak tersedia di internet& misalnya 'avaranch.com. Cara !ela'ar Java yan palin efektif adalah denan meli!atkan diri dalam pro'ect !er!asis Java. Jika di perusahaan anda tidak memunkinkan& di luar sana !anyak sekali pro'ect opensource yan memerlukan !antuan anda. 4erkun'unlah ke we!site-we!site open source pro'ect hostin seperti sourcefore.net atau dev.'ava.net ?earn& ry dan each adalah formula untuk meninkatkan penetahuan anda tentan Java. Jika sudah !ela'ar dan sukses menco!a& tularkan ilmu anda pada oran disekelilin anda& di'amin ilmunya !akalan !ertam!ah !erlipat-lipat.