Java Swing
Java Swing
Java Desktop
Ifnu Bima
ifnu@artivisi.com http://ifnu.artivisi.com
Daftar Isi
Java Foundation Class.......................................................................................................1 Feature JFC...................................................................................................................1 Swing Package..............................................................................................................2 Swing HelloWorld........................................................................................................3 Install Java Development Kit...................................................................................3 Membuat program HelloWorld ...............................................................................3 Melakukan kompilasi program HelloWorld............................................................4 Menjalankan program HelloWorld..........................................................................4 Membuat Swing HelloWorld dengan Netbeans 6.1......................................................5 Komponen Swing ............................................................................................................7 Struktur Komponen Swing...........................................................................................7 Bekerja dengan JLabel, JTextField dan JButton...........................................................8 Bekerja dengan JCheckBox dan JRadioButton..........................................................11 Bekerja dengan JList dan JComboBox ......................................................................15 Bekerja dengan Menu, Popup Menu dan Toolbar......................................................18 Membuat Menu......................................................................................................19 Membuat Popup Menu .........................................................................................24 Membuat Toolbar...................................................................................................25 Membuat Dialog dan JFileChooser.............................................................................29 Membuat pre-defined dialog dengan JOptionPane................................................30 Membuat JFileChooser..........................................................................................35 Konsep MVC...................................................................................................................38 Model dalam Komponen Swing ................................................................................39 TableModel.................................................................................................................41 ListModel ...................................................................................................................42 Menangani Event.............................................................................................................44 Event Listener dalam Swing ......................................................................................45 ActionListener.............................................................................................................48 KeyListener.................................................................................................................50
HALAMAN III
MouseListener dan MouseMotionListener.................................................................52 Koneksi Database Dengan JDBC....................................................................................55 Mengenal JDBC..........................................................................................................55 Database Driver...........................................................................................................56 Membuat Koneksi.......................................................................................................56 Mengambil dan Memanipulasi Data dari Database....................................................58 Menggunakan PreparedStatement...............................................................................60 Batch Execution..........................................................................................................62 Menangani Transaction...............................................................................................62 DAO dan Service Pattern............................................................................................63 Java Persistence API (JPA).............................................................................................71 Perbedaan dialek SQL............................................................................................71 Perbedaan konsep relasional dan object-oriented..................................................72 Peningkatan kinerja................................................................................................73 Persiapan.....................................................................................................................74 Instalasi ..................................................................................................................74 Aplikasi Blog..........................................................................................................75 Fungsionalitas Aplikasi..........................................................................................75 Dasar-dasar ORM.......................................................................................................75 Mapping Sederhana................................................................................................75 Konfigurasi JPA.....................................................................................................76 Menyimpan dan Mengambil Object.......................................................................78 EntityManagerFactory............................................................................................79 Menyimpan object ke database..............................................................................79 Mengambil data dari database................................................................................80 Membuat skema database.......................................................................................81 Membuat CategoryDao..........................................................................................81 Menggunakan EntityManager................................................................................82 Client Code.............................................................................................................82 Pemetaan Relasi..........................................................................................................83 Pertimbangan dalam pemetaan...................................................................................85 Kasta.......................................................................................................................86
HALAMAN IV
Navigasi..................................................................................................................89 Jenis Collection......................................................................................................90 Optionality..............................................................................................................91 Transitive Persistence ............................................................................................92 Enum Type..................................................................................................................93 Value Type..................................................................................................................94 One to One .................................................................................................................95 Many to One................................................................................................................95 One to Many ...............................................................................................................96 List dengan order by...............................................................................................96 Many to Many ............................................................................................................99 Parent-Child..............................................................................................................100 Mengambil Objek dari Database...............................................................................101 JPA Query Language (JPAQL).................................................................................101 Query Sederhana..................................................................................................101 Pagination.............................................................................................................102 Parameter Binding................................................................................................102 Named Query.......................................................................................................103 Restriction............................................................................................................104 Query untuk Collection........................................................................................106 Projection ............................................................................................................106 Join ......................................................................................................................106 Report Query........................................................................................................107 Subquery...............................................................................................................107 Native SQL...............................................................................................................108 Jasper Report.................................................................................................................109 Pengenalan................................................................................................................109 Instalasi ....................................................................................................................109 Alur Proses JasperReport..........................................................................................110 Istilah Umum dalam JasperReport............................................................................110 iReport sebagai Visual Designer ..............................................................................111 Konfigurasi Koneksi Database dalam iReport..........................................................112
HALAMAN V
Menampilkan Data dalam Report.............................................................................113 Kompilasi Report dengan Ant...................................................................................114 Integrasi JasperReport dengan Swing.......................................................................116 Menampilkan Report Menggunakan DataSource.....................................................117 Mengirim Parameter.................................................................................................120 Menggunakan Scriptlet.............................................................................................120 Penutup..........................................................................................................................122 Referensi dan Bacaan Lebih Lanjut...............................................................................123
HALAMAN VI
Feature JFC
Fitur-fitur yang dipunyai oleh JFC Fitur Komponen Swing Deskripsi Memuat semua class-class yang dibutuhkan untuk membuat aplikasi berbasis G !" dari tombol" table" tab" menu" toolbar dan sebagainya
#ook and Memberikan kemampuan kepada program Ja&a yang Feel $#aF% dikembangkan menggunakan library swing untuk memilih tema tampilan' Misalnya sebuah program yang sama dapat mempunyai tampilan windows #aF atau Ja&a #aF" atau #aF lain yang dikembangkan oleh komunitas seperti JGoodies' (ccessibility ()! Faslititas untuk mengembangkan aplikasi bagi penyandang cacat" misalnya dukungan untuk membuat huruf braile" kemampuan mengambil input dari layar sentuh dan sebagainya' +erisi kumpulan class-class yang dapat digunakan untuk memanipulasi ob,ect-ob,ect * dimensi" sperti garis" kotak" lingkaran" kur&a dan lain sebagainya' Selain itu Ja&a *D ()! ,uga memberikan kemampuan program yang ditulis menggunakan Ja&a untuk mencetak output ke alat pencetak seperti printer' Menyediakan kemampuan drag-and-drop antara program Ja&a dan program lain yang ditulis spesifik untuk suatu platform sistem operasi tertentu'
Ja&a *D ()!
Drag-anddrop
HALAMAN
2 | JAVA SWING
!nternational Membantu pengembang perangkat lunak untuk i-ation $i./n% membangun aplikasi yang dapat mendukung semua bahasa dan huruf yang ada di dunia' )a!el Feature JFC *odul ini akan !erkonsentrasi untuk mem!ahas komponen swin . +emilihan komponen dan li!rary swin yan tepat dapat mempen aruhi kualitas pro ram yan kita !uat secara si nifikan. ,al ini dikarenakan& dalam dunia Java %tandard -dition& le!ih spesifik la i aplikasi Java yan di!an un men unakan swin & !elum ada framework yan !enar-!enar komprehensif mem!im!in pen em!an untuk mem!uat aplikasi yan !erkualitas. +ada umumnya aplikasi yan dikem!an kan den an %win mempunyai kode yan san at .kotor.& dimana kode yan !erisi pen endalian terhadap event komponen swin !ercampur aduk den an kode yan !erisi aturan !isnis dan kode yan !erisi manipulasi terhadap data.
Swing Package
%win /+$ san at !a us dan len kap& Java 0.1 menyertakan setidaknya tu'uh !elas (23) !uah packa e yan !erisi class-class swin yan siap di unakan.
,a&a0'accessibility ,a&a0'swing ,a&a0'swing'border ,a&a0'swing'colorchooser ,a&a0'swing'e&ent ,a&a0'swing'filechooser ,a&a0'swing'plaf ,a&a0'swing'plaf'basic ,a&a0'swing'te0t ,a&a0'swing'te0t'html
#tun nya kita tidak akan men unakan semua class-class dalam packa e swin & hanya se!a ian kecil sa'a dari class-class terse!ut yan nantinya akan !enar-!enar kita unakan. %ehin a kita !isa !erkonsentrasi untuk memahami !e!erapa komponen pentin sa'a. (alam modul ini nanti kita hanya akan men unakan !e!erapa class komponen swin yan pentin sa'a. 4e!erapa kelas ini sudah cukup se!a ai !ahan pemem!uat peran kat lunak !erkualitas. 5omunitas Java 'u a menyediakan !anyak sekali li!rary swin & antara lain dari %win 6 dan J"oodies yan men em!an kan
Swing HelloWorld
*en unakan contoh lan sun adalah cara yan tepat untuk memulai proses !ela'ar. Cara ini mem!erikan am!aran kon krit tentan su!'ect yan akan dipela'ari& sehin a proses !ela'ar le!ih cepat diserap. #ntuk tu'uan ini& kita akan mem!uat se!uah pro ram kecil yan menampilkan kata 8,ello9orld: men unakan komponen swin . 4erikut ini adalah lan kah-lan kah yan harus anda lakukan untuk mem!uat pro ram 8,ello9orld: !er!asis komponen swin : 2. ;. <. =. $nstall Java (evelopment 5it (J(5) *em!uat pro ram ,ello9orld itu sendiri *elakukan kompilasi pro ram ,ello9orld *en'alankan pro ram ,ello9orld
HALAMAN
4 | JAVA SWING
+ro ram Java den an tampilan seperti di atas dapat di!uat den an dua cara. Cara yan pertama adalah den an men unakan te6t editor dan men etik kode pro ram. Cara yan kedua adalah den an men unakan 7et!eans *atisse "#$ 4uilder. ?akukan lan kah-lan kah !erikut ini diatas men unakan te6t editor: 2. ;. 4uka te6t editor kesayan an anda. untuk mem!uat pro ram
5etikkan kode pro ram di !awah ini dan simpan den an nama file ,ello9orld.'ava : public class HelloWorld { public HelloWorld(){ } public void display(){ JFrame.setDefaultLookAndFeelDecorated(true); JLabel label = new JLabel("HelloWorld"); JFrame frame = new JFrame(); frame.getContentPane().add(label); frame.setVisible(true); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] str){ HelloWorld hello = new HelloWorld(); hello.display(); } }
)ampilan 7et!eans akan !er anti den an tampilan "#$ !uilder& dimana di sisi kanan akan terlihat %win +allet. 5lik item ?a!el di %win +allet kemudian klik di atas JFrame& se!uah J?a!el akan di!uat.
HALAMAN
6 | JAVA SWING
Jendela (esi n dan +allete 7et!eans *atisse @. #ntuk memenuhi tu'uan kita mem!uat %win ,ello9orld& kita akan memasukkan strin 8,ello9orld: ke dalam J?a!el yan !aru sa'a kita !uat. Caranya& do!el klik di atas J?a!el terse!ut& kursor muncul !ersama te6t field dan ketikkan 8,elloworld:. 5lik kanan di file ,ello9orld.'ava pada 'endela e6plorer di se!elah kiri& pilih menu Run File... untuk men compile dan men'alankan class ,ello9orld.'ava atau tekan tom!ol %,$F) A F0.
0.
*atisse mempunyai sistem ?ayoutin yan san at fleksi!le& sistem layout yan di unakan oleh *atisse adalah "roup?ayout. (alam chapter !erikutnya kita akan !ela'ar !a aimana men unakan "roup?ayout ini den an !enar dan memanfaatkan keun ulanya dalam menata component "#$ den an san at rapi. %win helloworld ini hanya se!a ian kecil sa'a dari peker'aan yan harus dilakukan dalam mem!an un aplikasi desktop !er!asis Java. %elan'utnya kita akan mem!ahas pen unaan J?a!el& J4utton& JCheck4o6& J)e6tField dan JBadio4utton untuk mem!uat aplikasi "#$ sederhana den an men unakan *atisse.
Komponen Swing
%win toolkit menyediakan !anyak sekali komponen untuk mem!an un aplikasi "#$ desktop. %win toolkit 'u a menyediakan class-class untuk menan ani interaksi antara aplikasi dan user men unakan standard input seperti key!oard dan mouse. 5omponen-komponen yan disediakan swin mencakup semua "#$ toolkit yan laCim di unakan dalam apilasi desktop& seperti : J)a!el& J?ist& J)ree& J4utton& J?a!el dan masih !anyak komponenkomponen lainnya yan sudah teru'i dan siap pakai. %elain komponen "#$& swin 'u a menyediakan fasilitas untuk proses undo& komponen untuk men olah te6t& internationaliCation& 5omponen "#$ yan mendukun penyandan cacat (accessi!ility support) dan fasilitas dra -and-drop. ?ook and Feel merupakan fasilitas yan unik dalam swin . (en an fasilitas ?ook and Feel ini kita !isa den an mudah meru!ah tampilan dari pro ram kita sesuai den an kein inan dan tu'uan kita. *isalnya& a ar pro ram terlihat fancy atau a ar pro ram terlihat konsisten dalam se ala keadaan. %win 'u a menyediakan li!rary Java ;( untuk pen olahan data secara visual& seperti men olah am!ar& o!'ect ;(& !ahkan animasi. %win ?a!s.or menyediakan li!ary %win +ainter yan merupakan pen em!an an dari Java ;(& %win +ainter ini memun kinkan aplikasi swin mempunyai tampilan yan indah dan terlihat profesional. Java 0.1 menam!ahkan !anyak sekali fitur-fitur !aru ke dalam packa e swin & termasuk dukun an untuk li!rary Dpen"? men unakan JD"?& )ray $con dan 9e! %ervice. (en an adanya dukun an ini swin men'adi le!ih poweful dan mempunyai masa depan yan cerah.
HALAMAN
8 | JAVA SWING
"#$ toolkit !aru dari nol. 5omponen /9) diletakkan dalam satu packa e yaitu 'ava.awt& didalamnya terdapat komponen-komponen "#$ dasar& salah satunya adalah Component. Class Component adalah moyan dari se!a ian !esar komponen /9) maupun %win . Check4o6& ?a!el& 4utton dan !e!erapa komponen /9) lainnya adalah turunan lan sun dari class Component. 7amun dalam kenyataanya arsitektur demikian tidak mem!erikan fleksi!ilitas yan cukup memadai untuk mem!uat !er!a ai macam komponen !aru yan di!utuhkan dalam desktop application. %win muncul den an mem!awa teknolo i /9) yan telah ditam!ahkan den an !anyak kemampuan. 7yaris semua komponen "#$ dari swin merupakan turunan class Container dan class Container adalah turunan dari class Component.
penting
Jendela Design menampilkan visualisasi komponen G I! Jendela Sour"e menampilkan kode program dari "lass #ang sedang dibuka! Jendela Sw ing $allete berisikan komponen% komponen sw ing #ang bisa kita drag%and%drop ke dalam jendela design!
Jendela dialo new file <. +ilih kate ori : Java GUI Forms > JFrame Form %eperti terlihat di dialo 7ew File dialo nama +en'umlahan.'ava =. diatas& kemudian !eri
Jendela $roperties digunakan untuk mengedit properti dari komponen #ang sedang akti& dalam jendela design! Jendela Inspe"tor menampilkan semua komponen sw ing dalam "lass #ang sedang akti& baik #ang keli'atan se"ara visual di jendela design atau tidak!
4uat tampilan form seperti am!ar !awah ini& caranya den an klik Jendela +allete di se!alah kanan untuk memilih komponen apa yan akan di!uat& kemudian klik di 'endela (esi n untuk menempatkan komponen yan sudah dipilih tadi ke dalam form. ,asilnya terlihat seperti pada am!ar di !awah ini: Jendela desi n 7et!ens *atisse "anti nama setiap komponen a ar mudah dikenali. 5lik kanan diatas setiap komponen yan ada dalam Jendela (esi n diatas& kemudian pilih menu :
@.
HALAMAN
10 | JAVA SWING
Klik kanan > Change Variable Name ... "anti nama komponen-komponen terse!ut (sesuai urutan dari kiri ke kanan& atas ke !awah) men'adi : l!l5eteran an& t6t/& l!l+lus& t6t4& !tn,itun & l!l,asil. 0. *enam!ahkan varia!le untuk menampun nilai yan akan di'umlahkan. 5lik tom!ol %ource untuk mem!uka 'endela yan menampilkan kode sum!er dari pro ram di atas kemudian tam!ahkan kode di !awah ini tepat di!awah definisi dari class +en'umlahan: private String str = "Hasilnya adalah : "; private int a, b; *enan ani penekanan tom!ol !tn,itun . 5lik kanan diatas komponen !tn,itun kemudian pilih menu : Events > Action > actionPerformed /nda akan di!awa ke 'endela %ource& dan akan menemukan kode pro ram seperti di !awah ini :
3.
penting
J+abel dan J,e)tField mempun#ai met'od get,e)t dan set,e)t untuk mengambil dan mengeset te)t #ang ditampilkan!
Catatan :
%ekaran anda !isa melihat !ahwa !eker'a den an J?a!el& J)e6tField dan J4utton san at sederhana. #ntuk latihan& silahkan ru!ah fun si yan di unakan dalam pro ram diatas& misalnya perkalian dua !ilan an atau pen uran an dua !ilan an.
penting
JC 'e"k(o) dan J*adio(utton sebaikn#a digunakan 'an#a jika item pili'an#a sedikit dan tidak bersi&at dinamis
HALAMAN
12 | JAVA SWING
merepresentasikan pilihan laki-laki dan JBadio4utton yan merepresentasikan pilihan perempuan dalam satu roup. Jika JBadio4utton tidak diletakkan dalam satu roup& maka pilihan lakilaki dan pilihan perempuan !isa dipilih !ersamaan. %tatus dari JBadio4utton dan JCheck4o6 dapat diketahui den an melihat nilai kem!alian dari method is%elected& 'ika dipilih maka nilai kem!alian method is%elected adalah !enar& dan false 'ika se!aliknya. %etiap JBadio4utton dan JCheck4o6 mempunyai te6t yan meneran kan pilihan yan diwakilinya. *ethod et)e6t dan set)e6t di unakan untuk memanipulasi te6t. (i!awah ini adalah contoh pro ram yan dan JBadio4utton. men unakan JCheck4o6
(i !a ian atas aplikasi ini& terdapat dua JBadio4utton untuk merepresentasikan pilihan tipe warna& transparan atau !erwarna. (i!awahnya terdapat pilihan warna yan dapat dipilih le!ih dari satu !uah men unakan JCheck4o6. #ntuk mem!uat pro ram diatas ikuti lan kah-lan kah !erikut ini: 2. 4uat class !aru !ertipe JFrame Form& kemudian !eri nama +ilihan.'ava ;. 4uat tampilan diatas men harus di!uat adalah : unakan *atisse. komponen yan : radio4erwarna dan
%atu o!'ect 4utton"roup : roup)ipe9arna. -mpat o!'ect JCheck4o6 : chk,i'au& chk4iru& chk*erah& chk5unin . %atu o!'ect J)e6t/rea : t6t9arna. %atu o!'ect J%croll+ane : scroll9arna
penting
J*adio(utton #ang mempun#ai group #ang sama- 'arus dimasukkan dalam sebua' obje"t (uttonGroup #ang sama!
HALAMAN
14 | JAVA SWING
JCheck4o6 yan statusnya terpilih. private void tampilkanWarna(){ StringBuffer warna = new StringBuffer(); if(chkBiru.isSelected()){ warna.append(chkBiru.getText() + " "); } if(chkHijau.isSelected()){ warna.append(chkHijau.getText() + " "); } if(chkKuning.isSelected()){ warna.append(chkKuning.getText() + " "); } if(chkMerah.isSelected()){ warna.append(chkMerah.getText() + " "); } txtWarna.setText(warna.toString()); } 0. *enan ani !erikut : event pemilihan JCheck4o6. Caranya se!a ai
penting
C lass String(u&&er sangat dianjurkan untuk digunakan sebagai "lass untuk memanipulasi String! $enggabungan string menggunakan operator . sangat tidak dianjurkanapalagi jika ukuran obje"t String%n#a suda' "ukup besar!
a) +ilih komponen chk,i'au di Jendela (esi n. !) 5lik kanan komponen chk,i'au untuk memunculkan conte6t (popup) menu. c) +ilih menu : Event > Action > actionPerformed d) /nda akan di!awa ke Jendela Code& kemudian dalam method chk,i'au/ction+erformed terse!ut pan il method tampilkan9arna. seperti di !awah ini : private void chkHijauActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: tampilkanWarna(); } ?akukan hal ini untuk semua JCheck4o6. 3. Compile dan 'alankan pro ram den an menekan tom!ol %,$F) A F0. Cara lain dalam menampilkan pilihan adalah den an men unakan J?ist dan JCom!o4o6. 5edua komponen ini mempunyai fleksi!ilitas yan le!ih tin i dan le!ih mudah di unakan 'ika o!'ect yan dimasukkan dalam pilihan le!ih kompleks. J?ist dan JCom!o4o6 !isa mempunyai Component-ditor a ar pilihan yan ditampilkan tidak hanya !erupa te6t& !isa !erupa warna atau icon. 4a ian !erikutnya akan mem!ahas !a aimana !eker'a men unakan J?ist
penting
JC ombo(o) dan J+ist digunakan jika item pili'an bersi&at dinamis! JC ombo(o) dapat mempun#ai bentuk #ang dapat diedit se'ingga user dapat memasukkan pili'an #ang tidak ada dalam da&tar! J+ist dapat menerima pili'an lebi' dari satu!
Contoh JCom!o4o6 J?ist memun kinkan multiple selection den an menekan tom!ol : %,$F) A ?eft Click atau C)B? A ?eft Click. 5emampuan ini mem!antu user 'ika harus melakukan multiple selection. JCom!o4o6 dan J?ist san at fleksi!el& kita dapat menam!ah dan men hapus item di dalamnya den an san at mudah. %ehin a cocok di unakan untuk merepresentasikan pilihan yan item pilihannya !ersifat dinamis. /plikasi di !awah ini adalah contoh pen J?ist. unaan JCom!o4o6 dan
4a ian pertama pro ram ini terdapat se!uah JCom!o4o6 dan J?a!el& setiap kali item di dalam JCom!o4o6 dipilih& J?a!el di se!elahnya akan menampilkan item yan dipilih terse!ut.
HALAMAN
16 | JAVA SWING
4a ian kedua pro ram ini terdapat se!uah J?ist dan J)e6t/rea. %etiap kali item-item di dalam J?ist dipilih& J)e6t/rea akan menampilkan item-item yan dipilih terse!ut dipisahkan den an koma (&). $kuti lan kah-lan kah !erikut ini untuk mem!uat pro ram di atas: 2. 4uatlah class JFrame ?ist/ndCom!o.'ava. Form !aru dan !eri nama
penting
Jendela $roperties tidak 'an#a berisi properties dari komponen sw ing #ang sedang akti& tetapi juga berisi ,ab /vents dan ,ab C ode! ,ab /vents digunakan untuk memasukkan kode #ang akan dieksekusi ketika event tertentu dikenakan ter'adap komponen sw ing! ,ab C ode digunakan untuk mende&inisikan kode apa #ang 'arus dieksekusi dalam kondisi tertentu- misaln#a setela' obje"t komponen sw ing diinisialisasi!
!) %atu !uah JCom!o4o6 : cm!+eker'aan c) %atu !uah J?ist : lst,o!!y d) %atu !uah Jte6t/rea : t6t+ilihan,o!!y <. *eru!ah isi JCom!o4o6. #ntuk meru!ah isi dari JCom!o4o6 dan J?ist kita akan men unakan Jendela +roperties& Jendela ini letaknya di se!elah kanan !awah& di!awah Jendela +allete dan akan muncul hanya 'ika 'endela (esi n yan dipilih.
Jendela +roperties +ilih komponen JCom!o4o6 di Jendela (esi n& Jendela +roperties akan menampilkan properties dari JCom!o4o6. +ada !a ian model di dalam Jendela +roperties masukkan item +ela'ar& *ahasiswa& +ro rammer& )echnical 9riter dan )ester. %etiap item dipisahkan den an koma (&). =. *eru!ah isi J?ist. +ilih J?ist di Jendela (esi n maka Jendela +roperties untuk J?ist akan muncul. (i !a ian model isikan item : *em!aca& Dlahra a& )rekkin & Codin & *enonton Film& 4ersepeda dan *en a'ar. %etiap item dipisahkan den an koma (&).
HALAMAN
18 | JAVA SWING
private void lstHobbyValueChanged( javax.swing.event.ListSelectionEvent evt) { // TODO add your handling code here: Object[] selectedItems = lstHobby.getSelectedValues(); if(selectedItems == null || selectedItems.length == 0) txtPilihanHobby.setText(""); else{ StringBuffer strValues = new StringBuffer(); for(Object item : selectedItems){ strValues.append(item.toString() + ", "); } txtPilihanHobby.setText( strValues.substring(0, strValues.length() 2)); } } Catatan :
penting
JMenu(ar dan J,ool(ar 'an#a bisa ditamba'kan ke dalam JFrame! JMenuItem adala' struktur terluar dari Menu #ang tidak bisa mempun#ai "'ild! J,ool(ar pada umumn#a menampung J(utton #ang diberi I"on dan mempun#ai ba"kground transparan!
Contoh pro ram den an *enu& +opup *enu dan )ool!ar #ntuk mem!uat pro ram seperti di atas& ada !e!erapa tahap yan perlu dilakukan. )ahap pertama adalah mem!uat *enu& yan kedua adalah mem!uat +opup *enu dan yan keti a adalah mem!uat )ool!ar.
Membuat Menu
4eker'a den an *enu dalam swin & antara lain : 2. ;. Java meli!atkan enam komponen semua menu& hanya !isa
J*enu : Class yan mempunyai child menu item. 4iasanya J*enu ini yan 'adi child lan sun den an J*enu4ar
HALAMAN
20 | JAVA SWING
<. J*enu$tem : #'un dari menu& disinilah o!'ect /ction diletakkan& sehin a ketika kita memilih J*enu$tem ada action tertentu yan di'alankan aplikasi. JCheck4o6*enu$tem : #'un le!ih mirip JCheck4o6. JBadio4utton*enu$tem : #'un le!ih mirip J4utton. dari menu& namun !entuknya dari menu& namun !entuknya
=. @. 0.
%etiap komponen menu mempunyai fun si dan ke unaan masin masin . Jika kita perhatikan& menu dalam aplikasi umumnya mempunyai shortcut untuk men akses menu tanpa men unakan !antuan mouse. *isalnya menu File !iasanya dapat diakses men unakan tom!ol /?) A F& menu Format dapat diakses den an /?) A D. Fasilitas shortcut menu ini dise!ut se!a ai 5ey!oard *nemonic. File mempunyai mnemonic F& Format mempunyai mnemonic o& dan seterusnya. +ada umumnya tampilan mnemonic dari se!uah menu diwakili den an huruf yan !er aris !awah.
penting
Jendela Inspe"tor akan memperli'atkan semua komponen sw ing baik #ang terli'at atau tidak terli'at dalam jendela design! Jendela Inspe"tor sangat berguna ketika kita bekerja dengan Menu! $roses penamba'anpengurangan dan pengaturan posisi menu semua dilaksanakan dari Jendela Inspe"tor
*atisse mempunyai fasilitas yan san at D5 untuk !eker'a den an *enu& fasilitas dra -and-dropnya mem!antu !anyak peker'aan mem!an un aplikasi !ar!asis "#$ secara si nifikan. (alam pro ram diatas kita akan mem!uat struktur menu se!a ai !erikut:
%truktur menu dari aplikasi $kuti lan kah-lan kah !erikut ini untuk mem!uat struktur menu seperti diatas: 2. ;. 4uat se!uah class JFrame dan !eri nama )ool!ar*enu.'ava *enam!ahkan J*enu4ar ke dalam JFrame. +ilih komponen
Jendela +roperties dari class J*enu $si properti te6t den an strin 8File:. 5emudian set isi properti mnemonic den an strin 8f:& hal ini akan menye!a!kan tampilanya menuFile men'adi File dan user dapat menekan tom!ol /?) A F untuk men aktifkan menu menuFile. =. *enam!ahkan J*enu$tem. ?an kah !erikutnya adalah menam!ahkan J*enu$tem ke dalam J*enu menuFile yan telah di!uat di lan kah se!elumnya. caranya& klik kanan di J*enu menuFile di Jendela $nspector& kemudian pilih menu : Add > JMenuItem )am!ahkan !erturut-turut menu7ew& menuDpen dan menu%ave. +ilih J*enu$tem dari Jendela $nspector& kemudian untuk masin -masin J*enu$tem set te6t dan mnemonic yan sesuai dari Jendela +roperties. @. *enam!ahkan J%eparator. (alam struktur menu yan !a us& menu yan mempunyai fun si serupa diletakkan dalam urutan !erderdekatan dan dipisahkan den an separator (pemisah). ?an kah menam!ahkan J%eparatortidak !er!eda den an lan kah menam!ahkan J*enu$tem& klik kanan di J*enu menuFile kemudian pilih menu:
HALAMAN
22 | JAVA SWING
Add > JSeparator 0. *enam!ahkan J*enu !aru ke akan !ertindak kanan di J*enu Add > JMenu J*enu. 4erikutnya kita akan menam!ahkan dalam J*enu menuFile. J*enu yan !aru ini se!a ai su! menu. Caranya 'u a sama : klik menuFile kemudian pilih menu : sesuai
4eri nama menu%ettin & set te6t dan mnemonic yan pada Jendela +roperties. 3.
*enam!ahkan JCheck4o6*enu$tem. +erilaku JCheck4o6*enu$tem tidak !er!eda 'auh den an JCheck4o6 !iasa& !edanya hanyalah JCheck4o6*enu$tem !erada dalam struktur menu. Cara menam!ahkan JCheck4o6*enu$tem sama den an komponen lain : klik kanan J*enu menu%ettin kemudian pilih menu : Add > JCheckBoxMenuItem 4eri nama chk?ine7um!er& set te6t dan mnemonic yan pada Jendela +roperties. sesuai
JCheck4o6*enu$tem sedikit sepesial di!andin kan den an J*enu$tem& karena JCheck4o6*enu$tem memiliki properties selected. +roperties selected ini di unakan untuk menentukan apakah JCheck4o6*enu$tem dalam keadaan terpilih atau tidak. E. *enam!ahkan JBadio4utton*enu$tem. (alam contoh ini kita akan mempunyai dua !uah JBadio4utton*enu$tem& radio4inary dan radio)e6t. 5eduanya di!uat den an lan kah yan sama den an komponen lain& klik kanan di J*enu menu%ettin & kemudian pilih menu : Add > JRadioButtonMenuItem %et te6t dan mnemonic yan sesuai dari Jendela +roperties. G. *enam!ahkan 4utton"roup. %eperti halnya JBadio4utton& JBadio4utton*enu$tem 'u a memerlukan 4utton"roup a ar hanya satu !uah JBadio4utton*enu$tem yan !isa dipilih. Cara menam!ahkan 4utton"roup san at mudah& klik item 4utton"roup dari Jendela +allete kemudian klik Jendela (esi n& maka otomatis 4utton"roup akan ditam!ahkan. "anti namanya men'adi roupDpen*ethod. (alam Jendela $nspector& 4utton"roup yan !aru di!uat tadi akan !erada dalam kate ori Dther Components& seperti terlihat dalam am!ar di !awah ini : H
4utton"roup !erada dalam kate ori Dther Components 21. *enam!ahkan JBadio4utton*enu$tem ke dalam 4utton"roup. +ilih masin -masin JBadio4utton*enu$tem dari Jendela $nspector& kemudian perahatikan Jendela +roperties dari JBadio4utton*enu$tem terse!ut& pada !a ian roup4utton pilih item roupDpen*ethod& seperti terlihat dalam am!ar di !awah ini :
+roperties dari JBadio4utton*enu$tem 22. Compile dan 'alankan class )ool!ar*enu.'ava. 5lik kanan class )ool!ar*enu dari Jendela (esi n kemudaian pilih menu Bun File atau tekan tom!ol %,$F) A F0. 4eker'a den an *enu men unakan *atisse san atlah menyenan kan dan produktif. ,al ini !er!eda sekali 'ika harus men etik satu demi satu kode untuk menyusun struktur menu seperti contoh pro ram diatas. *em!uat +opup *enu men unakan *atisse 'u a sama mudahnya. ,anya sa'a kita harus menentukan dimana dan den an
HALAMAN
24 | JAVA SWING
cara apa popup menu itu muncul& apakah den an penekanan tom!ol tertentu dari key!oard atau ketika tom!ol mouse ditekan.
Membuat ,oolbar
)ool!ar mem!erikan dimensi lain dalam men akses menu d!andin kan menu ataupun popup menu. +ada umumnya )ool!ar merupakan cara sin kat untuk men akses menu. *enu yan diwakili tool!ar adalah menu yan !ersifat umum dan tidak terikat pada konteks tertentu. 5e unaan lain dari tool!ar adalah mempercantik tampilan aplikasi& karena tool!ar !iasanya adalah tom!ol yan didekorasi den an
HALAMAN
26 | JAVA SWING
icon yan menarik. %elain itu tool!ar 'u a mem!erikan kesempatan kepada user untuk men kustomisasi tampilan dari aplikasi. 5arena layout tool!ar san at fleksi!el& user !isa memindah-mindahkan letak tool!ar di dalam aplikasi& di atas& di!awah atau disampin & atau !ahkan men am!an (floatin ) diatas 'endela yan sedan aktif. (alam contoh pro ram diatas kita akan mem!uat se!uah J)ool4ar den an dua !uah J4utton yan telah didekorasi den an icon cantik. $con yan di unakan !anyak tersedia di internet& format file yan dipilih adalah .pn & karena format file ini palin !a us dalam menan ani transparasi komponen. %e!elum mulai mem!uat J)ool4ar& kita perlu mempersiapkan terle!ih dahulu icon yan akan di unakan se!a ai dekorasi J4utton. $kuti lan kah-lan kah !erikut ini : 2. 4uatlah se!uah 'ava packa e !aru untuk menampun semua icon yan akan di unakan. caranya klik kanan di 'endela +ro'ects !a ian nama pro'ect& pilih menu : New > Java Package 4eri nama ima es untuk 'ava packa e yan !aru sa'a kita !uka. ;. *emasukkan $con ke dalam packa e. #ntuk memasukkan ima e ke dalam packa e kita perlu tahu dimana pro'ect disimpan& misalkan pro'ect disimpan dalam folder : c:\javaswing 4uka file e6plorer& kemudian navi asi ke folder c:\javaswing\src\images Copy semua icon yan diperlukan ke dalam folder diatas. <. 4uild pro'ect. ?an kah ini diperlukan untuk men compile semua file .'ava men'adi file .class. %elain itu proses ini 'u a akan men kopi file selain file .'ava (termasuk file icon) ke dalam folder !uildHclasses. Jika proses ini tidak dilaksanakan& maka ketika pro ram di'alankan& file icon tidak akan ditemukan dan pro ram men'adi error .
penting
(uild $roje"t akan ber'asil jika tidak ada satupun error dalam kode program! Sebelum melakukan build proje"t pastikan terlebi' da'ulu tidak ada error dalam kode! +akukan build setiap kali menamba'kan &ile non% java ke dalam &older sour"e &ile! 0gar &ile tersebut ikut ter"op# ke dalam &older build1"lasses
%etelah proses persiapan selesai& lakukan lan kah-lan kah !erikut ini untuk mem!uat )ool!ar : 2. 4uka class )ool!ar*enu.'ava yan se!elumnya. sudah di!uat di lan kah
;. 4uat se!uah o!'ect J)ool4ar& caranya : klik item J)ool4ar dari Jendela +allete& kemudian klik JFrame di Jendela (esi n. %ecara otomatis se!uah o!'ect J)ool4ar akan dimasukkan ke dalam JFrame. "anti namanya men'adi tool4ar.
Jendela +roperties J4utton a) )e6t& hapus nilai te6tnya. !) 4order& pilih !ordernya men'adi empty !order dan set nilai !ordernya men'adi I@&@&@&@J. )u'uan pem!erian empty !order ini a ar tom!ol !erukuran le!ih !esar di!andin kan den an icon yan akan di unakan nanti& dan setiap mouse melewati J4utton& ada efek transisi yan cantik. #ntuk men edit !order dari J4utton& *atisse menyediakan Jendela 4order untuk memilih !order yan kita in inkan untuk J!utton. 4order yan dipilih !isa sin le !order& atau composite !order yan terdiri dari !e!erapa !order.
HALAMAN
28 | JAVA SWING
Jendela 4order -ditor dari J4utton c) DpaKue& uncheck nilai opaKue. 4ertu'uan a ar tom!olnya !erwarna transparan& sehin a mempunyai warna !ack round yan sama den an !ack round J)ool4ar. d) $con& anti iconya den an icon yan telah disiapkan. #ntuk memasukkan icon ke dalam J4utton& tekan tom!ol di sampin pilihan $con di dalam Jendela +roperties& kemudian akan muncul (ialo $con -ditor seperti di !awah ini : Jendela icon editor +ilih radio !utton Classpath& kemudian tekan tom!ol %elect File dan pilih salah satu icon yan telah disiapkan. )ekan D5. ?akukan lan kah-lan kah yan sama terhadap J4utton yan lain. @. Compile dan hasilnya. 'alankan class )ool!ar*enu untuk melihat
HALAMAN
30 | JAVA SWING
ulan . %win menyediakan dialo yan didesi n untuk keperluan yan serin muncul dalam aplikasi& seperti JDption+ane dan JFileChooser. %win 'u a menyediakan class J(ialo 'ika kita in in mem!uat dialo custom sesuai kein inan kita.
)a!le method JDption+ane %win 'u a menyediakan method show$nternalLLL yan 'ika kita !eker'a den an J$nternalFrame. di unakan
+arameter dari keempat method terse!ut men ikuti pola yan konsisten. )erurut dari kiri ke kanan& !erikut ini parameterparameter yan !isa diterima oleh method-method dalam class JDption+ane: 2. parentComponent *endefisikan komponen yan akan men'adi parent dari dialo !o6 ini. Frame dari parent component terse!ut akan men'adi frame dari dialo dan dialo akan ditampilkan di ten ah-ten ah parent component. Jika nilai dari parentComponent diset null& maka dialo akan men unakan frame default dan dialo akan diletakkan diten ah-ten ah layar monitor (ter antun ?MF). ;. messa e +esan yan deskriptif meneran kan perihal dialo muncul. +ada umumnya messa e !erupa pesan %trin akan diletakkan dalam dialo & namun 'enis o!'ect lain dii'inkan di unakan se!a ai messa e. D!'ect-o!'ect yan yan 'u a yan
HALAMAN
32 | JAVA SWING
yan akan muncul sesuai ke!utuhan. @. options (eskripsi yan le!ih detail dari set tom!ol yan di unakan dialo . 7ilai yan laCim adalah se!uah array %trin !erisi te6t yan akan ditampilkan di setiap tom!ol. 7amun D!'ect lain 'u a dapat diterima& antara lain: a) Component Component akan diletakkan dalam !aris tom!ol secara lan sun . !) $con %e!uah J4utton akan di!uat dan didekorasi den an icon ini. c) other D!'ect den an tipe selainnya akan diru!ah ke dalam !entuk %trin den an men am!il nilai kem!alian dari method to%trin dari o!'ect terse!ut. 0. icon $con yan di unakan untuk mendekorasi dialo . Jika icon ini didefinisikan maka akan menimpa icon default yan didefinisikan oleh messa e)ype. 3. title Judul dari dialo dialo . E. initialFalue 7ilai default dari pilihan yan mun kin ada dalam dialo . #ntuk le!ih 'elasnya& !erikut ini !e!erapa contoh kode pen JDption+ane !eserta hasil tampilanya : JOptionPane.showMessageDialog(null, "Simple plain dialog","Plain dialig", JOptionPane.PLAIN_MESSAGE); unaan yan diletakkan di !a ian palin atas dari
)ampilan dialo den an tipe dialo $nformation JOptionPane.showMessageDialog(null, "You neet to be sure to do this action!", "Dialog Peringatan", JOptionPane.WARNING_MESSAGE);
(ialo den an tipe 9arnin JOptionPane.showMessageDialog(null, "Something goes wrong and generate error message", "Error Dialog", JOptionPane.ERROR_MESSAGE);
(ialo den an tipe -rror JOptionPane.showConfirmDialog(null, "Choose yes or no","Confirmation Dialog", JOptionPane.YES_NO_OPTION, JoptionPane.WARNING_MESSAGE);
HALAMAN
34 | JAVA SWING
Dption dialo den an tipe $nformation dan pilihan >-%N7D JOptionPane.showConfirmDialog(null, "Choose yes, no or cancel","Confirmation Dialog", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
$nput(ialo den an tipe messa e $nformation String[] options = {"Apple","Mango","Grape","Guava"}; JOptionPane.showInputDialog(null, "Choose this one Option","Input dialog", JOptionPane.WARNING_MESSAGE,null,options,"Apple");
$nput(ialo dialo den an tipe 9arnin & Dptions !erupa array of %trin dan initialFalue O ./pple.
unakan JFileChooser
)ampilan JFileChooser ketika tom!ol open ditekan adalah seperti di !awah ini :
)ampilan JFileChooser #ntuk mem!uat aplikasi diatas lakukan lan kah-lan kah !erikut ini : 2. ;. 4uat class JFrame Form !aru& !eri nama Chooser.'ava *asukkan dua !uah J)e6tField : t6tDpen dan t6t%ave& dua !uah
HALAMAN
36 | JAVA SWING
J!utton : !tnDpen dan !tn save& se!uah J?a!el : l!l%tatus. %esuaikan penataan komponen sesuai den an am!ar diatas. <. )am!ahkan se!uah o!'ect JFileChooser se!a ai field dari class Chooser& !eri nama chooser. public class Chooser{ JFileChooser chooser = new JFileChooser(); //kode lain di sini } File7ame-6tentionFilter di unakan se!a ai file filter dalam JFileChooser. *etode filterin nya adalah mencocokkan ekstensi file dalam file system den an ekstensi yan ada dalam File7ame-6tentionFilter. Contoh kode di !awah ini akan menye!a!kan JFileChooser mempunyai pilihan 8J+-" File:& dan 'ika pilihan terse!ut dipilih& maka file den an ekstensi 8'p :& 8'pe :&:J+": atau8J+-": sa'a yan akan ditampilkan oleh JFileChooser. FileNameExtensionFilter JPEGFilter = new FileNameExtensionFilter( "JPEG File","jpg","jpeg",JPG,JPEG); chooser.addChoosableFileFilter(JPEGFilter); %et direktori yan akan ditu'u oleh JFileChooser. #ntuk men etahui dimana direktori aktif aplikasi& kita !isa men unakan system property 8user.dir:. 5ode !erikut ini akan menye!a!kan JFileChooser di!uka pada direktori aktif aplikasi : String dir = System.getProperty("user.dir"); chooser.setCurrentDirectory(new File(dir)); *en handle event penekanan tom!ol !tn%ave. 5etika tom!ol !tn%ave ditekan& chooser akan menampilkan dialo save file& kemudian men am!il nama file yan dipilih dan menampilkannya dalam t6t%ave& serta menampilkanya dalam l!l%tatus. 4erikut ini kodenya :
=.
@.
0.
E.
4eker'a den an JDption+ane dan den an JFileChooser san at sederhana. 5eduanya men unakan modal dialo untuk men am!il input dari user. *odal dialo akan mence ah user men akses !a ian aplikasi lain se!elum dialo ditutup& atau dalam hal ini memutuskan pilihan apa yan diam!il oleh user. *asih !anyak la i komponen swin yan disediakan oleh J(5& anda tin al melan'utkan mem!aca dari referensi yan di!erikan modul ini pada !a ian akhir untuk melan'utkan pem!ela'aran anda tentan Java desktop.
HALAMAN
38 | JAVA SWING
Konsep M3C
*FC adalah arsitektur aplikasi yan memisahkan kode-kode aplikasi dalam ti a lapisan& *odel& Fiew dan Control. *FC termasuk dalam arsitektural desi n pattern yan men hendaki or anisasi kode yan terstruktur dan tidak !ercampur aduk. 5etika aplikasi sudah san at !esar dan menan ani struktur data yan kompleks& harus ada pemisahan yan 'elas antara domain model& komponen view dan kontroler yan men atur penampilan model dalam view. /rsitektur *FC ini memun kinkan adanya peru!ahan dalam domain model tanpa harus men u!ah code untuk menampilkan domain model terse!ut. ,al ini san at !ermanfaat ketika aplikasi mempunyai domain model dan view komponen san at !esar dan kompleks.
(ia ram interaksi antar komponen dalam arsitektur *FC (9ikipedia.or ) *odel adalah representasi dari o!'ect yan sedan diolah oleh aplikasi& dalam Java& model ini !iasanya direpresesentasikan se!a ai Java 4ean. Java 4ean adalah class Java !iasa atau +DJD (+lain Dld Java D!'ect). %yarat se!uah +DJD dian ap se!a ai Java 4ean adalah : 2. *empunyai constructor default& constructor yan tidak mempunyai parameter. ;. %emua field-field yan !isa diakses dilen kapi den an etter dan setter method. ?e!ih 'elasnya lihat kode dari class +erson di !awah ini :
HALAMAN
40 | JAVA SWING
?ist*odel yan meme an isi dari J?ist dan ?ist%election*odel untuk mencatat item J?ist yan sedan dipilih. +ada !anyak kasus normal kita tidak perlu pusin memikirkan model ini. %emisal kita tidak perlu memikirkan model dari J4utton karena pada kasus umum kita tidak perlu memodifikasi model dari J4utton. ?alu& kenapa model komponen swin di!uatR /lasan utamanya adalah fleksi!ilitas untuk menentukan !a aimana data disimpan dan diam!il dari komponen swin . *isalnya kita mempunyai aplikasi spreadsheet yan men unakan komponen J)a!le& karakteristik utama spreadsheet adalah !anyak cell yan koson & den an !e itu kita !isa memilih model data yan sesuai den an karakteristik terse!ut. Contoh lainnya adalah J)a!le yan di unakan untuk menampilkan data dari data!ase den an 'umlah !aris luar !iasa !anyak. 5ita !isa men atur a ar tampilan J)a!le di!uat halaman-per-halaman dalam menampilkan !aris data& tidak semua data ditampilkan dalam satu halaman& hal ini ditu'ukan untuk efisiensi dan mempertahankan a ar aplikasi tetap responsif walau !eker'a den an data yan !esar. *odel dalam komponen swin 'u a mempunyai keuntun an lain& yaitu tidak perlu ada dua data terpisah& untuk struktur data aplikasi dan untuk komponen swin . 5e unaan *odel yan cukup pentin 'u a adalah adanya konsep event-listener& dimana 'ika ter'adi event peru!ahan data dalam model& semua listener yan terdaftar dalam model terse!ut akan di!eritahu dan tindakan yan tepat dapat diam!il untuk menan ani event yan muncul. %e!a ai contoh& untuk menam!ahkan item dalam J?ist kita !isa meman il method add$tem dari J?$st. +enam!ahan item dalam J?ist ini akan men aki!atkan ?ist*odel memicu event dalam J?ist dan listener lainnya. 5omponen swin S dalam hal ini J?istSakan diupdate tampilanya untuk merefleksikan peru!ahan item dalam ?ist*odel. 9alaupun terkadan !anyak yan menye!ut arsetektur komponen swin se!a ai *FC& tetapi pada dasarnya arsitektur komponen swin tidak sepenuhnya *FC. 5omponen swin secara umum di!uat a ar Fiew dan Controller diletakkan dalam satu tempat (class) yaitu class #$ yan disediakan oleh ?ook-and-Feel. /rsitektur komponen swin le!ih tepat dise!ut se!a ai 8/rsitektur den an *odel yan terpisah:. %elan'utnya kita akan mem!ahas !e!erapa model yan serin kali harus kita kustomisasi sesuai den an ke!utuhan. %edan kan model yan nyaris tidak pernah kita ru!ahS4utton*odelStidak di!ahas dalam !a ian ini.
TableModel
)a!le*odel adalah class model yan palin serin dikustomisasi. 5arakteristik data dari J)a!le yan !er!entuk koleksi data dua dimensi mem!utuhkan perhatian khusus a ar efisien di unakan dalam aplikasi. Jika kita tidak hati-hati& maka aplikasi kita !isa men'adi san at lam!at dan tidak efisien. )a!le*odel adalah interface yan di unakan oleh J)a!le untuk mendefinisikan ciri-ciri dari data ta!ular yan akan ditampilkan oleh J)a!le. *isalnya : 'umlah kolom& nama kolom& class dari o!'ect dalam kolom& 'umlah !aris dan nilai setiap cell. (en an adanya data-data ini J)a!le dapat secara efisien menentukan !a aimana menampilkan data terse!ut. 4erikut ini adalah kode untuk menampilkan koleksi o!'ect +erson. Class /rray?istT+ersonU adalah implementasi dari enerics& konsep dalam Java yan di unakan untuk mendefinisikan isi dari koleksi. /rray?istT+ersonU artinya adalah mem!uat se!uah o!'ect koleksi /rray?ist yan harus diisi oleh o!'ect +erson dan tidak !isa diisi oleh o!'ect lainya& misalnya %trin . public class PersonTableModel extends AbstractTableModel{ private List<Person> persons; public PersonTableModel(List<Person> persons) { this.persons = persons; } public int getRowCount() { return persons.size(); } public int getColumnCount() { return 3; } public Object getValueAt(int rowIndex, int columnIndex) { Person p = persons.get(rowIndex); switch(columnIndex){ case 0 : return p.getId(); case 1 : return p.getName(); case 2 : return p.getEmail(); default : return ""; } }
HALAMAN
42 | JAVA SWING
@Override public String getColumnName(int column) { switch(column){ case 0 : return "ID"; case 1 : return "NAME"; case 2 : return "EMAIL"; default : return ""; } }
>an perlu diperhatikan !ahwa dalam /!strac)a!le*odel& method isCell-dita!le selalu men em!alikan nilai false& artinya semua cell tidak dapat diedit. 5emudian method setFalue/t adalah method koson !elaka& artinya 'ika kita meman il method ini tidak akan ter'adi apa-apa. Class kedua adalah (efault)a!le*odel yan telah men implementasi semua method a!stract dari interface )a!le*odel. Bepresentasi data (efault)a!le*odel men unakan dua 'enis data ta!ular& yaitu array dua dimensi& D!'ectIJIJ& dan Fector dari Fector& FectorTFectorTD!'ectUU. Jika kita mempunyai struktur data selain kedua 'enis terse!ut kita harus melakukan konversi data ke dalam salah satu !entuk struktur data terse!ut. Cara yan le!ih cerdas adalah mendefinisikan sendiri class yan men implement interface )a!le*odel seperti class Customer)a!le*odel diatas. %etelah )a!le*odel selesai didefinisikan kita tin al meman il method set)a!le*odel dari o!'ect J)a!le& atau mem!uat o!'ect J)a!le !aru men unakan constructor yan menerima ar umen )a!le*odel. Contohnya seperti poton an kode di !awah ini : JTable table = new JTable(new DefaultTableModel()); JTable table1 = new JTable(); table1.setModel(new DefaultTableModel());
ListModel
J?ist adalah komponen swin yan mempunyai dua model sekali us& ?ist*odel dan ?ist%election*odel. ?ist*odel di unakan untuk mendefinisikan item/element yan dikandun oleh J?ist. %edan kan ?ist%election*odel di unakan untuk mendefinisikan !a aimana representasi data 'ika ter'adi proses pemilihan di J?ist. %eperti halnya )a!le*odel& ?ist*odel mempunyai dua class yan men implement ?ist*odel& /!stract?ist*odel dan (efault?ist*odel. 5ita !isa men unakan salah satu dari ti a tipe
HALAMAN
44 | JAVA SWING
Menangani /vent
-vent dan ?istener adalah implementasi dari pattern D!server dalam Java. +attern D!server san at !er una di unakan untuk mendesi n komunikasi yan konsisten antara o!'ect yan !erdiri sendiri dan o!'ect-o!'ect yan !er antun padanya. D!server desi n pattern meli!atkan dua o!'ect utama& o!'ect pertama !erlaku se! ai %u!'ect dan o!'ect lainya !erlaku se!a ai D!server. D!'ect %u!'ect merupakan pusat perhatian dari o!'ect D!server& peru!ahan keadaan dari o!'ect %u!'ect selalu dipantau oleh D!server. D!server dapat melakukan re ister-unre ister terhadap %u!'ect. Jika D!server tertarik den an perilaku dan keadaan dari %u!'ect& D!server dapat mere ister dirinya kepada %u!'ect. 4e itu 'u a se!aliknya 'ika D!server tidak tertarik terhadap keadaan atau perilaku %u!'ect& D!server tidak perlu melakukan res istrasi atau kalau sudah terlan'ur re uister dapat melakukan unre ister. %u!'ect mempunyai !anyak aspek perilaku dan keadaan yan dapat dipantau oleh D!server. #ntuk setiap aspek& %u!'ect menyediakan method untuk re ister-unre ister dan menyediakan interface yan harus diimplement oleh D!server yan in in memantau aspek terse!ut. +ada satu titik tertentu& %u!'ect akan mem!eritahu (notify) D!server tentan perilaku atau keadaanya. %u!'ect akan men umpulkan informasi tentan keadaan atau perilakunya kemudian men irimkan pesan kepada D!server lewat interface yan telah disepakati keduanya& pola ini dikenal 'u a se! ai -vent+assin . +attern D!server dimaksudkan untuk men uran i keter antun an satu o!'ect terhadap o!'ect lain& istilah kerennya adalah (ecouplin . (en an mekanisme re ister-unre ister& D!server dapat secara le!ih leluasa memutuskan untuk memantau %u!'ect tertentu atau tidak. *ekanisme notify memudahkan %u!'ect mem!eritahu keadaan dan perilakunya kepada D!server yan sedan memantaunya. (i !a ian !erikutnya kita akan melihat !a aimana pattern D!server diimplementasikan dalam swin . /kan di'elaskan pula !a aimana swin men implementasikan mekanisme re isterunre ister dan notify dalam menan ani interaksi user terhadap komponen swin .
HALAMAN
46 | JAVA SWING
2. Constructor yan menerima parameter %trin & parameter ini di unakan se!a ai pen enal (name) dari o!'ect %u!'ect. ;. Be ister-unre ister D!server (re ister?istener& remove?istener) <. *ethod private untuk menotify D!server (tri er?istener) =. *ethod untuk menerima input kata dari user (run+ro ram) 4erikut ini kode len kapnya : public class Subject { private Set<KeyboardPressedListener> listeners = new HashSet<KeyboardPressedListener>(); private String wordEntered; private String name; public Subject(String subjectName){ name = subjectName; } public void runProgram(){ while(true){ Console c = System.console(); wordEntered = c.readLine("type a word : "); if(wordEntered.equals("exit")) break; else triggerListener(); } } private void triggerListener(){ KeyboardPressedEvent event = new KeyboardPressedEvent(); event.setSource(this); event.setWord(wordEntered); for(KeyboardPressedListener l : listeners){ l.keyPressed(event); } } public void registerObserver( KeyboardPressedListener l){ listeners.add(l); } public void removeObserver( KeyboardPressedListener l){ listeners.remove(l); } public String toString(){ return name; } } $nterface 5ey!oard+ressed?istener di unakan se!a ai 8kontrak: antara %u!'ect dan D!server. $nterface ini men'amin !ahwa D!server yan akan memantau event pemasukan kata dari user dalam %u!'ect mempunyai method key+ressed. *ethod key+ressed
HALAMAN
48 | JAVA SWING
public class MainClass { public static void main(String[] str){ Subject subject = new Subject("subject observed"); Observer observer = new Observer("first observer"); subject.registerObserver(observer); subject.runProgram(); } } ?an kah-lan kah adalah : dalam men unakan pattern D!server ini
2. *em!uat o!'ect su!'ect dari class %u!'ect Subject subject = new Subject("subject observed"); ;. *em!uat o!'ect o!server dari class D!server Observer observer = new Observer("first observer"); <. (aftarkan o!'ect o!server ke o!'ect su!'ect subject.registerObserver(observer); =. Jalankan pro ram utamanya subject.runProgram(); +attern D!server ini di unakan secara intensif dalam komponen swin . )erutama untuk menan an i event dari input peripheralS key!oard& mouse& !arcode readerSyan ter'adi di komponen swin SJ)e6tField& J4utton& J)a!leS. (alam !a ian-!a ian selan'utnya kita akan !ela'ar !a aimana menan ani event pada komponen swin .
ActionListener
/ction?istener di unakan untuk menden arkan action dari event : 5lik terhadap J4utton +emilihan menu item +enekanan tom!ol enter dalam J)e6tField
*ethod dalam /ction?istener hanya satu yaitu action+erformed yan menerima ar umen o!'ect /ction-vent. /ction-vent !erisi informasi-informasi pentin ketika /ction event ter'adi& termasuk tom!ol modifiers apa yan sedan ditekan. )om!ol modifiers antara lain : C)B?& /?)& *-)/ dan %,$F). *ethod untuk menentukan tom!ol modifiers apa yan sedan aktif adalah
Contoh aplikasi sederhana yan menan ani event action-vent pada J4utton *enan ani klik mouse pada J4utton dalam 7et!eans cukup den an memilih J4utton di Jendela (esi n kemudian klik kanan dan pilih menu : Events > Action > ActionPerformed %etelah itu anda akan di!awa ke 'endela kode dan !aris !erikut ini akan di!uat secara otomatis oleh 7et!eans : private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { } 5emudian kita akan menempatkan kode untuk menan ani penekanan tom!ol di !a ian !awah !aris //)D(D. %e!enarnya 7et!eans men- enerate !e!erapa la i kode di !a ian yan tidak dapat diedit& !erikut ini cuplikanya : btnHitung.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt){ btnHitungActionPerformed(evt); } }); *ethod add/ction?isterner ini mempunyai fun si yan sama den an method re ister?istener pada class %u!'ect yan kita !ahas di !a ian se!elumnya. add/ction?isterner !erfun si untuk mendaftarkan D!server ke %u!'ect. +er!edaan ter!esar disini adalah 7et!eans tidak mem!uat pu!lic class D!server !aru untuk men implementasi interface /ction?istener. )etapi 7et!eans mem!uat anonymous innerclass yan men implement interface /ction?istener. +erhatikan petikan kode !erikut ini :
HALAMAN
50 | JAVA SWING
new ActionListener() { public void actionPerformed(ActionEvent evt){ btnHitungActionPerformed(evt); } >an dilakukan oleh kode diatas se!enarnya adalah: 2. *em!uat Class !aru yan tidak punya nama (anonymous) ;. Class !aru terse!ut turunan dari D!'ect dan men implement interface /ction?istener <. *en implementasi method a!strac action+erformed =. *ethod action+erformed dari class tak !ernama ini akan meman il method !tn,itun /ction+erformed dari class parentnya. %ecara umum 7et!eans akan mem!uat se!uah anonymous innerclass seperti diatas untuk setiap penan anan event. (ari sisi kerapian kode metode ini san at !a us& karena 7et!eans menyem!unyikan kerumitan kode untuk menan ani event seperti diatas. 5ita tidak perlu susah-susah mem!uat se!uah pu!lic class D!server tersendiri untuk menan ani event. Cukup den an anonymous innerclass.
KeyListener
5ey?istener akan menden arkan penekanan tom!ol oleh komponen yan !erada dalam keadaan fokus. %emua komponen swin dapat menerima 5ey?istener se!a ai D!server. 5ey?istener dapat menden arkan ti a event !er!eda : penekanan tom!ol& pelepasan tom!ol dan pen etikan tom!ol. 5eti anya ditan ani oleh method yan !er!eda-!eda& yaitu : key+ressed : dipan il ketika ter'adi penekanan tom!ol key!oard. keyBeleased : dipan il ketika tom!ol key!oard dilepaskan. key)yped : dipan il ketika tom!ol diketikkan& alias ditekan kemudian dilepaskan. *ethod ini dipan il 'ika tom!ol yan ditekan mempunyai representasi karakter unicode& seperti tom!ol an ka dan tom!ol huruf. %edan kan penekanan tom!ol modifiers seperti /?)& C)B?& /BBD9& C/+%?DC5& 7#*?DC5& $7% dan lainnya tidak akan men aki!atkan method ini dipan il. 5eti a method diatas menerima parameter 5ey-vent. #ntuk men etes tom!ol apakah yan ditekan oleh user& di unakan method et5eyCode. 5emudian hasil kem!alian method et5eyCode di!andin kan den an field static kepunyaan class 5ey-vent yan diawali den an huruf F5& seperti : F5N-7)-B& F5N/& F5N4& F5N2& F5N?-F)N/BBD9 dan seterusnya.
/plikasi sederhana yan menan ani penekanan tom!ol key!oard #ntuk mem!uat aplikasi yan menden arkan penekanan tom!ol key!oard seperti diatas lakukan lan kah-lan kah !erikut ini : 2. ;. <. =. 4uat class JFrame !aru& !eri nama Frame5ey+ressed. )am!ahkan dua l!l5ey)yped. !uah J?a!el& !eri nama l!l%tatus dan event
l!l%tatus di unakan untuk menandakan adanya key+ressed dan keyBeleased yan ter'adi !erurutan
@. +ilih JFrame di Jendela (esi n& klik kanan& dan pilih menu : Events > Key > keyPressed 0. Jendela Code akan ter!uka& modifikasi method form5ey+ressed men'adi seperti !erikut ini : private void formKeyPressed(KeyEvent evt) { // TODO add your handling code here: if(evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED) lblStatus.setText( "Anda menekan tombol : CHAR_UNDEFINED"); else lblStatus.setText("Anda menekan tombol : " + evt.getKeyChar()); } 3. +ilih JFrame di Jendela (esi n& klik kanan& dan pilih menu :
HALAMAN
52 | JAVA SWING
Events > Key > keyReleased E. Jendela Code akan ter!uka& modfikasi method form5eyBeleased men'adi seperti !erikut ini : private void formKeyReleased(KeyEvent evt) { // TODO add your handling code here: if(evt.getKeyChar() == KeyEvent.CHAR_UNDEFINED) lblStatus.setText( "Anda melepaskan tombol : CHAR_UNDEFINED"); else lblStatus.setText("Anda melepaskan tombol : " + evt.getKeyChar()); }
G. +ilih JFrame di Jendela (esi n& klik kanan& dan pilih menu : Events > Key > keyTyped 21. Jendela Code akan ter!uka& modfikasi method form5ey)yped men'adi seperti !erikut ini : private void formKeyTyped(KeyEvent evt) { // TODO add your handling code here: lblKeyType.setText("Anda mengetikkan tombol : " + evt.getKeyChar()); }
Contoh aplikasi sederhana yan men ani *ouse-vent ?akukan lan kah-lan kah !erikut ini untuk mem!uat aplikasi seperti diatas :
HALAMAN
54 | JAVA SWING
2. ;. <. 4uat class JFrame !aru& !eri nama Frame*ouse*otion. ?etakkan se!uah J?a!el !aru& !eri nama l!l%tatus. +ilih JFrame di Jendela (esi ner& klik kanan dan pilih menu : Set Layout > Null Layout ?an kah ini !ertu'uan untuk mem!uat a ar JFrame men unakan null layout. 5alau tidak men unakan null layout kita tidak !isa meletakkan J?a!el pada sem!aran posisi. =. @. +ilih kem!ali JFrame& klik kanan dan pilih menu Events > Mouse > mouseClicked
modifikasi kode pada Jendela Code yan tampil men'adi seperti di !awah ini : private void formMouseClicked(MouseEvent evt) { lblStatus.setText("clicked at (" + evt.getX() + "," + evt.getY() + ")"); lblStatus.setLocation(evt.getX(),evt.getY()); } 5ode diatas menan ani penekanan tom!ol mouse& kemudian men u!ah te6t J?a!el dan memindahkan J?a!el ke posisi dimana event mouseClicked ter'adi.
0. 3.
+ilih JFrame la i di Jendela (esi n& klik kanan dan pilih menu : Events > MouseMotion > mouseMoved
*odifikasi kode yan muncul pada Jendela Code men'adi seperti di !awah ini : private void formMouseMoved(MouseEvent evt) { lblStatus.setText("(" + evt.getX() + "," + evt.getY() + ")"); lblStatus.setLocation(evt.getX(),evt.getY()); } Compile dan 'alankan aplikasi di atas.
E.
*asih !anyak la i -vent-?istener yan disediakan oleh J(5. (ari !a! di atas kita sudah dapat men erti den an !aik konsep -vent?istener dan pattern D!server yan mendasarinya. (en an kemampuan ini kita !isa den an mudah men erti !a aimana event-listener yan lain !eker'a. -vent-?istener 'u a dapat di'alankan terhadap Java 4ean men unakan +ropertyChan e?istener dan +roperty-vent. 5onsep ini dapat di unakan untuk men amati peru!ahan pada field Java 4ean.
HALAMAN
56 | JAVA SWING
4ri e ini menyediakan fasilitas J(4C untuk melakukan koneksi ke sum!er data men unakan D(4C (Dpen (ata4ase Connectivity) driver. %e!a ai catatan& anda perlu meload driver D(4C di setiap komputer client untuk dapat men unakan !rid e ini. %e!a ai konsekuensinya& cara ini hanya cocok dilakukan di lin kun an intranet dimana isu instalasi tidak men'adi masalah. (en an keempat komponen yan dipunyainya& J(4C men'adi tools yan dapat diandalkan untuk melakukan koneksi& men am!il data dan meru!ah data dari !er!a ai macam sum!er data. *odul ini hanya akan mem!ahas dua komponen pertama dari keempat komponen yan dipunyai oleh J(4C& yaitu J(4C /+$ dan (river*ana er. %um!er data yan di unakan adalah Belational (ata!ase.
Database Driver
J(4C memerlukan data!ase driver untuk melakukan koneksi ke suatu sum!er data. (ata!ase driver ini !ersifat spesifik untuk setiap 'enis sum!er data. (ata!ase driver !iasanya di!uat oleh pihak pem!uat sum!er datanya& namun tidak 'aran 'u a komunitas atau pihak keti a menyediakan data!ase driver untuk se!uah sum!er data tertentu. +erlu dipahami sekali la i !ahwa data!ase driver !ersifat spesifik untuk setiap 'enis sum!er data. *isalnya& (ata!ase (river *y%Kl hanya !isa di unakan untuk melakukan koneksi ke data!ase *y%Kl dan !e itu 'u a data!ase driver untuk +ost re %P? 'u a hanya !isa di unakan untuk melakukan koneksi ke data!ase +ost re %P?. (ata!ase driver untuk setiap (4*% pada umumnya dapat didownload dari we!site pem!uat (4*% terse!ut. 4e!erapa vendor (4*% menye!ut (ata!ase driver ini den an se!utan Java Connector (J/Connector). (ata!ase driver !iasanya di!un kus dalam file yan !erekstensi 'ar. %etiap data!ase driver harus men implement interface 'ava.sKl.(river.
Membuat Koneksi
*elakukan koneksi ke data!ase meli!atkan dua lan kah: *eload driver dan mem!uat koneksi itu sendiri. Cara meload driver san at mudah& pertama letakkan file 'ar data!ase driver ke dalam classpath. 5emudian load driver den an menam!ahkan kode !erikut ini:
HALAMAN
58 | JAVA SWING
Connection conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/latihan, root,); Jika salah satu dari driver yan diload !erhasil di unakan untuk melakukan koneksi den an #B? terse!ut& maka koneksi ke data!ase !erhasil dilaksanakan. Class Connection akan meme an informasi koneksi ke data!ase yan didefinisikan oleh #B? terse!ut. %etelah sukses melakukan koneksi ke data!ase& kita dapat men am!il data dari data!ase men unakan perintah Kuery ataupun melakukan peru!ahan terhadap data!ase. !a ian !erikut ini akan meneran kan !a aimana cara men am!il dan memanipulasi data dari data!ase.
;.
$nstance dari o!'ect !ertipe Besult%et diperlukan untuk menampun hasil kem!alian data dari data!ase. %e!elum kita !isa memperoleh instance dari Besult%et& kita harus mem!uat instance dari class %tatement. Class %tatement mempunyai method e6ecutePuery yan di unakan untuk men'alankan perintah Kuery dalam data!ase kemudian men em!alikan data hasil eksekusi Kuery ke dalam o!'ect Besult%et. 4erikut ini adalah contoh kode untuk mem!uat instance class %tatement& kemudian men'alankan Kuery untuk men am!il data dari data!ase yan hasilnya dipe an oleh Besult%et : Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResulSet rs = statement.executeQuery(select * from Customers); Besult%et akan meletakkan kursornya (posisi pem!acaan !aris) di se!uah posisi se!elum !aris pertama. #ntuk men erakkan kursor ma'u& mundur& ke suatu posisi relatif atau ke suatu posisi a!solute tertentu& unakan method-method dari Besult%et: ne6t() -- men arahkan kursor ma'u satu !aris. previous() -- men arahkan kursor mundur satu !aris. first() -- men arahkan kursor ke !aris pertama. last() -- men arahkan kursor ke !aris terakhir. !eforeFirst() -- men arahkan kursor ke se!elum !aris pertama. after?ast() -- men arahkan kursor ke setelah !aris terakhir. relative(int rows) -- men arahkan kursor relatif dari posisinya yan sekaran . %et nilai rows den an nilai positif untuk ma'u& dan nilai ne atif untuk mundur. a!solute(int row7um!er) Q men arahkan kursor ke posisi tertentu sesuai den an nilai row7um!er& dan tentu sa'a nilainya harus positif.
$nterface Besult%et menyediakan method etter untuk men akses nilai dari setiap kolom dalam !aris yan sedan aktif. +arameter fun si etter !isa menerima nilai inde6 dari kolom ataupun nama kolomnya. 7amun !e itu& pen unaan nilai inde6 le!ih efisien di!andin men unakan nama kolom.
HALAMAN
60 | JAVA SWING
7ilai inde6 dimulai den an satu hin a !anyaknya kolom. +en unaan nama kolom adalah case insensitive& artinya huruf kecil atau huruf !esar tidak men'adi masalah. et%trin di unakan untuk men am!il kolom den an tiper data char& varchar atau tipe data strin lainya. et$nt di unakan untuk men am!il kolom den an tipe data inte er. 4erikut ini dalah contoh pro ram len kap dari melakukan koneksi hin a men am!il data dari data!ase. Class.forName(com.mysql.jdbc.Driver); Connection conn = DriverManager.getConnection( jdbc:mysql://localhost:3306/latihan, root,); Statement statement = conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); ResulSet rs = statement.executeQuery(select * from Customers); while(rs.next()){ System.out.println(rs.getInt(id)); System.out.println(rs.getString(Nama)); } *ethod e6ecutePuery hanya dapat men'alankan perintah %P? select& unakan method e6ecute#pdate untuk men'alankan perintah insert& update dan delete. ,asil dari eksekusi insert& update dan delete tidak men em!alikan result set& tetapi men em!alikan se!uah nilai inte er yan merepresentasikan status hasil eksekusi method e6ecute#pdate. 4erikut ini contoh insert& update dan delete : result = statement.executeUpdate( "update Customers set nama ='roby' where nama='andy'"); result = statement.executeUpdate( "delete Customers where nama='andy'"); *en unakan e6ecutePuery dan e6ecute#pdate san at mudah dan fleksi!le& namun san at tidak efisien& +repared%tatement menawarkan keun ulan dalam !entuk efisiensi.
Menggunakan PreparedStatement
*eman il method e6ecute#pdate !erulan -ulan & misalnya melakukan insert ratusan atau ri!uan !aris& san at tidak efisien.
HALAMAN
62 | JAVA SWING
PreparedStatement pInsert = conn.prepareStatement( "insert into Person(name) values(?)"); pInsert.setString(1,"dian"); pInsert.executeUpdate(); PreparedStatement pUpdate = conn.prepareStatement( "update Person set name=? where name=?"); pUpdate.setString(1,"andry"); pUpdate.setString(2,"andri"); pUpdate.executeUpdate(); (alam contoh diatas& insert dan update data hanya dilaksanakan sekali sa'a& hal ini tidak mem!erikan am!aran yan tepat untuk melihat keun ulan +repared%tatement di!andin kan %tatement.e6ecute#pdate.
Batch Execution
*isalnya kita in in men -insert seratus !aris data dalam se!uah loop& kita !isa men unakan fasilitas !atc e6ecution dari +repared%tatement. !atch e6ecution men umpulkan semua eksekusi pro ram yan akan dilaksanakan& setelah semuanya terkumpul !atch e6ecution kemudian men irimkan kumpulan eksekusi pro ram secara !ersamaan ke (4*% dalam satu kesatuan. *etode ini san at efisien karena men uran i overhead yan diperlukan pro ram untuk !erkomunikasi den an (4*%. (alam contoh di !awah ini kita akan men unakan !atch e6ecution untuk melakukan insert data se!anyak seratus kali. PreparedStatement pInsert = conn.prepareStatement( "insert into Person(nama) values(?)"); for(int i=0;i<100;i++){ pInsert.setString(1,"user ke " + i); pInsert.addBatch(); } pInsert.executeBatch(); %etiap kali iterasi& method set%trin dipan il untuk men isikan se!uah strin ke dalam +repared%tatement& kemudian method add4atch dipan il untuk men umpulkan !atch dalam satu wadah. %etelah iterasi selesai& method e6ecute4atch dipan il untuk melaksanakan semua keseratus instruksi insert secara !erurut den an sekali sa'a melaksanakan koneksi ke data!ase.
Menangani Transaction
(ukun an transaction oleh J(4C ter antun den an (ata!asenya&
HALAMAN
64 | JAVA SWING
di unakan untuk aplikasi we!. +enerapan konsep separation of concern secara disiplin& dapat men hasilkan kode pro ram yan dapat dites secara otomatis men unakan J#nit atau (4#nit. #nit testin merupakan paramater utama dalam menentukan apakah kode pro ram yan kita hasilkan mempunyai mutu yan tin i atau tidak. Covera e unit testin yan tin i mencerminkan kode pro ram yan !erkualitas tin i pula. (ao pattern !erisi semua kode untuk men akses data& seperti Kuery. %emua kode yan sepesifik terhadap implementasi akses data !erhenti di sini& lapisan le!ih atas tidak !oleh tahu !a aimana akses data diterapkan& apakah men unakan J(4C murni atau ,i!ernate atau J+/. ?apisan lainya hanya perlu tahu fun sionalitas dari suatu method di dalam (/D class& tidak perlu tahu !a imana method terse!ut diimplementasikan. Class (/D akan mempunyai method seperti save& delete& et4y$d atau et/ll. +raktek yan laCim di unakan adalah satu !uah -ntity/)a!le akan mempunyai satu !uah class (/D. (i !awah ini adalah contoh Class (/D men ta!le )NC/)-"DB> : unakan J(4C untuk
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,
public void delete(Category category) { try { deleteStatement.setInt(1, category.getId()); deleteStatement.executeUpdate(); } catch (SQLException ex) { } } public Category getById(Long id) { try { getByIdStatement.setLong(1, id); ResultSet rs = getByIdStatement.executeQuery(); //proses mapping dari relational ke object if (rs.next()) { Category category = new Category(); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setDescription( rs.getString("description")); return category; } } catch (SQLException ex) { } return null; } public List<Category> getAll() { try { List<Category> categories = new ArrayList<Category>();
HALAMAN
68 | JAVA SWING
ResultSet rs = getAllStatement.executeQuery(); while(rs.next()){ Category category = new Category(); category.setId(rs.getInt("id")); category.setName(rs.getString("name")); category.setDescription( rs.getString("description")); categories.add(category); } return categories; } catch (SQLException ex) { } return null;
} }
%ervice pattern di unakan utamanya untuk menyederhanakan class-class (/D yan ada& misalnya kita mempunyai @1 !uah ta!le maka laCimnya akan ada @1 !uah class (/D. Class (/D terse!ut perlu disederhanakan& caranya adalah den an men elompokkan class-class (/D dalam satu modul aplikasi ke class %ervice. *isalnya (/D yan !erhu!un an den an user mana ement ke dalam class #ser%ervice. )ransaction diatur dalam class %ervice& praktek yan laCim di unakan adalah satu method dalam class service adalah satu scoop transaction. Jadi ketika method dalam service mulai dieksekusi transaction akan dimulai (!e in)& ketika method akan !erakhir& transaction akan dicommit. 4erikut ini adalah contoh class %ervice :
HALAMAN
70 | JAVA SWING
return categoryDao.getAll();
} }
%etelah class (/D dan service !erhasil di!uat& mari kita lihat !a aimana cara men unakannya : public class MainJdbc { public static void main(String[] args) { MysqlDataSource dataSource = new MysqlDataSource(); dataSource.setUser("root"); dataSource.setPassword("admin"); dataSource.setDatabaseName("latihan"); dataSource.setServerName("localhost"); dataSource.setPortNumber(1527); ServiceJdbc service = new ServiceJdbc(); service.setDataSource(dataSource); Category category = new Category(); category.setName("administrator"); service.save(category); System.out.println("id : " + category.getId()); System.out.println("name : " + category.getName()); try { dataSource.getConnection().close(); } catch (SQLException ex) { }
} }
%etelah men enal J(4C& kita akan mem!ahas cara men akses data!ase yan le!ih !aik den an man unakan J+/. (en an men unakan J+/ kode pro ram yan akan di!uat akan le!ih rin kas dan terlihat konsep DD+ di!andin den an J(4C murni. J+/ adalah framework DB* untuk memetakan ta!el dalam data!ase dan class dalam konsep DD+. (en an men unakan J+/ kode pro ram kita akan le!ih rapi dan terlihat DD+.
HALAMAN
72 | JAVA SWING
saat kita in in men anti data!ase& kita cukup men konfi urasi DB* untuk !er anti dialek.
$eningkatan kinerja
/da !anyak hal yan !isa kita lakukan untuk men optimasi akses data!ase& diantaranya: data!ase connection poolin laCy-loadin deferred %P? men uran i hit ke data!ase Kuery result cache #rusan connect/disconnect dari data!ase merupakan urusan yan rumit. 4anyak lan kah yan terli!at di sana& misalnya inisialisasi koneksi& proses otentikasi& dan se!a ainya.
HALAMAN
74 | JAVA SWING
/plikasi !esar !iasanya men optimasi urusan connect/disconnect ini den an men unakan teknik connection poolin . +ada waktu dinyalakan& aplikasi lan sun mem!uat !anyak koneksi sekali us (pool). 4ila ada kode pro ram yan in in men unakan koneksi untuk men'alankan %P?& maka koneksi diam!il dari pool dan di!erikan. %etelah selesai men'alankan %P?& koneksi tidak ditutup& melainkan dikem!alikan ke pool. (en an cara ini& overhead proses connect/disconnect dapat dikuran i. (en an men unakan DB*& semua koneksi data!ase diatur di satu tempat& sehin a men u!ah konfi urasi dari koneksi !iasa men'adi connection-poolin tidak !erpen aruh !esar terhadap keseluruhan kode pro ram. )idak semua data yan kita am!il dari data!ase akan di unakan. 5adan kala se!a ian !esar data yan diam!il akan di!uan . )entunya ini mem!oroskan ker'a C+#& pen unaan memori& dan 'u a !andwidth. 4e!erapa DB* mendukun fitur laCy-loadin & yaitu men am!il data kalau !enar-!enar diperlukan. 4ila aplikasi kita men unakan DB*& perintah %P? ke data!ase dieksekusi oleh DB*& !ukan oleh kode pro ram kita. 5arena itu& DB* memiliki ke!e!asan untuk men'alankan %P? kapan sa'a& asal tidak men acaukan aplikasi kita. 5e!e!asan ini di unakan oleh DB* untuk menunda dan men umpulkan eksekusi %P?& sehin a !isa di'alankan secara efisien. +ada aplikasi !esar& umumnya application server dan data!ase server diinstal di mesin yan !er!eda. #ntuk men aksesnya di unakan akses melalui 'arin an (network). Dleh karena itu& akses ke data!ase harus diperhitun kan den an teliti& a ar tidak terlalu !anyak perintah atau data yan 8menye!eran i: 'arin an. DB* senantiasa !erusaha men uran i komunikasinya den an data!ase& sehin a kiner'a aplikasi dapat ditin katkan. *en am!il data dari memori selalu 'auh le!ih cepat daripada men am!il data dari disk atau 'arin an. 5arena kontrol penuh yan dimilikinya atas hu!un an ke data!ase& DB* dapat men unakan cache den an leluasa. DB* dapat men amati data mana yan 'aran !eru!ah& dan kemudian akan menyimpannya di memori (cache). 4ila kode pro ram kita meminta data terse!ut& DB* tidak perlu men akses data!ase& melainkan lan sun men am!ilnya dari cache. $ni akan san at mempercepat eksekusi aplikasi.
Persiapan
Instalasi
%eperti li!rary Java lainnya& J+/ tidak mem!utuhkan instalasi
0plikasi (log
*en'elaskan konsep sa'a terasa kuran men i it apa!ila tidak disertai aplikasi. (alam !uku ini& kita akan mem!uat aplikasi !lo & yaitu aplikasi untuk memuat tulisan atau artikel di we!site.
Fungsionalitas 0plikasi
Fitur dari aplikasi ini adalah: *enulis artikel *en elompokkan artikel ke dalam kate ori *em!erikan komentar untuk masin -masin artikel /rtikel memiliki informasi tentan penulis (author) /uthor dapat lo in ke dalam aplikasi
Dasar-dasar ORM
Mapping Seder'ana
#ntuk contoh awal& kita akan melakukan mappin untuk class Category. Class ini hanya memiliki ti a properti sa'a& id& name& dan description. 4erikut adalah kode Javanya. public class Category { private Integer id; private String name; private String description; // getter dan setter } Class ini akan kita simpan di data!ase. 4erikut struktur ta!elnya& ditulis dalam dialek *y%P?. create table Category ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), description VARCHAR(255) ); #ntuk kesederhanaan& kita samakan dulu nama ta!el dan nama class. (emikian 'u a den an nama property di kode Java dan nama kolom di ta!el data!ase. +ada !a ian selan'utnya& kita akan lihat
HALAMAN
76 | JAVA SWING
!a aimana cara memetakan nama yan !er!eda. J+/ mendukun dua cara untuk mem!uat pemetaan& den an L*? dan /nnotation. 5ita akan men am!il pendekatan /nnotation& karena le!ih mudah dan sederhana. (en an pendekatan ini& kita tidak perlu memelihara dua file (Java dan L*?). 4erikut class Category yan sudah dianotasi. @Entity public class Category { @Id @GeneratedValue private Integer id; private String name; private String description; }
Kon&igurasi J$0
%etelah kita mem!uat ta!el dan class Java& sekaran kita akan mem!uat konfi urasi J+/. 7et4eans 0.2 mempunyai fasilitas yan memudahkan konfi urasi J+/. ?an kah pertama adalah mem!uat koneksi ke dalam data!ase *y%P? den an men unakan data!ase tools net!eans. 4uka ta! service& kemudian e6pand !a ian data!ase. 5alau kita !elum mempunyai data!ase& kita !isa mem!uat data!ase terle!ih dahulu den an melakukan klik kanan di node mysKl dan pilih menu create data!ase& !eri nama trainin . 5alau sudah ada data!ase (schema) yan di!uat se!elumnya& node mysKl dapat die6pand untuk melihat data!ase terse!ut. ?an kah !erikutnya adalah mem!uat koneksi ke dalam data!ase yan sudah di!uat. -6pand node mysKl& klik kanan di node data!ase trainin & pilih menu connect. Jan an lupa untuk mencek pilihan 8Bemem!er +assword:. 5oneksi ini nanti akan kita unakan untuk mem!uat +ersistence #nit. +ersistence #nit adalah konfi urasi yan di unakan oleh J+/ untuk meletakkan parameter username& password& url dan dialect yan di unakan untuk melakukan koneksi ke data!ase. +roses mem!uat +ersistence #nit san at mudah& pilih menu : file new file persistence persistence unit
*asukkan koneksi yan sudah di!uat pada lan kah se!elumnya di !a ian 8(ata!ase Connection:. 5emudian pilih 8)a!le "eneration %trate y: a ar ketika kita akan men'alankan aplikasi& semua ta!le akan di enerate dari -ntity. 5ita akan mem!ahas le!ih lan'ut tentan -ntity di !a! !erikutnya& tidak perlu !in un dahulu& tenan sa'a. ,asil dari +ersistence #nit adalah file L*? den an mana persistence.6ml dan terletak di packa e *-)/-$7F& isinya seperti !erikut ini :
HALAMAN
78 | JAVA SWING
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistenc e http://java.sun.com/xml/ns/persistence/persistence_1_0.xs d"> <persistence-unit name="latihanPU" transactiontype="RESOURCE_LOCAL"> <provider> oracle.toplink.essentials.PersistenceProvider </provider> <class>com.artivisi.desktop.model.Group</class> <class>com.artivisi.desktop.model.Person</class> <properties> <property name="toplink.jdbc.user" value="root"/> <property name="toplink.jdbc.password" value=""/> <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/training"/> <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="toplink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence> file persistence.6ml diatas se!aiknya di!uat den an otomatis men unakan tools dari net!eans& dan 'an an di!uat secara manual den an diketik& karena file 6ml terse!ut case sensitif dan harus !enar secara sintask& sehin a kalau diketik manual akan !eresiko men hasilkan kesalahan ketik.
/ntit#ManagerFa"tor#
+ertama& kita harus mem!aca konfi urasi yan sudah kita !uat tadi. 5onfi urasi yan telah diaktifkan akan men hasilkan o!'ect EntityManagerFactory. EntityManagerFactory ini hanya di!uat sekali sa'a sepan'an aplikasi !er'alan. EntityManagerFactory entityManagerFactory=
penting
Jangan terlalu lama men#impan obje"t /ntit#Manager! (iasan#a- session dibuka di aw al met'oddan segera ditutup di ak'ir met'od! /ntit#Manager J$0 tidak sama dengan koneksi database! Koneksi database dikelola ole' /ntit#ManagerFa"tor#!
Persistence.createEntityManagerFactory("JpaPU"); %ecara default& J+/ akan mencari persistence.xml dalam *-)/-$7F. file yan !ernama akan
%elan'utnya& kita instankan dulu o!'ect Category yan disimpan. // buat object category yang mau disave Category category = new Category(); category.setName("berita"); category.setDescription("berita hangat");
HALAMAN
80 | JAVA SWING
Transaction. EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction().begin(); entityManager.persist(category); entityManager.getTransaction().commit(); entityManager.close(); EntityManager adalah o!'ect sekali pakai. 5ita am!il EntityManager dari EntityManagerFactory& unakan untuk operasi persistence& dan kemudian lan sun ditutup. %iklus hidup EntityManager !er!eda den an -ntity*ana erFactory. -ntity*ana erFactory umurnya sama den an aplikasi& di!uat satu !uah& pada saat aplikasi mulai di'alankan& dan di unakan terus sepan'an aplikasi !er'alan. 5ita !isa mem!a i-pakai (share) -ntity*ana erFactory ke !er!a ai o!'ect yan !er'alan !er!aren an (concurrent)& karena -ntity*ana erFactory di!uat secara thread-safe& sehin a aman untuk pemakaian multi-threadin . )api kita tidak !isa men unakan EntityManager di !anyak o!'ek sekali us. %etelah di'alankan& kode di atas akan memasukkan satu record ke ta!el Category dalam data!ase.
drop-and-create-tables: den an opsi ini& J+/ akan mem!uat semua ta!el pada saat inisialisasi -ntity*ana erFactory. 4e itu -ntity*ana erFactory ditutup& semua ta!el akan di-drop. create:-ta!les opsi ini hanya akan mem!uat t a!el pada saat EntityManagerFactory diinisialisasi. J+/ tidak men-drop ta!el pada saat EntityManagerFactory ditutup. %elan'utnya kita akan mem!uat class-class untuk data access o!'ect ((/D).
Membuat Categor#Dao
Class Category akan memiliki !e!erapa method& diantaranya: save : untuk menyimpan o!'ect ke data!ase findById : untuk men am!il o!'ect dari data!ase !erdasarkan $( yan di!erikan 7antinya CategoryDao tidak hanya memiliki dua method sa'a. )api untuk awal& cukup kita pindahkan apa yan ada di class DemoJpa di atas ke dalam CategoryDao. 4erikut keran ka CategoryDao. public class CategoryDao { public void save(Category cat){} public Category findById(Integer id){} } %elan'utnya& CategoryDao !utuh -ntity*ana erFactory untuk melakukan interaksi den an data!ase melalui J+/. 5ita !erikan EntityManagerFactory melalui setter-in'ection.
HALAMAN
82 | JAVA SWING
public class CategoryDao { private EntityManager entityManager; public void setEntityManager( EntityManager em) { this.entityManager = em; } }
Menggunakan /ntit#Manager
%elan'utnya& mari kita isi method save. (i dalam method ini harus ada lo ika untuk menentukan apakah operasi save yan akan dilakukan adalah insert atau update. 5onvensi yan di unakan adalah: 'ika id dari entity masih null maka entity terse!ut !elum ada di dalam data!ase& sehin a operasi insert yan akan dilaksanakan. %e!aliknya& 'ika idnya tidak null maka operasi update yan akan dilaksanakan: public void save(Category cat) { if(cat.getId()==null){ entityManager.persist(cat); } else { entityManager.merge(cat); } } method findById. public Category findById(Integer id){ return (Category) entityManager.createQuery( "select g from Group g where g.id=:id") .setParameter("id", id) .getSingleResult(); }
Client Code
5ita dapat mem!uat kode sederhana untuk men etes kiner'a CategoryDao. 4uat class (emo(ao yan memiliki method main. $sikan kode pro ram !erikut dalam method main.
Pemetaan Relasi
%elan'utnya& setelah kita dapat men konfi urasi dan melakukan test terhadap ker'a J+/& sekaran kita !isa melan kah ke topik yan le!ih !ermanfaat& yaitu mem!uat mappin yan le!ih !era am. +ada !a! ini& kita akan memetakan seluruh struktur data!ase aplikasi !lo kita. 4erikut class-class yan akan terli!at:
HALAMAN
84 | JAVA SWING
User : mencerminkan semua account yan aplikasi. dapat lo in ke
Author : mencerminkan penulis yan men aran artikel atau menulis !erita. %atu author memiliki satu user& dan se!aliknya. 5ita memisahkan class User dan Author& karena User !erisi informasi tentan security& i'in akses& password& dan informasi keamanan lainnya. %edan kan class Author menyimpan informasi !erkaitan tentan informasi personal& seperti nama len kap& tan al lahir& dan se!a ainya. Group : !erisi !anyak User& pen aturan i'in akses. unanya nanti untuk memudahkan
Category : mencerminkan kelompok artikel. /da kate ori !erita& osip& opini& dan se!a ainya Article Comment : komentar atas artikel tertentu ,u!un an antar class terse!ut dapat di am!arkan se!a ai !erikut:
%truktur o!'ect tidak sama den an struktur data!ase& walaupun a ak mirip. 4erikut adalah struktur ta!el dalam data!ase.
%ekaran & setelah kita men etahui desain o!'ek dan desain data!ase& mari mulai melakukan pemetaan.
HALAMAN
86 | JAVA SWING
*ari kita !ahas satu persatu.
Kasta
J+/ men enal ti a kasta o!'ect: entity& component& dan value type. *ari kita lihat contohnya.
+ada domain model di atas& kita lihat seoran Author memiliki informasi nomer yan !isa dihu!un i. 5arena 'aman sudah semakin can ih& satu oran !isa dihu!un i di !anyak nomer& yaitu nomer telepon rumah& kantor& ponsel "%*& ponsel C(*/& dan 'u a nomer fa6. #ntuk men elompokkan semua nomer ini& kita mem!uat satu class khusus yaitu ContactNumber. +emetaan o!'ek seperti ini dise!ut den an istilah fine- rained. /rtinya& informasi dikelompokkan secara detail dan spesifik. )iap class memiliki informasi yan terinci. 5arena class adalah tipe data& !isa dikatakan !ahwa kita telah mem!uat tipe data !aru& yaitu ContactNumber. +ertanyaannya& !a aimana kita akan menyimpan data ini ke data!aseR (ata!ase tidak men enal tipe data khusus. 5ita hanya !isa men unakan tipe data yan telah disediakan seperti $7)& atau F/BC,/B. 5ita tidak !isa mem!uat tipe data !aru ContactNumber dalam data!ase. /da ti a alternatif yan !isa kita unakan untuk memetakan ContactNumber ke data!ase. )i a alternatif ini mencerminkan kasta o!'ect dalam J+/. 2. 5asta tertin i& adalah -ntity o!'ect. %e!uah -ntity memiliki ta!el sendiri& primary key sendiri& dan kehidupan sendiri. Class Author adalah se!uah -ntity. 5asta di !awah -ntity dise!ut Component. (ia memiliki
;.
/da !e!erapa kriteria yan !isa di unakan untuk menentukan kasta suatu o!'ect. (en an men unakan kriteria ini& kita dapat memetakan desain o!'ect ke desain relasional den an !aik. 4erikut kriterianya: 2. %hared Beference. /pakah o!'ect tertentu mempunyai referensi ke o!'ect lainR +ada contoh kita di atas& class Author memiliki hu!un an den an class User dan class Article. Dleh karena itu& 'elas !ahwa class Author akan men'adi -ntity. (i data!ase& ta!el Author dan User akan terlihat seperti ini.
Class ContactNumber hanya di unakan oleh class Author. Class ini !ahkan tidak memiliki referensi ke class induknya& yaitu class Author. $ni ditun'ukkan oleh hu!un an composition antara class Author dan ContactNumber. Dleh karena itu& data ContactNumber dimasukkan ke dalam ta!el yan sama den an data Author& seperti dapat dilihat pada am!ar di atas. ;. 5ehidupan.
HALAMAN
88 | JAVA SWING
/pakah suatu o!'ect memiliki kehidupan yan terpisah dari o!'ect yan !erhu!un an den annyaR (ata Author masih akan tetap tersimpan walaupun Article yan ditulisnya dihapus. )idak demikian halnya den an ContactNumber. 4e itu data Author dihapus& data ContactNumber tidak memiliki relevansi la i. D!'ect yan memiliki kandidat -ntity. <. Jumlah #ntuk memahami pentin nya 'umlah dalam pemetaan& mari kita lihat hu!un an antara Article dan Comment. kehidupan sendiri merupakan
%atu Article memiliki !e!erapa Comment. %ama den an ContactNumber& kehidupan Comment 'u a san at ter antun pada Article. 5alau Article dihapus& Comment tidak la i relevan. /pa yan mau dikomentari kalau artikelnya tidak adaR %atu Author hanya memiliki satu ContactNumber& tapi satu Article memiliki !anyak Comment. +er!edaan 'umlah ini akan menentukan susunan ta!elnya. 4erikut susunan ta!el Article dan Comment.
(en an mempertim!an kan keti a hal di atas& !erikut adalah kasta untuk masin -masin o!'ect dalam desain domain model kita.
Class
/rticle /uthor Cate ory Comment Contact7um!er "roup #ser #ser?evel -ntity -ntity -ntity Component Falue )ype -ntity -ntity Falue )ype
Kasta
7avigasi
5ita harus memikirkan urusan arah navi asi (direction) dalam merancan pemetaan. (ua class dikatakan memiliki navi asi dua arah (!idirectional) apa!ila kita dapat men akses class yan satu dari class yan lain& dan se!aliknya. %e!a ai contoh& User dan Group mempunyai hu!un an !idirectional& 'adi kode Javanya kirakira seperti ini. public class User { private Set<Group> groups = new HashSet<Group>(); } sedan kan class Group !erisi seperti ini
HALAMAN
90 | JAVA SWING
public class Group { private Set<User> members = new HashSet<User>(); } User dan Author unidirectional& artinya dari class User kita dapat men akses class Author. )api dari class Author kita tidak dapat men akses class User. 4erikut kode Javanya. public class User { private Author author; } dalam class Author& tidak ada property User. public class Author { // tidak ada property User } #rusan navi asi ini hanya ada di kode Java. /papun desain navi asi yan kita !uat& tidak mempen aruhi struktur ta!el kita.
Jenis Colle"tion
(alam desain kita di atas& ada !e!erapa hu!un an one-to-many dan many-to-many. #rusan many ini direpresentasikan dalam Java den an men unakan Collections Framework. 5ita men enal !e!erapa interface dalam Collections Framework den an sifatnya masin -masin : Set : D!'ek yan disimpan dalam Set tidak !oleh ada yan sama. Set tidak !isa men in at urutan. Jadi kita tidak !isa men harapkan o!'ek yan dimasukkan pertama akan muncul pertama 'u a. Set !iasanya diinisialisasi den an men unakan implementasi HashSet. List : 4er!eda den an Set& List mampu men in at urutan. +erilakunya mirip den an array. 5ita dapat men atur urutan o!'ek yan disimpan di dalamnya. D!'ek List !isa diurutkan melalui perintah order by dalam %P?& atau den an adanya nilai inde6& yan menun'ukkan urutan o!'ek di dalam List. 4iasanya List diinisialisasi den an implementasi ArrayList. SortedSet : $nterface ini di unakan !ila kita in in menyimpan o!'ek yan tidak !oleh sama& tapi men in inkan ada urutan tertentu. 5ita dapat memasan Comparator ke dalam SortedSet untuk men atur urutan penyimpanan o!'ek. 4iasanya SortedSet diinisialisasi men unakan TreeSet. Map : $nterface ini menyimpan pasan an key dan value. 4iasanya diinisialisasi men unakan HashMap.
5ita memiliki !e!erapa hu!un an many dalam domain model kita. 4erikut adalah pemilihan 'enis collection !eserta pertim!an annya.
Relasi
/uthor Q -mail
Collection
%etT%trin U
Pertimbangan
alamat email tidak !oleh terduplikasi. 4usiness reKuirement tidak men haruskan adanya prioritas tertentu antar email kita in in menampilkan daftar artikel !erdasarkan tan al ter!itnya.
/uthor Q /rticle
?istT/rticleU
/rticle Q Comment
?istTCommentU urutan masuknya komentar san at pentin & karena ter'adi diskusi antar pen un'un . #ntuk memastikan urutan& kita men unakan ?ist den an nilai inde6. %etT"roupU %atu user tidak !oleh tercatat dua kali se!a ai mem!er roup yan sama %atu roup tidak !oleh diikuti dua kali oleh satu user yan sama
#ser Q "roup
"roup Q #ser
%etT#serU
2ptionalit#
*asalah optionality ini hanya ada di sisi data!ase. (ari sudut pandan desain o!'ect& optionality tidak men'adi pertim!an an. *ari kita lihat la i relasi antara User dan Author. +ada kasus kita& satu User pasti memiliki satu Author& dan se!aliknya. (esain seperti ini direalisasikan di data!ase den an ((? !erikut: create table T_AUTHOR ( id INT PRIMARY KEY AUTO_INCREMENT ); create table T_USER ( id INT PRIMARY KEY AUTO_INCREMENT, author_id INT NOT NULL ); %eperti kita lihat& ta!el T_USER di atas memiliki forei n key author_id. 5olom author_id terse!ut di!erikan atri!ut NOT NULL karena dia adalah forei n key& sehin a harus diisi. (esain seperti ini akan men'adi masalah 'ika !usiness reKuirement menentukan !ahwa User !elum tentu punya informasi Author (optional). Jika men unakan desain di atas& maka kita terpaksa
HALAMAN
92 | JAVA SWING
men hilan kan atri!ut NOT NULL pada author_id. Cara ini kuran ele an& karena forei n key tidak diperuntukkan a ar !isa diisi NULL. (i !e!erapa merek data!ase& forei n key dilaran NULL. Cara yan le!ih !aik adalah den an men unakan 'oin ta!le. %kema data!ase den an 'oin ta!le men'adi seperti ini. create table T_AUTHOR ( id INT PRIMARY KEY AUTO_INCREMENT ); create table T_USER ( id INT PRIMARY KEY AUTO_INCREMENT ); create table T_USER_AUTHOR ( user_id INT, author_id INT, PRIMARY KEY(user_id, author_id) ); 5esimpulannya& kita harus mempertim!an kan faktor optionality dalam mendesain struktur ta!el data!ase.
,ransitive $ersisten"e
,al lainnya yan harus dipertim!an kan dalam melakukan pemetaan adalah efek suatu operasi entity (save& update& delete) terhadap entity lain yan terhu!un den annya. *isalnya& author -ndy menulis artikel !aru. 4erikut kode pro ram untuk menyimpannya ke data!ase. Author endy = entityManager.createQuery(select a from Article a where a.id=:id) .setParameter(id,100).getSingleResult(); Article tutorial = new Article(); tutorial.setTitle(Belajar JPA); tutorial.setAuthor(endy); endy.getArticles().add(tutorial); entityManager.persist(endy); +ada kasus di atas& class Article adalah -ntity& 'adi J+/ tidak otomatis melakukan insert. Jika di'alankan& kode di atas akan men hasilkan error& yan menye!utkan !ahwa o!'ect tutorial !elum ada di data!ase& sehin a tidak !isa dihu!un kan den an o!'ect endy.
Enum Type
5ita mulai dari yan palin sederhana& yaitu tipe data enum. (alam domain model kita& enum di unakan untuk menentukan i'in akses user. *ari kita lihat class User. public class User { private Integer id; private String username; private String password; private UserLevel level; } Class User ini men unakan fitur !aru dalam Java @& yaitu )ypesafe -num. /dapun enum UserLevel tidak sulit& kodenya seperti ini. public enum UserLevel { CONTRIBUTOR, EDITOR, ADMINISTRATOR } 5ita memiliki dua pilihan !a aimana UserLevel ini akan disimpan dalam ta!el& yaitu: ordinal : menyimpan nilai inde6 dari enum terse!ut. CD7)B$4#)DB akan disimpan den an nilai 2& -($)DB den an nilai ;& dan /(*$7$%)B/)DB den an nilai <. Drdinal adalah modus default. strin : menyimpan nilai teks enum. (i data!ase& nilainya akan disimpan se!a ai tipe data enumeration !ila tersedia& atau varchar. #ntuk memetakan enum& cukup !erikan anotasi @Enumerated.
HALAMAN
94 | JAVA SWING
public class User { private Integer id; private String username; private String password; @Enumerated(value = EnumType.STRING) private UserLevel level;
Value Type
5ita memiliki satu value type& yaitu List<String> emails pada class Author. 4erikut pemetaannya. public class Author { @CollectionOfElements(targetElement = String.class) @JoinTable( name = "T_AUTHOR_EMAIL", joinColumns = {@JoinColumn(name = "author_id")} ) @Column(name = "email") private Set<String> emails = new HashSet<String>(); } (en an informasi mappin di atas& T_AUTHOR_EMAIL akan terlihat seperti ini. ta!el T_AUTHOR dan
+ada T_AUTHOR_EMAIL terlihat !ahwa kedua kolom (author_id dan email) di!uat men'adi primary key. $ni adalah konsekuensi dari tipe collection Set& yan tidak men i'inkan duplikasi di dalamnya.
One to One
Dne to Dne men hu!un kan dua entity. 5ita men unakan hu!un an ini untuk Author dan User. >an perlu diperhatikan hanyalah class User& karena navi asinya cuma satu arah. 4erikut class User. public class User { @OneToOne @JoinColumn(name = "author_id", nullable = false) private Author author; } 5ita men atur kolom forei n key author_id a ar tidak !oleh null. $ni !erkaitan den an masalah optionality yan sudah di'elaskan di atas.
Many to One
+ada contoh aplikasi kita& mappin *any to Dne ada pada hu!un an antara class Article dan Category. 7avi asinya satu arah& dari Article ke Category. (en an demikian& pada class Category& tidak ada property Article. public class Category { @Id @GeneratedValue private Integer id; private String name; private String description; } +ada class Article& kita mendeklarasikan property Category& den an mappin @ManyToOne se!a ai !erikut. public class Article { @ManyToOne @JoinColumn(name = "category_id", nullable = false) private Category category; } (eklarasinya tidak 'auh !er!eda den an @OneToOne. +emetaan di atas mencerminkan skema data!ase se!a ai !erikut.
HALAMAN
96 | JAVA SWING
One to Many
+ist dengan order b#
5ita memiliki !e!erapa kasus Dne )o *any. +ertama& kita lihat dulu tipe collection List yan men unakan sortin di sisi data!ase melalui perintah order by. ,u!un an ini ada antara Author dan Article. 5arena hu!un annya dua arah (!idirectional)& maka kita akan melihat mappin di kedua sisi class. 4erikut am!ar domain modelnya.
(i sisi Article& mappin *any-to-Dne Author sama den an Category yan kita sudah !uat se!elumnya. public class Article { @ManyToOne @JoinColumn(name = "author_id", nullable = false) private Author author; } (i sisi Author& public class Author { @OneToMany(mappedBy = "author") @OrderBy("publishDate") private List<Article> articles = new ArrayList<Article>(); } +emetaan di atas akan men hasilkan struktur ta!el data!ase se!a ai !erikut.
5ita men unakan anotasi @OrderBy untuk menentukan urutan munculnya Article. Jika anotasi terse!ut kita hilan kan& J+/ akan men urutkannya !erdasarkan id. +ada mappin di atas& kita men unakan keyword mappedBy. 5eyword ini dikenal 'u a den an atri!ut inverse=true pada mappin L*?. 5eyword inverse atau mappedBy mem!eritahukan J+/ !ahwa isi List adalah -ntity o!'ect& !ukan Component. (en an demikian& kalau o!'ect Author dihapus& J+/ tidak akan otomatis men hapus 'u a Article.
penting
J$0 mampu membuat pemetaan satu ara' dari 0ut'or ke 0rti"le- ba'kan tanpa adan#a propert# aut'or di sisi 0rti"le! $emetaan satu ara' ini tetap dilakukan dengan adan#a &oreign ke# aut'or8id di ,80*,IC +/ ,api konsekuensin#aJ$0 tidak ta'u apaka' &oreign ke# aut'or8id tersebut suda' dipetakan atau belum! Ini sebabn#a mengapa kita 'arus menggunakan ke#w ord inverse!
%elain men atur masalah keter antun an& keyword inverse ini 'u a men atur eksekusi %P?. *ari kita !ahas internal J+/ sedikit. /sosiasi dua arah antara Author dan Article se!etulnya terdiri dari dua asosiasi satu arah& yaitu dari Author ke Article& dan se!aliknya. (i dalam data!ase& asosiasi ini diimplementasikan den an forei n key author_id yan ada dalam ta!el T_ARTICLE. (en an demikian& satu hu!un an forei n key dipetakan dua kali oleh J+/. 5onsekuensinya& dua mappin ini akan men hasilkan dua kali eksekusi %P?. Co!a perhatikan skenario !erikut.
HALAMAN
98 | JAVA SWING
Author endy = entityManager.createQuery(select a from Article a where a.id=:id) .setParameter(id,100).getSingleResult(); Article tutorial = new Article(); tutorial.setTitle(Belajar JPA); tutorial.setAuthor(endy); endy.getArticles().add(tutorial); entityManager.persist(tutorial); entityManager.persist(endy); Ban kaian kode pro ram di atas akan men hasilkan eksekusi %P? se!a ai !erikut: select * from T_AUTHOR where id=100; riainto insert into ins T_ARTICLE T_ARTICLE (title, (title, author_id) author_id) es values val ('Belajar ('Belajar JPA',JPA', 100);100); va ho up update T_ARTICLE set author_id=100 where title='Belajar JPA'; 5ita lihat di atas& J+/ men'alankan %P? update& padahal ause!elumnya r au pid author_id sudah diset menurut id auth i s Pr@h
4ila kita sudah men aktifkan transitive persistence& maka kita !isa melakukannya seperti ini: Article tutorial = new Article(); tutorial.setAuthor(endy) entityManager.persist(endy); 4a aimana 'ika kita in in mem!alik sisi inverseR *isalnya& kita in in a ar J+/ men a!aikan sisi Article. 5eyword mappedBy atau inverse tidak dapat di unakan di sisi @ManyToOne. #ntuk melakukan hal ini& kita unakan keyword updateble dan insertable. (i sisi Article& kita tam!ahkan updatable dan insertable. public class Article { @ManyToOne @JoinColumn( name = "author_id", nullable = false updatable = false, insertable = false ) private Author author; } (i sisi Author& kita hilan kan sa'a mappedBy. public class Author { @OneToMany @OrderBy("publishDate") private List<Article> articles = new ArrayList<Article>(); }
Many to Many
4ila kita sudah men uasai pemetaan Dne-to-*any& maka *any-to*any tidak sulit. +er!edaannya hanya terletak di anotasinya. >an tadinya @OneToMany& di anti men'adi @ManyToMany. %ama den an Dne-to-*any& kita harus menentukan sisi mana yan
HALAMAN
Parent-Child
)erakhir& kita akan mem!uat pemetaan parent-child. $ni merupakan pemetaannya yan serin kita unakan. +emetaan ini !iasanya !er!entuk one-to-many. %isi one menentukan kondisi sisi many. 4ila ter'adi save& update& atau delete pada sisi one& maka sisi many akan terpen aruh. %e!a ai contoh& kita akan men unakan relasi parent-child ini pada hu!un an antara Author dan Article. 4ila Author dihapus& maka seluruh Article yan pernah ditulisnya 'u a akan ikut terhapus.
6uer# Seder'ana
#ntuk contoh pertama& mari kita implementasikan
HALAMAN
$agination
4ila aplikasi kita menyimpan ri!uan artikel& tentunya kita in in men am!il data secara !ertahap& halaman per halaman (pa in ). %P? yan di unakan untuk pa ination ini !iasanya !er!eda antar data!ase. (en an J+/& kita !isa men unakan satu J+/P? sa'a. J+/ nantinya akan mener'emahkan sesuai den an merek data!ase yan kita unakan. #ntuk men am!il artikel per halaman& kita overload method findAll a ar menerima parameter startIndex dan pageSize. +arameter startIndex adalah inde6 yan menun'ukkan record pertama dalam halaman& sedan kan pageSize menun'ukkan 'umlah record per halaman. 4erikut overloadin method findAll. public List<Article> findAll (int startIndex, int pageSize){ return entityManager .createQuery("select a from Article a") .setFirstResult(startIndex) .setMaxResults(pageSize) .getResultList(); }
$arameter (inding
4a aimana kalau kita mau men irim parameter ke KueryR J+/ mendukun parameter !indin & mirip den an PreparedStatement di J(4C. 4ila kita in in men am!il artikel yan !erikut kodenya. ditulis pen aran tertentu&
7amed 6uer#
5ita !isa men eluarkan J+/P? dari dalam o!'ek DAO dan memindahkannya ke class -ntity. (ari class DAO& kita cukup meman il nama Kuery terse!ut. Fitur ini dise!ut 7amed Puery. *isalnya& kita in in men am!il artikel !erdasarkan kate ori. 4erikut J+/P?-nya. from Article a where a.category.id = :categoryId J+/P? ini !isa kita letakkan dalam class Article. 4erikut deklarasi class Article.
HALAMAN
*estri"tion
5ita men unakan restriction untuk mem!atasi 'umlah record yan dihasilkan. *irip den an %P?& kita men unakan keyword where untuk mem!atasi hasil Kuery. Contohnya& kita men am!il artikel yan diter!itkan setelah tan tertentu. J+/P?nya tampak seperti ini: from Article a where a.publishDate > :publishDate ,ampir semua operator yan !iasa kita di unakan. 4erikut ta!el operator yan !erdasarkan prioritas eksekusinya:
Operator
. AV/ AO TU T& U& TO& UO navi asi o!'ect untuk mem!uat men'adi positif/ne atif perkalian dan pem!a ian pen'umlahan dan pen uran an sama den an atau tidak sama den an per!andin an
al
Penjelasan
I7D)J 4-)9--7& I7D)J ?$5-& per!andin an& mirip den an sintaks %P? I7D)J $7& $% I7D)J 7#?? $% I7D)J -*+)>& I7D)J *-*4-B IDFJ pen ecekan collection
*isalnya& !ila kita in in men am!il artikel yan 4erita& Kuery-nya seperti ini: String jpaql = from Article a ; jpaql += where a.category <> :category;
List<Article> hasil = entityManager.createQuery(jpaql).getResultList(); 5ita men unakan karakter % untuk men antikan karakter apa sa'a dalam 'umlah !erapa sa'a. *isalnya& kita in in mencari artikel yan diawali den an huruf /& maka kita unakan J+/P? seperti ini: from Article a where a.title like 'A%' ?alu !a aimana kalau kita in in mencari artikel yan den an karakter %R diawali
"unakan escape character \& sehin a J+/P?nya men'adi seperti ini: from Article a where a.title like '\%' 4ila kita men unakan le!ih dari satu persyaratan& unakan keyword and atau or sesuai ke!utuhan. Contohnya& kita in in mencari artikel yan 'udulnya diawali huruf /& dan nama pen aran nya 'u a diawali den an huruf /. from Article a where a.title like 'A%' and a.author.fullname like 'A%' Contoh lain& !ila kita in in mencari artikel yan diawali huruf / dan 'u a huruf 4& J+/P?nya seperti ini. from Article a where a.title like 'A%' or a.title like 'B%' 5ita !isa men urutkan hasil pencarian den an men keyword order by& sama seperti %P?. 4erikut contoh pen urutan artikel !erdasarkan 'udulnya. String jpaql = from Article a ; jpaql += order by a.title asc ; List<Article> hasil = entityManager.createQuery(jpaql).getResultList(); 5ita men unakan keyword asc& yan artinya ascendin untuk men urutkan dari kecil ke !esar. #ntuk urutan se!aliknya& unakan keyword desc& yan artinya descendin . unakan
HALAMAN
$roje"tion
4ila tadi kita sudah menentukan sum!er data den an keyword from dan !atasan hasil den an keyword where& sekaran kita !isa menentukan format hasil yan dikeluarkan den an keyword select. *ari kita lihat la i Kuery user yan men'adi an ota rup. from User u, Group g where g.name=? and u member of g.members +ada Kuery di atas& kita !isa memilih untuk hanya men am!il data user sa'a den an men unakan select. Puery di atas !isa ditulis men'adi seperti ini: select u from User u, Group g where g.name=? and u member of g.members (en an Kuery seperti itu& kita !isa mem!uat method di class GroupDao se!a ai !erikut: public List<User> membersOf(String groupName) { String jpaql = "select u "; jpaql += "from User u, Group g "; d g "";
*eport 6uer#
Beport Kuery adalah Kuery yan men andalkan kemampuan data!ase untuk melakukan a re asi terhadap data yan 'umlahnya !anyak. 4iasanya report Kuery !anyak memanfaatkan a re ate function seperti sum& count& group by& dan having. %e!a ai contoh& !ila kita in in men hitun 'umlah artikel yan sudah ditulis seoran author& kita !isa men unakan Kuery !erikut. select count (a) from Article a where a.author.fullname = 'endy' /tau kita !isa 'u a men hitun dikomentari pen un'un . select count (a) from Article a where a.comments is empty !erapa artikel yan tidak
Sub:uer#
J+/ 'u a mendukun Kuery di dalam Kuery. %e!a ai contoh& kita in in menampilkan penulis mana yan pernah mem!uat artikel den an nama kate ori !erakhiran 7ews.
HALAMAN
Native SQL
Jika J+/P? di atas masih 'u a tidak mencukupi& kita !isa lan sun men eksekusi %P? ke data!ase melalui J+/. %e'auh ini& J+/ sudah mencukupi untuk aplikasi !lo kita. )api sekedar untuk menam!ah pen etahuan& mari kita am!il 21 artikel ter!aru den an men unakan native %P? *y%P?. %P?nya se!a ai !erikut select * from T_ARTICLE order by publishDate desc limit 0,10 %P? di atas kita unakan dalam /rticle(ao se!a ai !erikut. public List<Article> topTenNative() { String sql = "select * from T_ARTICLE "; sql += "order by publishDate desc limit 0,10"; return entityManager .createNativeQuery(sql,Article.class) .getResultList(); } #ntuk men unakannya& kita pan il methodnya seperti !iasa. Client code tidak perlu tahu implementasi internalnya. (ari sisi client code& sama sa'a seperti men akses J+/P?.
Jasper *eport
Pengenalan
*enampilkan report atau laporan merupakan hal yan pentin dan umum di unakan oleh aplikasi manapun& terutama yan !ersifat sistem informasi. Dleh karena itu kita akan mem!ahas !a aimana mem!uat desain report& men isi report den an data& lalu mem!erikan hasilnya kepada pen una. (alam Java& terdapat !er!a ai teknolo i untuk mem!uat report diantaranya adalah& JasperBeport& http://'asperreport.sourcefor e.net/ 4$B)& http://www.!irt-e6chan e.com/ (ata Fision& http://datavision.sourcefor e.net/
JasperBeport merupakan reportin tools yan palin populer di Java dan !ahkan !e!erapa aplikasi +,+ men unakan JasperBeport se!a ai solusi untuk menampilkan report.
Instalasi
+ersiapan yan perlu kita lakukan adalah: 2. *en install Java %(5& versi yan di unakan adalah J(5 2.0.1. /nda dapat mendownload J(5 terse!ut dari we!site http://'ava.sun.com ;. *en install 7et4eans 0.1 <. *en install iBeport =. *en install *y%P? Java %(5 diperlukan se!a ai toolkit untuk men em!an kan aplikasi Java. (i dalamnya terdapat Java compiler& 'ava virtual machine dan 'ava li!rary standard. )anpa %(5 kita tidak akan !isa men em!an kan aplikasi Java. 7et4eans adalah $(- ($nte rated (evelopment -nvironment) yan dikem!an kan oleh %un *icrosystems. 7et4eans difokuskan untuk men em!an kan aplikasi 'ava secara produktif& didalamnya terdapat !anyak wiCard yan men otomatisasi pen em!an an aplikasi& men hindarkan developer dari low level confi uration yan rumit. iBeport adalah visual desi ner untuk mem!uat reportin men unakan li!rary 'asperreport. )anpa iBeport development
HALAMAN
Cara yan kedua merupakan pendekatan yan palin umum di unakan karena kita tidak mun kin men u!ah desain report pada saat run-time atau setelah aplikasi di-deploy. <. *en isi report den an data. (ata yan di!erikan dapat !er!a ai 'enis sesuai den an ke!utuhan& hal ini akan di!ahas pada !a! selan'utnya. Beport yan sudah diisi data !erekstensi V.'rprint. *enentukan 'enis report yan in in ditampilkan. %aat ini JasperBeport mendukun !er!a ai 'enis format seperti& +(F& L?%& B)F& D()& ,)*?& C%F& dan plain te6t.
=.
+aramater& untuk menampilkan parameter report. 4entuk dari parameter adalah *ap den an tipe key dan
?ayout report 4iasanya desain report terdiri dari !e!erapa !a ian yaitu& 4ack round. )itle& 'udul dari report. +a e header& !a ian di setiap awal halaman. Column header& !a ian di setiap awal ta!el. (etail& !a ian yan menampilkan data yan !erasal dari Kuery atau data source. %etiap data dapat ditampilkan secara vertikal dari atas ke !awah atau horiContal dari kiri ke kanan. Column footer& !a ian di setiap akhir ta!el. +a e footer& !a ian di !a ian footer setiap halaman. ?ast pa e footer& sama seperti pa e footer namun hanya muncul pada halaman terakhir. %ummary& !a ian yan akhir report. hanya ditampilkan sekali di
4a i pen una sistem operasi V7i6 !isa men unduh file arsipnya !erupa tar. C dan men ekstraknya. %etelah itu men'alankannya den an& cd /home/user/iReport-2.0.4 sh iReport.sh 4erikut tampilan muka dari iBeport&
HALAMAN
(ata%ource& menampilkan data melalui interface (ata%ource yan disediakan oleh JasperBeport. (ata%ource ini didefinisikan di dalam kode Java sehin a report hanya !erfun si untuk menampilkan data sa'a.
+endekatan pertama merupakan pendekatan yan palin sederhana. Dleh karena itu kita akan mem!ahas menampilkan data melalui inline %P?. #ntuk mendefinisikan %P? dalam report dapat dilakukan den an& File > New Document Beri nama report dengan PersonReport > OK Edit > Report Query )ulis %P? dalam Kuery editor& select * from T_PERSON 5emudian tekan tom!ol 8Bead Fields: untuk memappin ta!el den an field lalu tekan tom!ol 8D5:. kolom
/da !e!erapa field !aru sesuai den an kolom di ta!el )N+-B%D7 yaitu& personNid& name& email& dan !irthdate. ?alu pindahkan field di atas ke !a ian 8detail: dalam report. ,asilnya seperti !erikut&
HALAMAN
5emudian tam!ahkan 'udul dan la!el untuk setiap field data den an men unakan menu tool!ar 8%tatic )e6t:. (esain akhir report akan seperti !erikut&
)ampilkan hasil report den an cara& Build > Execute (with active connection) Jan an lupa untuk menyimpan report yan nama PersonReport.jrxml& File > Save sudah di!uat den an
HALAMAN
*en eksport lan sun hasil report ke dalam format file seperti +(F& -6cell atau 9ord
+endekatan pertama dan kedua sama dari sisi kode& hanya sa'a ditampilkan den an men unakan komponen yan !er!eda. Cara yan palin laCim adalah den an men unakan JBFiewer& dimana kita !isa meletakkan viewer report di manapun kita in inkan& karena JBFiewer adalah J+anel. ResultSet rs = stmn.executeQuery(); String jasper = JasperCompileManager.compileReportToFile( System.getProperty("user.dir") + "/src/jasper/report/person.jrxml"); JRResultSetDataSource resource = new JRResultSetDataSource(rs); String result = JasperFillManager.fillReportToFile(jasper, new HashMap(), resource); JRViewer viewer = new JRViewer(result, false);
JB4ean/rray(ata%ource untuk menyimpan tipe data array of !ean JB4eanCollection(ata%ource collection of !ean JB)a!le*odel(ata%ource ta!lemodel di swin untuk menyimpan menyimpan tipe tipe data data
untuk
(ata%ource yan umum di unakan adalah JB4eanCollection(ata%ource. 5ita akan menampilkan daftar +erson& den an mem!uat Collection dari +erson !ean yan kemudian akan di!erikan ke JB4eanCollection(ata%ource. +ertama di!uat terle!ih dahulu Person.ja a&
HALAMAN
4erikut file +ersonBeport.'r6ml setelah diu!ah& <jasperReport name="PersonReport"> <field name="id" class="java.lang.Integer"/> <field name="name" class="java.lang.String"/> <field name="email" class="java.lang.String"/> <!-- desain report --> </jasperReport> %elan'utnya adalah mem!uat PersonReport.ja a untuk menenerate report&
4iasanya untuk kasus nyata& daftar +erson pada method prepare(ata%ource() dipan il den an men unakan %P? Kuery. %etelah kelas +ersonBeport di'alankan maka hasil report dapat dilihat di /home/dhiku/'asper/+ersonBeport.pdf.
HALAMAN
Mengirim Parameter
%elain (ata%ource& adapula parameter yan dapat dikirimkan ke dalam report. *isalkan kita in in mencetak 'udul report secara dinamis yan dikirim dari kode Java. 4erikut lan kah-lan kah untuk men irimkan parameter& 2. %iapkan parameter di report View > Parameter Klik New Isi parameter name, judul Klik OK ;. 4erikan parameter ke report // Compile Report dan siapkan DataSource HashMap<String, String> param = new HashMap<String, String>(); // Fill Report JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, param, dataSource); // Export Report
Menggunakan Scriptlet
%criptlet adalah kode Java yan diselipkan pada saat proses fill report. +roses fill report terdiri dari !e!erapa tahap& scriptlet dapat men'alankan kode Java pada se!elum dan sesudah tahap-tahap terse!ut misalnya& %e!elum atau sesudah report diinisialisasi %e!elum atau sesudah setiap halaman report diinisialisasi %e!elum atau sesudah setiap kolom diinisialisasi %e!elum atau sesudah setiap roup diinisalisasi %e!elum atau sesudah setiap !aris atau record diinisialisasi
#ntuk mem!uat scriptlet maka kita harus mem!uat se!uah class yan men -e6tend kelas JB/!stract%criptlet. 4erikut contoh scriptlet yan akan di'alankan setiap se!elum !aris diinisialisasi&
HALAMAN
$enutup
(en an ilmu yan sudah diperoleh dalam pelatihan ini& anda sudah !isa mulai untuk mem!uat pro ram Java desktop sederhana. +ada awalnya pasti terasa sulit& sikapi den an pantan menyerah dan selalu cari cara yan le!ih !aik dalam mem!uat aplikasi. ?an kah selan'utnya anda !isa mulai aktif !ertanya atau men'awa! hal-hal yan !erhu!un an den an Java. *edia yan !isa di unakan !anyak sekali& !isa forum milis atau diskusi den an teman. $ni cara ter!aik untuk men etes apakah pemahaman anda men enai Java sudah cukup len kap atau anda masih perlu !ela'ar le!ih !anyak la i. %etelah yakin den an kemampuan anda& !erfikirlah untuk men am!il sertifikasi profesional Java. +elatihan untuk persiapan sertifikasi Java !anyak tersedia di lem!a a pelatihan. 5alau anda merasa terlalu !erat men am!il kursus persiapan sertifikasi& !erlatihlah sendiri men unakan materi yan !anyak tersedia di internet& misalnya 'avaranch.com. Cara !ela'ar Java yan palin efektif adalah den an meli!atkan diri dalam pro'ect !er!asis Java. Jika di perusahaan anda tidak memun kinkan& di luar sana !anyak sekali pro'ect opensource yan memerlukan !antuan anda. 4erkun'un lah ke we!site-we!site open source pro'ect hostin seperti sourcefor e.net atau dev.'ava.net ?earn& )ry dan )each adalah formula untuk menin katkan pen etahuan anda tentan Java. Jika sudah !ela'ar dan sukses menco!a& tularkan ilmu anda pada oran disekelilin anda& di'amin ilmunya !akalan !ertam!ah !erlipat-lipat.