Modul STI Pemrograman Berorientasi Objek
Modul STI Pemrograman Berorientasi Objek
PEMROGRAMAN
BERORIENTASI OBJEK
Abas Setiawan, Suprayogi, Nurul Anisa Sri Winarsih
i
KATA PENGANTAR
Pemrograman dengan paradigma berorientasi objek telah menjadi bagian penting pada
pengembangan perangkat lunak. Banyak aplikasi atau software yang diprogram dengan
paradigma ini. Pada jurusan Teknik Informatika S1 Universitas Dian Nuswantoro terdapat
mata kuliah yang membahas tentang paradima pemrograman berorientasi objek. Untuk
menunjang mata kuliah tersebut diperlukan suatu diktat atau modul untuk memudahkan
mahasiswa.
Modul Pemrograman Berorientasi Object ini merupakan diktat kuliah bagi mahasiswa yang
tidak hanya menyajikan konsep-konsep dasar paradigma memprogram berorientasi objek
tetapi juga memberikan solusi praktis aplikatif. Disamping itu, mahasiswa juga diperkenalkan
pembuatan Class Diagram, Graphical User Interface, Design Pattern, dan integrasi antara
basis data dan aplikasi yang dibuat. Bahasa Pemrograman pada modul ini keseluruhan
menggunakan JAVA. Namun demikian, materi-materi yang bersifat konsep utama paradigma
pemrograman berorientasi objek dapat diprogram tidak hanya dengan bahasa pemrograman
JAVA. Sebagian besar materi diambil dari buku Liang, D.J., 2015, Introduction to JAVA
Programming Comprehensive Version Tenth Edition, Pearson.
Penulis juga mengucapkan terima kasih kepada pihak-pihak terkait yang mendukung
diadakannya modul perkuliahan ini. Serta penulis berharap modul ini dapat digunakan
dengan sebaik-baiknya. Modul ini bukan pengganti perkuliahan melainkan pendukung
perkuliahan atau untuk melengkapi kuliah yang diberikan.
Penulis menyadari bahwa masih terdapat banyak kesalahan dari modul ini dan mungkin
belum bisa memuaskan banyak pihak. Penulis akan sangat mengapresiasi masukan kritik dan
saran tentang modul ini karena hal tersebut akan dapat digunakan sebagai acuan perbaikan
dimasa yang akan datang.
Penulis
ii
DAFTAR ISI
KATA PENGANTAR ................................................................................................................ i
2.10 Perulangan.................................................................................................................... 28
iii
BAB 3 CLASS DAN OBJEK DALAM PBO ......................................................................... 34
viii
BAB 1 PENGENALAN PEMROGRAMAN BERORIENTASI
OBJEK
1.1 Pendahuluan
Pada dasarnya komputer merupakan alat untuk menyimpan dan memproses data. Komputer
terdiri dari perangkat keras (hardware) dan perangkat lunak (software). Perangkat keras
merupakan perangkat yang terlihat secara fisik yang merupakan elemen penting komputer.
Perangkat keras tidak dapat bekerja tanpa adanya perangkat lunak. Perangkat lunak
menyediakan instruksi-instruksi yang digunakan untuk mengendalikan perangkat keras dan
membuatnya melakukan sesuatu tugas (penyelesaian masalah) tertentu. Perangkat lunak
dikembangkan dengan cara di program. Jadi bagaimana cara untuk membuat program
(melakukan pemrograman)? Kembali pada perangkat lunak, pada dasarnya program juga
demikian, berisi instruksi-instruksi yang diberikan kepada komputer atau perangkat komputer
tentang tugas apa yang akan/dapat dilakukan.
Meskipun demikian, komputer tidak dapat secara langsung menerima instuksi-instruksi yang
diberikan oleh programmer. Programmer merupakan istilah bagi seseorang yang membuat
program komputer. Komputer hanya sebuah mesin dan mesin hanya mengetahui angka 0 (on)
dan 1 (off). Seorang programmer tidak dapat membuat instruksi-instruksi pemrograman
dengan deretan angka 0 dan 1. Programmer memerlukan alat atau tool yang dapat digunakan
sebagai “penerjemah” antara bahasa manusia dengan bahasa mesin. Alat tersebut dikenal
dengan istilah bahasa pemrograman. Jadi selain membutuhkan instruksi-instruksi yang
diberikan pada komputer, programmer juga membutuhkan bahasa pemrograman.
Setiap programmer memiliki pendekatan atau cara yang berbeda untuk menuliskan instruksi-
instruksi tersebut. Secara umum, terdapat empat pendekatan pemrograman yaitu,
prosedural/imperatif, deklaratif, fungsional, dan berorientasi objek. Pendekatan prosedural
merupakan pendekatan pemrograman tradisional yang dikembangkan dengan cara membuat
urutan-urutan instruksi diikuti dengan manipulasi data untuk suatu tujuan atau tugas tertentu.
Pendekatan deklaratif berfokus pada pendeskripsian masalah yang akan diselesaikan
dibandingkan dengan membuat urutan atau langkah-langkah yang akan dilakukan. Pada
pendekatan fungsional, program dilihat sebagai entitas yang menerima input dan
menghasilkan output. Program dibagi-bagi pada unit kecil yang disebut dengan fungsi dan
1
fungsi tersebut dapat digunakan pada fungsi yang lainnya. Pendekatan berorientasi objek
memungkinkan program sebagai set unit yang disebut dengan istilah objek. Setiap objek
memiliki kemampuan untuk melakukan suatu aksi dan saling terkait antar satu objek dengan
yang lainnya untuk mencapai tujuan tertentu.
Fokus yang akan dibahas secara mendalam pada Buku ini adalah pendekatan berorientasi
objek. Pendekatan ini dapat disebut dengan istilah “Pemrograman Berorientasi Objek”.
Pendekatan ini merupakan pendekatan yang paling modern jika dibandingkan dengan
pendekatan yang lainnya. Kenapa bisa dikatakan modern? Kenapa programmer harus
menggunakan pendekatan ini? Program merupakan representasi dari sistem yang dibangun
oleh developer (sekumpulan organisasi atau perusahaan yang berisi programmer, analis
sistem, dll) atau programmer. Semakin besar sistem yang dibangun maka program akan
menjadi semakin kompleks. Berikut adalah alasan kenapa programmer membutuhkan
pemrograman berorintasi objek:
Memiliki kemampuan pemeliharaan program yang cepat dan efisien (tanpa merombak
sistem) dibandingkan dengan paradigma pemrograman yang lain,
Paradigma pemrograman selain berorientasi objek akan bekerja dengan baik pada
sistem dengan lingkup yang terisolasi, tetapi tidak jika sistem terintregasi,
Mendukung sistem operasi modern dan dapat dengan mudah beradaptasi dengan
program pihak ketiga (third-party program),
Kemampuan untuk dapat membuat Graphical User Interface (GUI) yang mudah
dimengerti.
Jadi apa definisi dari pemrograman berorientasi objek? Pemrograman berorientasi objek
merupakan pendekatan pengembangan perangkat lunak/program yang memiliki struktur
berbasis objek yang dapat berinteraksi satu sama lain untuk memenuhi suatu tujuan. Sebagian
besar bahasa pemrograman modern saat ini mendukung pendekatan berbasis objek ini. Akan
2
tetapi, pada buku ini, akan digunakan bahasa pemrograman Java untuk melakukan
pemrograman berorientasi objek.
Ketika melihat aksi yang ada dalam objek Mahasiswa tersebut, dapat dilihat bahwa untuk
melakukan aksi mengambil mata kuliah diperlukan setidaknya data nim untuk membedakan
antara mahasiswa satu dengan yang lain. Disamping itu, terdapat objek lain yang terkait yaitu
Mata Kuliah. Didalam objek Mata Kuliah terdapat attribut data seperti nama mata kuliah,
jadwal, dan ruang. Dari contoh yang sudah diceritakan sebelumnya dapat dilihat bahwa
sistem terbagi dalam sistem yang lebih kecil dengan direpresentasikan oleh objek-objek yang
saling terkait satu sama lain. Dengan demikian, cara berpikir seperti ini dapat digunakan
sebagai acuan untuk memulai memprogram dengan pendekatan berorientasi objek.
3
Satu class diagram berbentuk kotak dengan tiga bagian yang ditumpuk seperti pada Gambar
1.1. Bagian tumpukan pertama yang paling atas berisi nama class. Bagian tumpukan kedua
atau tengah merupakan bagian untuk data atau properti. Bagian tumpukan ketiga atau paling
bawah berisi method-method atau fungsi-fungsi. Properti dan method merupakan anggota
didalam struktur anatomi class. Properti merupakan atribut data yang dimiliki oleh suatu
class atau dapat dikatakan sebagai variabel. Method merupakan bentuk tingkah laku atau aksi
yang dimiliki oleh suatu class. Seperti hal.nya pada pemrograman fungsional, method juga
mirip dengan fungsi yang dapat memiliki nilai pengembalian ataupun tidak memiliki nilai
pengembalian. Properti dan method akan dijelaskan lebih lanjut pada BAB 3.
1.4 Kesimpulan
Pada BAB ini memberikan penjelasan umum tentang paradigma pemrograman berorientasi
objek. Dimana ketika akan membangun program, seorang programmer akan berpikir semua
entitas yang terkait sebagai suatu objek-objek yang saling terkait. Selain itu, terdapat UML
class diagram yang dapat menerjemahkan dari bahasa pemrograman menjadi bahasa bisnis.
Pada BAB 2, akan dibahas cara memprogram dengan bahasa pemrograman Java dimulai dari
pemrogramman dasar. Pemrograman berorientasi objek dengan bahasa pemrograman java
akan mulai dibahas dari BAB 3.
5
BAB 2 DASAR PEMROGRAMAN DENGAN JAVA
1011101010111010101011110111110111101
Dapat dibayangkan ketika programmer harus memprogram dengan bahasa mesin, hal tersebut
sangatlah tidak menyenangkan. Program yang ditulis akan sulit untuk dibaca dan
dimodifikasi. Dengan alasan tersebut muncul bahasa pemrograman assembly. Assembly
memungkinkan programmer untuk memasukkan instruksi dengan kata-kata singkat atau tidak
lagi rangkaian angka biner. Kata-kata singkat tadi juga dikenal dengan istilah “mnemonic”.
Berikut adalah contoh kode yang berisi instruksi sederhana dengan bahasa assembly:
add 2, 3, result
Menulis dengan bahasa assembly lebih mudah dibandingkan dengan bahasa mesin. Meskipun
demikian, bahasa ini merupakan bahasa yang paling dekat dengan bahasa mesin. Untuk
memprogram dengan assembly programmer harus sudah memahami cara kerja CPU secara
terperinci. Karena kedekatan bahasa assembly dengan mesin sehingga bahasa ini termasuk
dalam kategori bahasa tingkat-rendah.
Pada tahun 1950-an, generasi baru pemrograman muncul dengan kategori bahasa tingkat-
tinggi. Bahasa tingkat-tinggi mendukung penulisan program dengan bahasa inggris dan
mudah untuk digunakan. Selain itu, bahasa tingkat-tinggi ini dapat dijalankan dibeberapa
jenis mesin (tidak hanya pada satu mesin tertentu). Instruksi-instruksi perintah yang
6
dimasukkan dengan bahasa tingkat-tinggi ini dikenal dengan istilah statement. Berikut adalah
contoh statement dengan bahasa tingkat-tinggi untuk menghitung luas lingkaran:
area = 7 * 7 * 3.14;
Terdapat banyak sekali bahasa pemrograman yang masuk dalam kategori bahasa tingkat-
tinggi. Tabel 2.1 menunjukkan beberapa bahasa pemrograman yang populer saat ini yang
termasuk dalam kategori bahasa tingkat-tinggi.
Python Bahasa pemrograman yang dapat berguna untuk apa saja (genera purpose
language). Sangat efektif untuk menulis program-program singkat.
Visual Basic Bahasa pemrograman yang dikembangkan oleh Microsoft dan sebagian besar
penerapannya digunakan dalam produk-produk aplikasi dari Microsoft.
Nama java baru muncul pada tahun 1995 dimana fokusnya adalah mengembangkan aplikasi
berbasis web. Java muncul dan menjadi populer dikalangan programmer karena
kemudahaannya dan dapat berjalan dibanyak platform. Bahkan saat ini, java digunakan
sebagai dasar program aplikasi dengan platform Android. Platform Android merupakan
platform yang paling populer dan besar dikalangan perangkat mobile. Java memiliki beberapa
kelebihan diantaranya adalah sebagai berikut:
Bahasa pemrograman yang kuat yang berarti bahwa compiler dapat menanggapi
kesalahan program dengan baik.
Memiliki arsitektur yang netral atau tulis sekali dijalankan dimana saja.
Java Stkitard Edition (Java SE) untuk mengembangkan aplikasi disisi klien (client
side). Aplikasi-aplikasi di edisi ini dapat berjalan pada aplikasi desktop.
Java Enterprise Edition (Java EE) untuk mengembangkan aplikasi disisi server (server
side).
Java Micro Edition (Java ME) untuk mengembangkan aplikasi pada perangkat
mobile.
Buku ini menggunakan edisi Java SE untuk memperkenalkan pemrograman java dengan
berorientasi objek. Terdapat beberapa versi Java SE, tetapi pada buku ini kita akan
menggunakan Java SE 8 yang dirilis oleh Oracle. Java SE sudah termasuk didalam aplikasi
JDK 1.8. JDK 1.8 atau JDK 8 dapat diunduk di https://www.oracle.com/technetwork/
java/javase/downloads/jdk8-downloads-2133151.html. Ketika mengunduh perhatikan bahwa
kita harus menyetujui persetujuan lisensi yang harus diterima. Selain itu juga harus
diperhatikan sistem operasi yang digunakan. Gambar 2.1 memperlihatkan halaman unduhan
ketika akan mengunduh JDK 8u201.
JDK berisi beberapa set program yang terpisah. Setiap set program tersebut memiliki fungsi
masing-masing seperti memanggil beberapa isntruksi yang sudah ditentukan melalui
command line, kompilasi, menjalankan program, dan pengetesan program Java. Program
untuk menjalankan aplikasi Java dikenal dengan nama JRE (Java Runtime Environment).
Intinya JDK digunakan untuk kompilasi dan menjalankan program Java. Meskipun demikian,
9
kita dapat menggunakan aplikasi selain JDK seperti, Netbeans dan Eclipse. Untuk dapat
menjalankan JDK tentu saja JDK harus terinstal terlebih dahulu. Setelah itu kita harus
mendaftarkan perintah untuk kompilasi dan menjalankan program pada sistem operasi.
Berikut adalah cara untuk mendaftarkan perintah tersebut pada sistem operasi Windows 10.
1. Klik logo Windows 10 cari “Edit the system environment variable” atau cari “Control
Panel” System and Security System Advanced System Settings (di tab
Advanced klik tombol “Environment Variables..”. Gambar 2.2 memperlihatkan
halaman environment variables.
2. Fokus pada bagian System variables, tarik kebawah dan cari variable dengan nama
“path” kemudian klik tombol Edit (yang bawah/bagian system variable). Perhatikan
bahwa JANGAN menghapus variable atau environment variables didalam path
karena itu dapat menyebabkan kerusakan pada sistem operasi! Gambar 2.3
memperlihatkan halaman edit environment variable didalam path.
10
Gambar 2.3 Halaman edit environment varible pada path
Setelah itu, seperti pada Gambar 2.3 klik pada tombol New maka akan ada tambahan
isian kosong dibagian bawah. Klik tombol Browse dan cari alamat direktori JDK yang
sudah di instal sebelumnya dan masuk pada folder bin. Contohnya: C:\Program
Files\Java\jdk1.8.0_181\bin. Gambar 2.4 menunjukkan penambahan direktori JDK
pada environment variable yang sudah benar.
Jika sudah seperti pada Gambar 2.4 langkah berikutnya adalah klik tombol “OK” dan
keluar dari halaman environment variable.
3. Buka command prompt pada windows atau ketik cmd pada pencarian di Windows 10.
Ketikkan “javac”, jika muncul keluaran pada command prompt seperti Gambar 2.5,
berarti instalasi berhasil.
11
\
Untuk software aplikasi Netbeans atau Eclipse menyediakan IDE (Integrated Development
Environment) untuk mengembangkan aplikasi berbasis Java dengan cepat. Misalnya pada
Netbeans, menyediakan Graphical User Interface (GUI) yang dapat membantu programmer
(drag-and-drop) tanpa harus memprogram semua komponen GUI yang ada. Netbeans dapat
di unduh di halaman https://netbeans.org/downloads/8.2/ dan dapat di instalasi dengan mudah
dengan mengikuti petunjuk (next-next saja). Pada buku ini hanya digunakan Netbeans dengan
Java SE.
Nama class disini hanya boleh dimulai oleh huruf (biasanya programmer menggunakan
stkitar dengan dimulai dari huruf besar) dan tidak boleh ada spasi. Boleh ada angka dan
karakter khusus seperti “_” tetapi tetap diawali dengan huruf. Berikut adalah contoh
penamaan class yang benar:
Selain itu, diperlukan main method sebagai acuan pertama kali program akan mengeksekusi
instruksi yang kita berikan atau statement. Pembuatan main method yang benar adalah
sebagai berikut:
12
Perhatikan bahwa kurung kurawal buka “{“ dan kurung kurawal tutup “}” merupakan bentuk
blok dari beberapa komponen program. Komponen program dapat berisi satu atau banyak
statement. Misalnya pada sebuah class memiliki blok komponen program yaitu data dan
method. Demikian halnya dengan method yang memiliki blok komponen program berisi
beberapa statement. Blok juga dapat bersarang atau nested, artinya didalam satu blok bisa
berisi blok-blok lain. Begitu juga dengan blok-blok lain tersebut bisa berisi beberapa blok
lainnya. Berikut adalah contoh program utuh yang berisi satu class bernama Hello dan satu
main method:
Pada saat memprogram Java, statement diakhiri dengan karakter “;”. Semua yang ditulis di
Java mengikuti aturan penulisan yang sensitif atau dikenal dengan istilah case-sensitive.
Misalnya ketika menuliskan “main” diganti dengan “Main”, hal ini akan menyebabkan
kesalahan sintak. Kesalahan sintaksis akan muncul ketika programmer tidak mematuhi aturan
sintak.
Ketika programmer membuat program java untuk pertama kali menggunakan editor (notepad
misalnya), programmer akan menyimpan pada direktori tertentu didalam harddisk. Misalnya
programmer menyiapkan dengan nama “LatihanJava” di drive C dan kemudian akan
menyimpan file Hello.java didalam folder tersebut. Maka mekanisme untuk melakukan
kompilasi dan menjalankan aplikasi dilakukan melalui command prompt windows seperti
pada Gambar 2.7 (perhatikan bahwa jdk sudah di instal seperti pada BAB 2.3). Program java
dapat ditulis menggunakan editor teks sederhana, seperti notepad misalnya. Jika notepad
terasa monoton dan kurang bewarna programmer bisa mengunduh dan menginstal notepad++
(https://notepad-plus-plus.org/download/v7.6.4.html) atau visual studio code
(https://code.visualstudio.com/download).
14
Pindah antar drive
Pindah ke direktori
sebelumnya
Pindah ke direktori
LatihanJava
Kompilasi/compile
Menjalankan/running
Dalam pemrograman dengan Java, terdapat tiga jenis kesalahan program atau error yang
umum, yaitu syntax error, runtime error, dan logic error. Syntax error atau compile error
merupakan kesalahan yang sering sekali dilakukan oleh programmer pemula. Kesalahan ini
dikarenakan penulisan program yang tidak tepat atau tidak sesuai dengan sintak
pemrograman yang seharusnya. Sebagai contoh, programmer lupa menambahkan titik-koma
“;” di akhir statement. Kesalahan tersebut akan muncul ketika kita meng-kompile (saat
menjalankan javac). Bentuk kesalahannya adalah sebagai berikut:
Kesalahan tersebut diatas terjadi pada Hello.java baris ke 3 dengan keterangan kesalahan
“dibutuhkan titik-koma”. Systax error merupakan bentuk kesalahan program yang sangat
mudah untuk dideteksi.
Kesalahan program yang kedua adalah runtime error. Runtime error akan mengakibatkan
program berhenti secara tidak normal. Artinya program berhasil di kompile tetapi saat
dijalankan program akan menjadi berhenti secara tiba-tiba. Contoh dari error ini adalah
pembagian suatu nilai dengan nilai 0. Maka akan muncul kesalahan yang dikenal dengan
“Exception” saat ketika menjalankan program. Kesalahan program seperti ini muncul karena
saat program dijalankan, lingkungan pemrograman Java (sistem Java) tidak mungkin dapat
menangani masalah tersebut.
Kesalahan jenis ketiga adalah logic error. Logic error atau dapat disebut dengan istilah “bug”
merupakan jenis kesalahan yang cukup sulit dideteksi. Program berhasil di kompile dan di
15
jalankan, tetapi terdapat kesalahan yang dilakukan program saat program tersebut berjalan
(program tidak berjalan semestinya). Contohnya, ketika kita membuat program untuk
mendeteksi suhu mendidih dan normal pada air. User mencoba untuk memasukkan angka
110 untuk melihat suhunya normal atau mendidih. Suhu mendidih seharusnya diatas 100
derajat celcius. Tetapi output yang dihasilkan program adalah suhu normal. Untuk menangani
masalah ini, programmer harus melakukan proses debugging. Debugging merupakan proses
untuk mencari bug program dengan mencari pada setiap baris program yang menyebabkan
bug tersebut muncul.
Console input pada Java sedikit memerlukan mekanisme khusus. Java memiliki
System.out untuk mendefinisikan output dan System.in untuk mendefinisikan input.
Untuk melakukan console input tidak bisa langsung memanggil System.in, melainkan
16
dengan menggunakan Scanner class. Scanner digunakan untuk membuat objek dari
pembacaan input oleh System.in seperti kode berikut:
Scanner merupakan class yang didefinisikan oleh java.util.Scanner sehingga dapat dipanggil
dengan menambahkan import java.util.Scanner; terlebih dahulu. Variabel input
merupakan Objek dari scanner yang terbentuk dari System.in. Untuk membuat input
menjadi suatu tipe data yang kita ingginkan kita harus lakukan pemanggilan method khusus.
Misalnya, ketika kita ingin tipe data input menjadi double maka kita panggil method
nextDouble() seperti pada kode berikut:
Variabel beratbadan dapat menerima apapun masukan user dengan tipe angka pecahan
atau tipe data double. Kode 2.2 menjelaskan tentang penggunaan console input dan output
untuk perhitungan luas persegi.
17
Simpan kode 2.1 dengan nama HitungLuasPersegi.java dan lakukan kompilasi. Setelah itu
jalankan program dan coba ketikkan 12 lalu tekan enter. Hasil yang akan ditampilkan
program yaitu Luas persegi: 144.
Terdiri dari urutan karakter yang terdiri dari huruf, angka, garis bawah “_”, dan
penkita dollar “$”.
Identifier harus dimulai dari huruf, garis bawah, atau penkita dollar. Tidak boleh
dimulai dengan angka.
Identifier tidak boleh memuat kata-kata yang sudah disiapkan oleh Java. Misalnya
menamai variabel dengan class.
Variabel pada Java digunakan untuk merepresentasikan suatu nilai yang mungkin akan
berubah-ubah didalam program. Nilai tersebut mengikuti suatu tipe data tertentu atau objek
tertentu. Perlu mekanisme pengenalan variabel yang disebut dengan deklarasi variabel.
Deklarasi variabel meminta kompiler untuk mengalokasikan ruang memori yang benar
berdasarkan kepada tipe data/objek dari variabel tersebut. Deklarasi variabel dapat dilakukan
dengan cara berikut:
int x;
double rata2;
Kita dapat memberikan nilai awal dari sebuah variabel dengan cara inisialisasi variabel.
Berikut adalah cara inisialisasi variabel:
int y = 10;
double panjang;
panjang = 9.5;
18
Setelah deklarasi variabel, kita dapat membuat assignment statement. Assignement dilakukan
varibel dengan cara memerintah (assign) suatu nilai yang ditujukan ke variabel tersebut.
Assignment statement dapat digunakan sebagai ekspresi. Ekspresi mewakili komputasi
perhitungan yang melibatkan nilai, variabel, dan operator untuk mengevaluasi suatu nilai
tertentu. Jadi aturan sintak untuk assigment adalah sebagai berikut:
variabel = ekspresi
Assignment diwakili oleh simbol sama dengan “=”. Berikut adalah contoh assignment kepada
nilai langsung, varibel lain, dan ekspresi aritmatika:
double x = 10;
double sisi = x;
double luas = sisi * sisi;
Perhatikan bahwa yang di-assign berada pada sisi sebelah kanan dan tidak boleh terbalik.
Selain itu kita juga bisa melakukan assignment pada banyak variabel sekaligus dalam satu
statement. Berikut adalah contoh dari assignment pada banyak variabel:
i = j = k = 100;
sama dengan,
i = 100;
j = 100;
k = 100;
Programmer juga dapat melakukan assignment pada statement atau method. Berikut adalah
contoh penerapannya pada console output:
System.out.print(a = 10);
Sama dengan,
a = 10;
System.out.print(a);
float Negatif : -3.4028235E + 38 s/d -1.4E -45 32-bit IEEE 754 (4 byte)
double Negatif : -1.7976931348623157E+308 s/d -4.9E -324 64-bit IEEE 754 (8 byte)
Tipe data yang lain (selain numerik) yaitu, karakter diwakili dengan char, urutan karakter
diwakili dengan String, dan logika boolean dengan boolean. Tipe data char memiliki
ukuran 1 byte. Tipe data String memiliki ukuran banyaknya karakter dikalikan dengan 1
byte. Tipe data boolean memiliki ukuran 1 byte. Kembali ke tipe data numerik, untuk
membaca dari keyboard (atau melakukan console input), programmer akan menggunakan
Scanner. Pada Kode 2.1, kita telah membuat scanner dan menerapkan method
nextDouble() untuk mendapatkan input dengan tipe data double. Untuk input yang lain
disajikan pada Tabel 2.2.
20
Tabel 2.3 Method untuk objek scanner
Method Deskripsi
Tipe data numerik memiliki operasi dasar aritmatika, sehingga membutuhkan operator dasar
seperti: penjumlahan “+”, pengurangan “-”, pembagian “/”, perkalian ”*”, dan sisa bagi “%”.
Istilah operan merupakan nilai yang dioperasikan oleh operator. Ketika kedua operan bertipe
bilangan bulat (integer) dan kemudian akan dilakukan operasi pembagian, jika hasilnya
bilangan riil maka angka dibelakang koma akan dihilangkan. Misalnya 5 / 2 akan
menghasilkan nilai 2 bukan 2,5. Agar hasilnya menjadi 2,5 kedua operan harus diganti
dengan tipe bilangan riil (misalnya float). Kode 2.2 merupakan contoh penggunaan operasi
pada variabel yang telah ditentukan.
21
10 }
11 }
Terdapat operator khusus yang digunakan untuk menaikkan 1 nilai variabel atau increment
dan menurunkan 1 nilai variabel atau decrement. Misalnya terdapat variabel int x = 2; dan
kemudian terdapat operasi increment x++;. Operasi increment tersebut sama dengan x = x +
1;. Begitu juga dengan operator decrement, misalnya: x--; sama dengan x = x -1;.
Meskipun demikian kita dapat menuliskan ++ atau -- sebelum variabelnya, contoh ++x; atau
--x;. Dengan demikian increment atau decrement yang dilakukan setelah variabel disebut
dengan postincrement atau postdecrement. Kemudian untuk increment atau decrement yang
dilakukan sebelum variabel disebut dengan preincrement atau predecrement. Berikut adalah
perbedaan keduanya.
int x = 10;
int xa = 100 * x;
int xa = 100 * x++; x = x + 1;
int y = 10;
y = y + 1;
int ya = 100 * (++y); int ya = 100 * y;
Jika nilai xa dan ya dioutputkan, mereka memiliki hasil yang berbeda, yaitu xa = 1000 dan
ya = 1100.
Programmer dapat melakukan konversi bilangan bulat (integer) ke bilangan riil (float atau
double) atau sebaliknya dengan cara explicit casting. Misalnya, terdapat variabel double x =
90.5;, kita dapat melakukan assigment ke variabel yang bertipe integer dengan cara int y =
(int) x; sehingga y akan memiliki nilai 90 bukan 90,5.
22
mengoutputkan air mendidih atau air tidak mendidih berdasarkan nilai suhu yang dimasukkan
oleh user, program harus memiliki mekanisme untuk memilih atau mengambil keputusan.
Lalu bagaimana mekanismenya? Java menyediakan selection statement yang dapat
membiarkan kita untuk membuat pilihan aksi dengan berbagai alternatif jawaban. Berikut
adalah contoh kode selection statement:
== = Sama dengan
Setiap penerapan dari ekspresi boolean akan menghasilkan nilai true atau false. Misalnya,
pada kode sebelumnya if (suhuair > 100) jika menggunakan output console, akan
mengembalikan nilai true.
if (ekspresi boolean)
{
statement;
}
Pada jenis two-way IF, statement didalam IF akan dieksekusi jika kodisinya bernilai true jika
tidak maka akan mengeksekusi statement didalam ELSE. Berikut adalah kerangka sintak dari
two-way IF:
if (ekspresi boolean)
{
Statement untuk kasus true;
}
else
{
Statement untuk kasus false;
}
Jenis lebih lanjut untuk IF adalah multi-way IF. Multi-way IF memiliki banyak alternatif
pilihan kondisi (lebih dari satu) dengan masing-masing statement didalamnya. Berikut adalah
kerangka sintak dari multi-way IF:
24
{
Statement untuk kasus selain yang disebutkan sebelumnya;
}
Jenis IF yang lain adalah nested IF. Nested IF memungkinkan programmer untuk dapat
membuat statement IF yang lain berada didalam statement IF (bersarang). Dengan demikian,
IF yang ada didalam statement IF disebut dengan inner IF dan IF yang diluar adalah outer IF.
Tidak ada batasan inner IF pada praktiknya di Java. Berikut adalah kerangka sintak dari
nested IF:
25
6 System.out.print("Masukkan nilai: ");
7 int angka = input.nextInt();
8
9 if(angka > 60)
10 {
11 if(angka%2 == 0)
12 {
11 System.out.println("A");
13 }
14 else
15 {
16 System.out.println("B");
17 }
18 }
19 else if(angka > 30)
20 {
21 System.out.println("C");
22 }
23 else
24 {
25 System.out.println("D");
26 }
27 }
28 }
Contoh penerapan operator logika di Java disajikan pada Kode 2.3. Kode 2.3 merupakan
penyelesaian masalah untuk konversi nilai angka kedalam nilai huruf dengan aturan: A
didapatkan dari nilai angka lebih dari 85, B didapatkan dari nilai angka 70-84, C didapatkan
dari nilai angka 60-69, D didapatkan dari nilai angka 50-59, dan E didapatkan dari nilai
angka kurang dari 50.
27
13 System.out.println("B");
14 }
15 else if(angka >= 60 && angka <= 69)
16 {
17 System.out.println("C");
18 }
19 else if(angka >= 50 && angka <= 59)
20 {
21 System.out.println("D");
22 }
23 else
24 {
25 System.out.println("E");
26 }
27 }
28 }
2.10 Perulangan
Perulangan merupakan cara menuliskan statement secara berulang-ulang. Hal ini sangat
memudahkan programmer, misalnya ketika ingin memberikan output “aku bisa” selama 1000
kali. Apakah programmer akan menuliskan console output selama 1000 kali?
System.out.println(“aku bisa”);
System.out.println(“aku bisa”);
System.out.println(“aku bisa”);
.....
System.out.println(“aku bisa”);
Tentu hal tersebut akan membutuhkan tenaga dan waktu yang besar. Java menyediakan
mekanisme untuk menulis statement sekali (atau dalam kasus lain bisa beberapa kali tetapi
tidak banyak) dalam satu metode perulangan. Secara sederhana bentuk dari statement
perulangan tersebut adalah sebagai berikut:
int count = 0;
while(count < 1000)
28
{
System.out.println(“aku bisa”);
count++;
}
Variabel count di berikan nilai awal (inisialisasi) dengan nilai 0. Kemudian kode while akan
melakukan pengecekan apakah count < 1000 bernilai true. Jika benar bernilai true, maka
program akan mengeksekusi statement console output “aku bisa” dan akan melakukan
pembaharuan nilai count dengan ditambah satu (increment). Sehingga, console output “aku
bisa” akan terus dieksekusi berulang-ulang sampai nilai count menjadi 1001 dan kondisi
pengecekan didalam while menjadi false.
Di java bentuk perulangan tidak hanya dapat dilakukan dengan blok statement while, tetapi
ada do-while, dan for. Seperti contoh sebelumnya, while mengeksekusi statement secara
berulang-ulang selama kondisi didalam while terpenuhi atau bernilai true. Sintak dari
perulangan dengan while di Java adalah sebagai berikut:
do {
Statement s;
} while (kondisi didalam perulangan)
Pada perulangan do-while, didalam blok do merupakan isi utama dari badan perulangan.
Dimana didalam do tersebut bisa disisi beberapa statement. Kode 2.4 merupakan contoh
penerapan do-while untuk membuat user memasukkan apapun angka kecuali 0 untuk
menghitung nilai penjumlahan dari yang sudah dihitung sebelumnya.
29
Kode 2.6 TestPenjumlahanDoWhile.java
1 import java.util.Scanner;
2 public class TestPenjumlahanDoWhile {
3 public static void main(String[] apa)
4 {
5 int angka;
6 int sum = 0;
7 Scanner input = new Scanner(System.in);
8 do {
9 System.out.println(“Masukkan angka kecuali 0”);
10 data = input.nextInt();
11 sum += data;
12 } while(data != 0);
11 System.out.println(“Hasil Penjumlahannya adalah ”+sum);
13 }
14 }
Perulangan terakhir dapat dilakukan dengan mekanisme for. Perulangan dengan for
merupakan cara yang dapat dipahami dengan mudah oleh programmer pemula. Pada
perulangan sebelum yaitu dengan while atau do-while, terkadang programmer lupa untuk
mengendalikan varibel yang akan di ulang-ulang dan akhirnya akan berakhir pada perulangan
tidak terhingga. Secara sederhana perulangan for dapat dibandingkan dengan perulangan
while seperti berikut:
30
Secara umum, sintak dari perulangan for adalah sebagai berikut:
31
2.11 Kesimpulan
BAB ini merupakan BAB untuk mengulas kembali materi-materi tentang pemrograman dasar
dengan bahasa pemrograman Java. Materi-materi dasar pemrograman tersebut meliputi
input/output console, identified, variabel, assignment, tipe data, operasi, logika pengambilan
keputusan, dan perulangan. Dengan pengantar ini, diharapkan pada BAB-BAB berikutnya
akan lebih mudah untuk memahami sintak dalam memprogram dengan pendekatan
berorientasi objek pada bahasa pemrograman Java.
2. Sebutkan apa saja tipe data primitif yang didukung oleh Java?
2.13 Praktikum
Lakukan praktik dibawah ini sesuai dengan permintaan input dan output yang telah diberikan
dengan bahasa pemrograman Java!
1. Kasus 1: Ganjil-Genap
Terdapat kasus plat nomer ganjil genap yang diterapkan di Kota XXX. Dari plat
nomor tersebut, ganjil genap ditentukan oleh angkanya saja, tidak dengan huruf. Buat
program untuk mengotputkan lajur yang dipilih, jika genap lajur kiri, jika ganjil lajur
kanan.
Contoh Input/Output:
32
Output #2: Lajur kanan
2. Kasus 2: Palindrom
Palindrom merupakan suatu rangkaian kata yang sama ketika dibaca baik dari depan
ataupun dari belakang. Misalnya, “katak”, “malam”,”makam” merupakan contoh dari
kata palindrom. Pada praktikum ini, programmer diminta untuk mengecek apakah
kata yang di masukkan merupakan palindrom atau bukan.
Contoh Input/Output:
Gambarkan segitiga sama siku dengan rangkaian karakter ‘*’. Alas dari segitiga sama
siku tersebut ditentukan oleh angka yang dimasukkan oleh user.
Contoh Input/Output:
Input #1: 3
Output #1: *
**
***
Input #2: 4
Output #2: *
**
***
****
33
BAB 3 CLASS DAN OBJEK DALAM PBO
3.2.1 Property
Property atau keadaan objek (sering juga disebut atribut atau variabel) diwakili oleh bidang
data dengan nilai saat itu. Contohnya adalah objek mahasiswa yang memiliki property NIM,
nama, jenis kelamin, dan lain-lain. Objek persegi panjang memiliki bidang data panjang dan
lebar. Panjang dan lebar tersebut merupakan property yang menjadi ciri sebuah persegi
panjang. Cara penulisan dalam kode program sebagai berikut:
3.2.2 Method
Method atau bisa disebut sebagai fungsi di pemrograman fungsional merupakan perilaku dari
suatu objek. Misalnya kita dapat mendefinisikan method bernama getLuas() dan
getKeliling() untuk objek persegi panjang. Sebuah objek persegi panjang dapat
memanggil getLuas() untuk mengembalikan nilai luas dan getKeliling() untuk
34
mengembalikan nilai keliling. Selain itu, kelas menyediakan method khusus, yang dikenal
sebagai konstruktor, yang dipanggil untuk membuat objek baru. Konstruktor dirancang untuk
melakukan tindakan inisialisasi, seperti menginisialisasi bidang data objek. Penjelasan
tentang konstruktor yang lebih lengkap terdapat pada Bab 3.4. Cara penulisan method yang
sederhana dalam kode program sebagai berikut:
kepala
method public static int max( int angka1, int angka2 ){
if(angka1 > angka2)
badan return angka1;
method else
return angka2;
}
(a)
(b)
Gambar 3.2 Cara mendefinisikan (a) dan memanggil (b) method dengan nilai kembalian
35
Method bisa saja memiliki atau tidak memiliki nilai kembalian. Gambar 3.2 merupakan
method yang dapat mengembalikan suatu nilai. Sedangkan method yang tidak memiliki nilai
kembalian menggunakan kata kunci void seperti pada Gambar 3.3.
kepala
method public static void printHello(){
badan method System.out.println("Hello”);
}
(a)
printHello();
(b)
Gambar 3.3 Cara mendefinisikan (a) dan memanggil (b) method tanpa nilai kembalian
Parameter masukan pada method bekerja seperti placeholder. Ketika method tersebut
dipanggil, Kita dapat memasukkan suatu nilai ke dalam parameter. Nilai tersebut dikenal
dengan istilah parameter aktual. Jumlah parameter masukan sangat beragam sesuai
kebutuhan, bahkan yang tidak mencantumkan parameter masukan juga tidak apa-apa.
Kembali pada PersegiPanjang, Gambar 3.3 adalah contoh UML class diagram dimana
PersegiPanjang memiliki 2 objek. Class PersegiPanjang sendiri memiliki 2 property bertipe
data integer yaitu panjang dan lebar. Memiliki 2 konstuktor dan 2 method.
36
PersegiPanjang
panjang: int
lebar: int
PersegiPanjang()
PersegiPanjang(panjangBaru: int, lebarBaru: int)
getLuas(): int
getKeliling(): int
panjang = 0 panjang = 8
lebar = 0 lebar = 5
Implementasi dari UML Gambar 3.3 tersebut disajikan pada Kode 3.1 dan Kode 3.2.
5
6 //konstruktor dari objek PersegiPanjang
7 PersegiPanjang(){
8
9 }
10
Konstruktor
11 //konstruktor dari objek PersegiPanjang
12 PersegiPanjang(int panjangBaru, int lebarBaru){
11 panjang = panjangBaru;
13 lebar = lebarBaru;
14 }
37
15
16 //mengembalikan nilai luas persegi panjang
17 int getLuas(){
18 return panjang*lebar;
19 }
20 Method
21 //mengembalikan nilai keliling persegi panjang
22 int getKeliling(){
23 return 2*(panjang+lebar);
24 }
25 }
38
Output:
Luas persegi panjang 1 = 0 * 0 = 0
Luas persegi panjang 2 = 8 * 5 = 40
Berdasarkan Kode 3.1 terdapat template atau cetak biru persegi panjang yang didalamnya
terdiri dari property, konstruktor, dan method. Sedangkan untuk membuat objek terdapat
pada file PersegiPanjangDemo.java. Sintaks penulisan objek sebagai berikut:
Saat objek pertama kali diinisialisasi, otomatis memanggil method konstruktor. Terdapat 2
konstruktor di class Persegi, konstruktor pertama tidak memiliki parameter masukan dan
konstruktor ke-2 memiliki 2 parameter masukan. Memiliki nama method yang sama namun
parameter yang berbeda disebut dengan overloading method. Penjelasan tentang overloading
method yang lebih lengkap terdapat pada Bab 3.3.
Gambar 3.4 dan Kode 3.1 sama-sama menunjukkan pemanggilan method, namun dengan
cara berbeda. Gambar 3.4 memanggil method biasa sedangkan kode 3.1 memanggil method
dari class. Jika method biasa hanya menggunakan sintak namaMethod(parameter
masukan). Jika method dari class menggunakan sintak namaObjek.namaMethod(parameter
39
masukan). Begitu pula cara memanggil variabel dari class menggunakan sintak
namaObjek.namaVariabel sedangkan variabel biasa menggunaan sintak namaVariabel. Lihat
Gambar 3.5 untuk mendapatkan informasi yang lebih jelas.
namaVariabel namaObjek.namaVariabel
40
nama yang sama namun berbeda parameter masukannya. Berikut contoh kode program yang
terdiri dari 3 method dengan nama yang sama namun dengan beberapa variasi parameter
masukan.
41
25 else
26 return angka2;
27 }
28
29 // Mengembalikan nilai terbesar dari 3 parameter masukan double
30 public static double max(double angka1, double angka2, double
angka3){
31 return max(max(angka1, angka2), angka3);
32 }
33 }
Ketika memanggil max(3, 9), method max yang digunakan adalah method max yang
memiliki 2 parameter masukan integer. Ketika memanggil max(4.25, 4.0), method max
yang digunakan adalah method max yang memiliki 2 parameter masukan double. Ketika
memanggil max(4.25, 4.0, 5.6), method max yang digunakan adalah method max yang
memiliki 3 parameter masukan double.
Misal, jika kita memanggil max(2, 3.0) apakah bisa dijalankan? Jawabannya adalah bisa.
Ketika memanggil max(2, 3.0), method max yang digunakan adalah method max yang
memiliki 2 parameter masukan double. Masukan 2 akan otomatis berubah menjadi nilai
double dan memenuhi method ini.
Kenapa method max(double, double) tidak digunakan untuk max(3, 9), sedangkan baik
max(double, double) dan max(int, int) dapat digunakan? Karena compiler Java
menemukan bahwa method yang cocok untuk max(3, 9) adalah max(int, int) dibanding
max(double, double).
42
modifier NamaClass(parameter masukan){
//badan konstruktor
}
PersegiPanjang(){ PersegiPanjang(int panjangBaru, int lebarBaru){
panjang = panjangBaru;
lebar = lebarBaru;
} }
PersegiPanjang
+panjang: int
+lebar: int
+jumlahObjek: int= 0
+PersegiPanjang()
+PersegiPanjang(panjangBaru: int, lebarBaru: int)
+getJumlahObjek(): int
+getLuas(): int
+getKeliling(): int
panjang = 0 panjang = 8
lebar = 0 lebar = 5
jumlahObjek = 2 jumlahObjek = 2
Gambar 3.7 UML class diagram dengan variabel dan method static
Kode 3.4 merupakan implementasi dari Class PersegiPanjang setelah ditambahkan variabel
static dan method static. Kode 3.5 merupakan kode untuk pengetesan Class PersegiPanjang
yang telah dimodifikasi sebelumnya.
44
3 public int panjang;
4 public int lebar;
5 public static int jumlahObjek = 0; Variabel static
6
7 //konstruktor dari objek PersegiPanjang
8 public PersegiPanjang(){
Menambah nilai 1 pada
9 jumlahObjek++; variabel jumlahObjek
10 }
11
12 //konstruktor dari objek PersegiPanjang
11 public PersegiPanjang(int panjangBaru, int lebarBaru){
13 panjang = panjangBaru;
14 lebar = lebarBaru;
Menambah nilai 1 pada
15 jumlahObjek++; variabel jumlahObjek
16 }
17
18 //mengembalikan nilai getJumlahObjek
19 public static int getJumlahObjek(){
20 return jumlahObjek; Method Static
21 }
22
23 //mengembalikan nilai luas persegi panjang
24 public int getLuas(){
25 return panjang*lebar;
26 }
27
28 //mengembalikan nilai keliling persegi panjang
29 public int getKeliling(){
30 return 2*(panjang+lebar);
31 }
32 }
45
Kode 3.5 PersegiPanjangDemo.java
1 public class PersegiPanjangDemo {
2 /* Main Method */
3 public static void main(String[] args){
4 System.out.println("Sebelum membuat objek");
5 //memanggil variabel static
6 System.out.println("Jumlah objek = "+
PersegiPanjang.jumlahObjek);
7
8 //Membuat objek persegiPanjang1
9 PersegiPanjang persegiPanjang1 = new PersegiPanjang();
10 System.out.println("\nSetelah membuat objek persegiPanjang1");
11
12 //memanggil variabel instance
13 System.out.println("Panjang = "+persegiPanjang1.panjang+
“\nLebar = “+persegiPanjang1.lebar);
14
15 //memanggil method static
16 System.out.println("Jumlah objek = "+
PersegiPanjang.getJumlahObjek());
17
18 //Membuat objek persegiPanjang2
19 PersegiPanjang persegiPanjang2 = new PersegiPanjang(8, 5);
20 System.out.println("\nSetelah membuat objek persegiPanjang1");
21 //memanggil variabel instance
22 System.out.println("Panjang = "+ persegiPanjang2.panjang +
"\nLebar="+persegiPanjang2.lebar);
23
24 //memanggil variabel static
25 System.out.println("Jumlah objek = "+
PersegiPanjang.jumlahObjek);
26 }
46
27 }
Output:
Sebelum membuat objek
Jumlah objek = 0
Setelah membuat objek persegiPanjang1
Panjang = 0
Lebar = 0
Jumlah objek = 1
Setelah membuat objek persegiPanjang2
Panjang = 8
Lebar = 5
Jumlah objek = 2
Berdasarkan Kode 3.4 dan Kode 3.5, variabel instance (panjang dan lebar) milik
instance dan memiliki penyimpanan memori yang tidak tergantung satu sama lain. Variabel
static (jumlahObjek) dibagikan oleh semua instance dari kelas yang sama.
package p2;
package p1; package p1;
47
Selain visibility modifier public dan default, Java menyediakan visibility modifier
private dan protected untuk anggota kelas. Modifier private membuat method dan property
hanya dapat diakses dari dalam kelasnya sendiri. Untuk modifier protected, Kita dapat
mengakses bidang data yang dilindungi atau metode dalam superclass dari subclassnya.
Modifier protected mengizinkan subclass untuk mengakses property atau metode yang
didefinisikan dalam superclass, tetapi tidak mengizinkan non subclass dalam package yang
berbeda untuk mengakses itu. Materi superclass dan subclass akan dibahas selengkapnya
pada Bab 7. Skema visibility modifier meningkat dalam urutan di bawah ini, sesuai Gambar
3.9.
Dari gambar 3.9 menjelaskan bahwa cakupan paling kecil adalah private, dimana
modifier private hanya dapat diakses pada class yang sama. Selanjutnya adalah modifier
default, dimana modifier default hanya dapat diakses pada class dan package yang sama.
Disusul modifier protected, dimana modifier protected dapat diakses pada class dan
package yang sama serta subclass baik di package yang berbeda atau package yang sama.
Terakhir, cakupan paling besar adalah public, dimana modifier public dapat diakses pada
class dan package yang sama maupun berbeda serta subclass baik di package yang berbeda
atau package yang sama. Ringkasan cakupan visibilitas ke-empat modifier dapat dilihat pada
Tabel 3.1
48
Tabel 3.1 Visibilitas property dan method
Modifier pada Akses dari Akses dari Akses dari Akses dari
anggota class class yang package yang subclass di luar
sama sama luar package package
Public (+) v v v v
Protected (#) v v v -
Default/ no modifier v v - -
Private (-) v - - -
3.7 Kesimpulan
1. Class adalah template, cetak biru, atau kontrak yang menentukan apa yang akan
menjadi bidang data dan metode objek.
2. Objek adalah turunan dari kelas. Kita dapat menggunakan kata kunci new untuk
membuat objek baru dan operator titik (.) untuk mengakses property dan method dari
objek tersebut.
3. Overloading method adalah method-method yang memiliki nama yang sama namun
berbeda-beda parameter masukannya.
4. Konstruktor merupakan method khusus yang dirancang dan dipanggil untuk
melakukan tindakan inisialisasi. Destruktor merupakan method khusus yang akan
dipanggil saat objek dihapus dari memori. Bahasa pemrograman Java tidak memiliki
method destructor karna Java memiliki garbage collector untuk mengelola memori.
5. Terdapat 2 macam property/ method antara lain:
a. Property/ method instance terkait dengan instance spesifik dari kelas, property/
method tersebut tidak dibagikan di antara objek dari kelas yang sama. Cara
pemanggilannya yaitu NamaObjek.property atau NamaObjek.namaMethod.
b. Property/ method statis dapat digunakan bersama oleh semua instance dari
kelas yang sama. Cara pemanggilannya menggunakan NamaClass.property
atau NamaClass.namaMethod.
49
6. Visibility modifiers dapat digunakan untuk menentukan visibilitas kelas dan
anggotanya. Terdapat 4 variasi visibility modifiers antara lain:
a. Visibility modifier public untuk class, method, dan property untuk menyatakan
bahwa mereka dapat diakses dari kelas lain.
b. Jika tidak ada visibility modifiers yang digunakan, maka visibility modifiers
nya default (no modifier) yang berarti class, method, dan property dapat
diakses oleh kelas apa pun dalam package yang sama.
c. Modifier private membuat method dan property hanya dapat diakses dari
dalam kelasnya sendiri.
d. Modifier protected mengizinkan subclass untuk mengakses property atau
metode yang didefinisikan dalam superclass, tetapi tidak mengizinkan non
subclass dalam package yang berbeda untuk mengakses itu.
3.9 Praktikum
1. Buatlah program class Lingkaran yang merepresentasikan template lingkaran. Di
dalam class tersebut terdapat:
a. Property jari_jari dengan tipe data double
b. Property phi dengan tipe data double bernilai 3.14
c. Property static jumlahLingkaran dengan tipe data integer bernilai 0
d. Konstruktor pertama tanpa ada masukan dan tidak melakukan apa-apa
e. Konstruktor kedua memiliki 1 masukan yaitu jari_jari_baru bertipe data
double
f. Method getLuas, mengembalikan nilai luas lingkaran
50
g. Method getKeliling, mengembalikan nilai keliling lingkaran
h. Method static getJumlahLingkaran, mengembalikan nilai jumlah lingkaran
yang dibuat
Gunakan modifier default untuk semua property dan method. Buat juga 3 objek,
objek pertama tanpa inisialisasi jari_jari, objek kedua dengan inisialisasi jari_jari
dari property, dan objek ketiga dengan inisialisasi jari_jari dari konstuktor.
Gambar pula UML class diagramnya.
Mahasiswa
+nim: string
+nama: string
+alamat: string
+ipk: double
+Mahasiswa()
+Mahasiswa(nim: string)
+Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru: string)
+predikat(ipk: double): string
+cetak(): void
Penjelasan UML class diagram Mahasiswa
Atribut
nim bertipe data string dengan modifier public
nama bertipe data string dengan modifier public
alamat bertipe data string dengan modifier public
ipk bertipe data double dengan modifier public
Konstruktor
Mahasiswa()
Tidak melakukan apapun
Mahasiswa(nim: string)
o Beri nilai property nim milik class diisi dengan nilai nim masukan method
51
Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru:
string)
o Beri nilai property nim milik class diisi dengan nilai nimBaru masukan
method
o Beri nilai property nama milik class diisi dengan nilai namaBaru masukan
method
o Beri alamat property nama milik class diisi dengan nilai alamatBaru
masukan method
o Beri nilai property ipk milik class diisi dengan nilai ipkBaru masukan
method
Method
predikat(ipk: double): String
Jika ipk diantara 2.0 sampai 2.75, kembalikan string “Memuaskan”
Jika ipk diantara 2.76 sampai 3.5, kembalikan string ‘Sangat memuaskan”
Jika ipk diantara 3.51 sampai 4.0, kembalikan string “Dengan pujian”
Jika tidak, kembalikan string “-“
cetak(): void
o Menampilkan nim, nama, alamat, ipk dan predikat dalam susunan vertical
Contoh output:
Nama = Dilan
Alamat = Bandung
NIM =1
IPK = 3.51
Predikat = Dengan Pujian
52
BAB 4 ENKAPSULASI
persegiPanjang2.panjang = 6;
persegiPanjang2.lebar = 7;
Pemberian nilai tersebut dilakukan secara langsung ke property. Cara seperti itu merupakan
contoh yang tidak bagus karena dua alasan, yaitu:
1. Data dapat dirusak. Misalnya, property jumlahObjek berfungsi untuk menampung nilai
jumlah objek yang dibuat, tetapi bisa saja diset dengan manual misalnya,
Lingkaran.jumlahObjek = 10;
2. Class menjadi sulit dipertahankan dan rentan terhadap bug. Misalkan kita ingin
memodifikasi class PersegiPanjang untuk memastikan bahwa nilai panjang tidak negatif
setelah yang lain program sudah menggunakan class tersebut. Kita harus mengubah tidak
hanya class Circle tetapi juga program yang menggunakannya karena klien mungkin telah
memodifikasi nilai panjang secara langsung misalnya
persegiPanjang2.panjang = -6;
Untuk mencegah modifikasi property secara langsung, Kita harus mendeklarasikan property
dengan modifier private. Cara tersebut dikenal sebagai enkapsulasi. Property dengan
modifier private tidak dapat diakses oleh objek dari luar class. Namun, klien sering
mengambil dan memodifikasi property. Untuk membuat sebuah property private dapat
diakses, Kita perlu menyediakan method setter dan getter.
53
4.2 Setter-Getter Method
Method setter berfungsi untuk memperbarui nilai dari property private sedangkan
method getter berfungsi untuk mengambil nilai dari property private. Method setter juga
dikenal dengan nama mutator dan method getter dikenal dengan nama accesor. Kedua
method tersebut memiliki sintak sebagai berikut:
Method setter
public void setNamaProperty(parameter masukan)
Mari kita buat class PersegiPanjang biasa pada Gambar 3.7 pada Bab sebelumnya ke
dalam bentuk enkapsulasi dengan dilengkapi method setter dan getter.
PersegiPanjangEnkapsulasi
-panjang: int
-lebar: int
-jumlahObjek: int= 0
+PersegiPanjang()
+PersegiPanjang(panjangBaru: int, lebarBaru: int)
+setPanjang(panjangBaru: int): void
+getPanjang(): int
+setLebar(lebar: int): void
+getLebar(): int
+getJumlahObjek(): int
+getLuas(): int
+getKeliling(): int
54
pp1: PersegiPanjangEnkapsulasi pp3: PersegiPanjangEnkapsulasi
panjang = 0 panjang = 8
lebar = 0 lebar = 5
pp2: PersegiPanjangEnkapsulasi
panjang = 6
lebar = 7
Gambar 4.2 Class dan Objek PersegiPanjangEnkapsulasi dalam UML Class Diagram
Pada gambar UML class diagram di atas, terdapat beberapa perbedaan. Pertama pada
property, lambang + diganti dengan – agar modifier public berganti dengan private. Kedua
bertambahnya 4 method, yaitu method setter dan getter untuk panjang serta method setter
dan getter untuk lebar. Dari Gambar 4.2 kita bisa membuat kode program seperti pada Kode
4.1 dan pengetesannya pada Kode 4.2.
55
15 jumlahObjek++;
16 }
17 //method setter untuk property panjang
18 public void setPanjang(int panjangBaru){
19 panjang = panjangBaru;
20 }
21 //method getter untuk property panjang
22 public int getPanjang(){
23 return panjang;
24 }
25 //method setter untuk property lebar
26 public void setLebar(int lebar){
27 //gunakan kata kunci this karena nama masukan parameter
28 //lebar sama dengan nama property lebar
29 this.lebar = lebar;
30 }
31 //method getter untuk property lebar
32 public int getLebar(){
33 return lebar;
34 }
35 //method getter untuk mengembalikan nilai getJumlahObjek
36 public int getJumlahObjek(){
37 return jumlahObjek;
38 }
39 //method getter untuk mengembalikan nilai luas persegi panjang
40 public int getLuas(){
41 return panjang*lebar;
42 }
43 //method getter untuk mengembalikan nilai keliling
44 public int getKeliling(){
45 return 2*(panjang+lebar);
46 }
56
47 }
57
27 PersegiPanjangEnkapsulasi(8, 5);
28 System.out.println("Luas persegi panjang 3 = "+
29 pp3.getPanjang()+" * "+pp3.getLebar()+" = "+pp3.getLuas());
30 System.out.println("Jumlah objek = "+
31 PersegiPanjangEnkapsulasi.getJumlahObjek());
32 }
33 }
Output:
Sebelum membuat objek
Jumlah objek = 0
Luas persegi panjang 1 = 0 * 0 = 0
Jumlah objek = 1
Luas persegi panjang 2 = 6 * 7 = 42
Jumlah objek = 2
Luas persegi panjang 3 = 8 * 5 = 40
Jumlah objek = 3
Berdasarkan UML class diagram Gambar 4.2, simbol ‘–‘ ditulis dengan modifier
private yang dapat dilihat diawal Kode 4.1 PersegiPanjangEnkapsulasi.java. Method setter
untuk property panjang terdapat pada method setPanjang yang berfungsi untuk memberi
nilai property panjang diisi dengan nilai masukan panjangBaru milik method. Method
getter pada panjang terdapat pada method getPanjang hanya berfungsi untuk
mengembalikan nilai dari property panjang.
58
File PersegiPanjangEnkapsulasiDemo.java berisi tentang deklarasi 3 objek antara lain
objek pp1, pp2, dan pp3. Cara memanggil method setter yaitu pp2.setPanjang(6);.
Sedangkan sebelumnya, cara memberi nilai pada property seperti ini
persegiPanjang2.panjang = 6;. Cara memanggil method getter yaitu
pp2.getPanjang(). Sedangkan kode sebelumnya (Kode 3.4), cara mengambil nilai pada
property seperti ini persegiPanjang2.panjang. Pada Bab ini kita mempelajari bahwa
penggunaan method setter dan getter dapat melindungi data dan membuat kelas mudah
dikelola.
4.3 Kesimpulan
1. Konsep enkapsulasi adalah membuat property menjadi memiliki akses dengan batasan
khusus sehingga dapat melindungi data dan membuat kelas mudah dikelola.
2. Property dengan modifier private tidak dapat diakses oleh objek dari luar class.
Untuk membuat sebuah property private dapat diakses, kita perlu menyediakan
mekanisme method setter dan getter.
3. Method setter berfungsi untuk memperbarui nilai dari property private sedangkan
method getter berfungsi untuk mengambil nilai dari property private.
4.5 Praktikum
1. Buatlah program class LingkaranEnkapsulasi yang merupakan modifikasi dari class
Lingkaran. Class LingkaranEnkapsulasi merepresentasikan template Lingkaran yang
menerapkan konsep enkasulapsi. Di dalam class tersebut terdapat:
a. Property jari_jari dengan tipe data double
b. Property phi dengan tipe data double bernilai 3.14
c. Property static jumlahLingkaran dengan tipe data integer bernilai 0
d. Konstruktor pertama tanpa ada masukan dan tidak melakukan apa-apa
e. Konstruktor kedua memiliki 1 masukan yaitu jari_jari_baru bertipe data
double
59
f. Method setJari memiliki 1 masukan yaitu jari_jari bertipe data double yang
memperbarui nilai dari property jari_jari
g. Method getJari, mengembalikan nilai jari_jari
h. Method getLuas, mengembalikan nilai luas lingkaran
i. Method getKeliling, mengembalikan nilai keliling lingkaran
j. Method static getJumlahLingkaran, mengembalikan nilai jumlah lingkaran
yang dibuat
Gunakan modifier private untuk semua property serta modifier public untuk
semua konstruktor dan method. Buat juga 3 objek, objek pertama tanpa inisialisasi
jari_jari, objek kedua dengan inisialisasi jari_jari dari method setter setJari, dan
objek ketiga dengan inisialisasi jari_jari dari konstuktor. Gambar pula UML class
diagramnya.
MahasiswaEnkapsulasi
-nim: string
-nama: string
-alamat: string
-ipk: double
+Mahasiswa()
+Mahasiswa(nim: string)
+Mahasiswa(nimBaru: string, namaBaru: string, alamatBaru: string, ipkBaru: string)
+setNim(nim: string): void
+getNim(): string
+setNama(nama: string): void
+getNama(): string
+setAlamat(alamat: string): void
+getAlamat (): string
60
+setIpk(ipk: double): void
+getIpk(): double
+predikat(ipk: double): Sstring
+cetak(): void
61
memberi nilai property nama milik class diisi dengan nilai masukan method
+getNama(): string
mengembalikan nilai dari property nama
+setAlamat(alamat: string): void
memberi nilai property alamat milik class diisi dengan nilai masukan method
+getAlamat (): string
mengembalikan nilai dari property alamat
+setIpk(ipk: double): void
memberi nilai property ipk milik class diisi dengan nilai masukan method
+getIpk(): double
mengembalikan nilai dari property ipk
predikat(ipk: double): String
Jika ipk diantara 2.0 sampai 2.75, kembalikan string “Memuaskan”
Jika ipk diantara 2.76 sampai 3.5, kembalikan string ‘Sangat memuaskan”
Jika ipk diantara 3.51 sampai 4.0, kembalikan string “Dengan pujian”
Jika tidak, kembalikan string “-“
cetak(): void
o Menampilkan nim, nama, alamat, ipk dan predikat dalam susunan vertical
Contoh output:
Nama = Dilan
Alamat = Bandung
NIM =1
IPK = 3.51
Predikat = Dengan Pujian
62
BAB 5 INTERAKSI ANTAR OBJEK
5.2 Asosiasi
Asosiasi adalah hubungan umum yang menggambarkan keterkaitan antara 2 class.
Sebagai contoh, seorang penonton yang menonton film adalah keterkaitan class Penonton dan
class Film. Anggota rumah produksi, seorang sutradara membuat film adalah keterkaitan
class RumahProduksi dan class Film. Asosiasi dapat digambarkan dalam UML class diagram
pada gambar 5.1.
Menonton Membuat
1..300 * * 1..2
Penonton Film Sutradara
RumahProduksi
Gambar 5.1 UML asosiasi pada class Penonton, Film, dan RumahProduksi
Gambar 5.1 menunjukkan bahwa penonton dapat menonton beberapa film. Anggota
rumah produksi (sutradara) dapat membuat beberapa film. Film mungkin memiliki 1 sampai
300 penonton dan film dibuat oleh 1 atau 2 anggota rumah produksi (sutradara).
Sebuah asosiasi digambar oleh garis solid antar class. Label menunjukkan keterkaitan
antar class dan segitiga hitam menunjukkan arah hubungan. Pada gambar 5.1 memiliki label
menonton dan membuat. Simbol segitiga hitam menunjukkan bahwa penonton dapat
menonton beberapa film. Setiap class yang terlibat mungkin memiliki nama peran yang
menggambarkan peran yang dimainkannya dalam hubungan. Pada gambar 5.1, sutradara
adalah peran dari RumahProduksi.
Setiap class yang terlibat dalam hubungan asosiasi dapat menentukan multiplicity
yang ditempatkan disamping class dekat garis solid. Multiplicity berfungsi untuk menentukan
berapa banyak objek class yang terlibat dalam hubungan di UML. Multiplicity simbol *
berarti objek yang tidak terbatas dan interval m…n berarti objek yang berjumlah diantara
63
angka m dan n. Pada gambar 5.1, penonton dapat menonton film sebanyak apapun dan setiap
film dapat ditonton antara 1 sampai 300 orang dalam satu kali penayangan. Setiap film
diproduksi oleh 1 atau 2 anggota rumah produksi, dan sutradara dapat membuat film
sebanyak apapun.
Dalam bahasa pemrograman Java, kita dapat menerapkan keterkaitan antar class
menggunakan property dan method. Gambar 5.2 menggambarkan implementasi dari gambar
5.1. Keterkaitan penonton menonton film dapat diimplemntasikan menggunakan method
nontonFilm di class Penonton dan method tambahPenonton di class Film. Keterkaitan rumah
produksi membuat film diimplementasikan menggunakan method buatFilm di class
RumahProduksi dan method setRumahProduksi di class Film. Class penonton dapat
menggunakan listFilm untuk menyimpan film-film apa saja yang ditonton, class
RumahProduksi dapat menggunakan listFilm untuk menyimpan film-film yang dibuat, dan
class Film dapat menggunakan listPenonton untuk menyimpan para penonton yang menonton
dan property rumahProduksi untuk menyimpan informasi pembuat film.
Gambar 5.2 Asosiasi yang diimplementasikan menggunakan property dan method di class
64
5.3 Agregasi dan Komposisi
Agregasi adalah bentuk khusus dari asosiasi yang mewakili keterkaitan antara dua
objek. Pemilik objek disebut aggregating object dan kelasnya disebut aggregating class.
Objek subjek disebut aggregated object, dan kelasnya disebut aggregated class. Kita dapat
menyebut agregasi antara dua objek sebagai komposisi jika keberadaan aggregated object
tergantung pada aggregating object. Maka, aggregated object tidak dapat tercipta dengan
sendirinya.
Contoh "seorang penonton memiliki nama" adalah komposisi hubungan antara class
Penonton dan class Nama karena nama tergantung pada penonton, sedangkan "seorang
penonton memiliki alamat" adalah hubungan agregasi antara class Penonton dan class Alamat
karena alamat bisa ada dengan sendirinya. Komposisi menyiratkan kepemilikan. Satu objek
memiliki objek lain. Ketika objek pemilik dihancurkan, objek yang terkait hancur juga.
Lihat gambar 5.3 yang berisikan UML, simbol belah ketupan hitam menyatakan
bahwa aggregating class (Penonton) memiliki hubungan komposisi dengan aggregated class
(Nama). Sedangkan simbol belah ketupan putih yang melekat pada aggregating class
(Penonton) memiliki hubungan agregrasi dengan aggregated class (Alamat).
Komposisi Agregrasi
1 1 1…3 1
Nama Penonton Alamat
Pada gambar 5.3, setiap penonton hanya memiliki satu multiplicity alamat dan
masing-masing alamat bisa dibagikan oleh hingga 3 penonton. Setiap penonton memiliki satu
nama, dan nama tersebut unik untuk setiap penonton.
65
public class Nama{ public class Penonton{ public class Alamat{
… private Nama nama; …
private Alamat alamat;
…
} } }
Agregasi bisa muncul di antara objek-objek dari kelas yang sama. Misalnya, seorang
pegawai mungkin memiliki pengawas. Gambar 5.5 menjelaskan hubungan "seorang pegawai
memiliki pengawas". Seorang pengawas dapat direpresentasikan sebagai property di kelas
Pegawai.
1
public class Pegawai{
private Pegawai pengawas;
Penonton
…
1 pengawas
}
Jika seorang pegawai dapat memiliki beberapa pengawas, maka kita perlu
menambahkan array, lihat gambar 5.6. Array tersebut berguna untuk pengawas produksi,
pengawas kualitas, dan lain-lain.
66
mandiri sebagai tugas praktikum. Kode sumber yang digunakan menerapkan konsep array of
object, kita dapat memahami praktiknya pada bab ini dan akan belajar tentang teorinya pada
bab 6.5.
Penonton RumahProduksi
-nama: String -sutradara: String
-listFilm: Film[] = new Film[1000]; -listFilm: Film[] = new Film[1000];
-jumlahFilm: int -jumlahFilm: int
Film
-namaFilm: String
-listPenonton: Penonton[] = new Penonton [300];
-jumlahPenonton: int
-listRumahProduksi: RumahProduksi[] = new RumahProduksi [300];
-jumlahRumahProduksi: int
+Film(namaFilm: String)
+getNamaFilm(): String
+tambahPenonton(p Penonton): void
+getPenonton(): Penonton[]
+getJumlahPenonton (): int
+setRumahProduksi(rp RumahProduksi): void
+getRumahProduksi(): RumahProduksi[]
+getRumahProduksi(): int
+main(args String[]): void
Gambar 5.7 UML class diagram ClassPenonton, Film, dan RumahProduksi Lengkap
67
Kode 5.1 Penonton.java
1 public class Penonton {
2 //property
3 private String nama;
4 /*Sebagai tugas praktikum 1, konversi property dibawah ini
5 menggunakan kode sumber
6 -listFilm: Film[] = new Film[1000];
7 //Array untuk menampung Film
8 -jumlahFilm: int
9 //Jumlah dari Film yang ditampung (default = 0)
10 sampai property ini*/
11
12 //konstruktor
13 public Penonton(String nama){
14 this.nama = nama;
15 }
16
17 //method
18 public String getNamaPenonton(){
19 return nama;
20 }
21
22 /*Buat dan isi method-method dibawah ini
23 +nontonFilm(f Film): void
24 //Tambah film yang ditonton
25 +getListFilm(): Film[]
26
//Kembalikan list film yang ditonton
27
+getJumlahFilm(): int
28
//Kembalikan jumlah film yang ditonton
29
sampai method ini*/
30
31
public static void main(String[] args) {
68
32 Penonton p1 = new Penonton("Abas");
33 Penonton p2 = new Penonton("Yogi");
34 Penonton p3 = new Penonton("Anisa");
35
36 p1.nontonFilm(new Film("Dilan 1991"));
37 p1.nontonFilm(new Film("Avenger: Endgame"));
38
39 p2.nontonFilm(new Film("Dilan 1991"));
40 p2.nontonFilm(new Film("Avenger: Endgame"));
41
42 p3.nontonFilm(new Film("Dilan 1991"));
43
44 System.out.println("Jumlah film yang ditonton
"+p1.getNamaPenonton()+" adalah "+p1.getJumlahFilm());
45 Film[] f1 = p1.getListFilm();
46 System.out.print("|| ");
47 for(int i=0; i<p1.getJumlahFilm(); i++){
48 System.out.print(f1[i].getNamaFilm()+" || ");
49 }
50
51 System.out.println("\n");
52
53 System.out.println("Jumlah film yang ditonton
"+p2.getNamaPenonton()+" adalah "+p2.getJumlahFilm());
54
Film[] f2 = p2.getListFilm();
55
System.out.print("|| ");
56
for(int i=0; i<p2.getJumlahFilm(); i++){
57
System.out.print(f2[i].getNamaFilm()+" || ");
58
}
59
60
System.out.println("\n");
61
69
62 System.out.println("Jumlah film yang ditonton
"+p3.getNamaPenonton()+" adalah "+p3.getJumlahFilm());
63 Film[] f3 = p3.getListFilm();
64 System.out.print("|| ");
65 for(int i=0; i<p3.getJumlahFilm(); i++){
66 System.out.print(f3[i].getNamaFilm()+" || ");
67 }
68 }
69 }
Output:
Jumlah film yang ditonton Abas adalah 2
|| Dilan 1991 || Avenger: Endgame ||
70
13 }
14
15 //method
16 public String getNamaFilm(){
17 return namaFilm;
18 }
19 public void tambahPenonton(Penonton p){
20 listPenonton[jumlahPenonton] = p;
21 jumlahPenonton++;
22 }
23 public Penonton[] getPenonton(){
24 return listPenonton;
25 }
26 public int getJumlahPenonton(){
27 return jumlahPenonton;
28 }
29 public void setRumahProduksi(RumahProduksi rp){
30 listRumahProduksi[jumlahRumahProduksi] = rp;
31 jumlahRumahProduksi++;
32 }
33 public RumahProduksi[] getRumahProduksi(){
34 return listRumahProduksi;
35 }
36 public int getJumlahRumahProduksi(){
37
return jumlahRumahProduksi;
38
}
39
public static void main(String[] args) {
40
Film film1 = new Film("Dilan 1991");
41
Film film2 = new Film("Avenger: Endgame");
42
43
film1.setRumahProduksi(new RumahProduksi("Pidi Baiq"));
44
film1.setRumahProduksi(new RumahProduksi("Fajar Bustomi"));
71
45
46 film2.setRumahProduksi(new RumahProduksi("Anthony Russo"));
47 film2.setRumahProduksi(new RumahProduksi("Joe Russo"));
48
49 film1.tambahPenonton(new Penonton("Abas"));
50 film1.tambahPenonton(new Penonton("Yogi"));
51 film1.tambahPenonton(new Penonton("Anisa"));
52
53 film2.tambahPenonton(new Penonton("Abas"));
54 film2.tambahPenonton(new Penonton("Yogi"));
55
56 System.out.println("=== Box Office 2019 ===");
57 System.out.println("Film 1 - "+film1.getNamaFilm());
58 System.out.print("Sutradara = ");
59 RumahProduksi[] rp1 = film1.getRumahProduksi();
60 for(int i=0; i<film1.getJumlahRumahProduksi(); i++){
61 System.out.print(rp1[i].getNamaSutradara()+", ");
62 }
63 System.out.println("");
64 System.out.println("Jumlah penonton film
"+film1.getNamaFilm()+" adalah "+film1.getJumlahPenonton());
65 Penonton[] p1 = film1.getPenonton();
66 System.out.print("|| ");
67 for(int i=0; i<film1.getJumlahPenonton(); i++){
68
System.out.print(p1[i].getNamaPenonton()+" || ");
69
}
70
System.out.println("\n\n");
71
System.out.println("Film 2 - "+film2.getNamaFilm());
72
System.out.print("Sutradara = ");
73
RumahProduksi[] rp2 = film2.getRumahProduksi();
74
for(int i=0; i<film2.getJumlahRumahProduksi(); i++){
75
System.out.print(rp2[i].getNamaSutradara()+", ");
72
76 }
77 System.out.println("");
78 System.out.println("Jumlah penonton film
"+film2.getNamaFilm()+" adalah "+film2.getJumlahPenonton());
79 Penonton[] p2 = film2.getPenonton();
80 System.out.print("|| ");
81 for(int i=0; i<film2.getJumlahPenonton(); i++){
82 System.out.print(p2[i].getNamaPenonton()+" || ");
83 }
84 System.out.println("");
85 }
86 }
Output:
=== Box Office 2019 ===
Film 1 - Dilan 1991
Sutradara = Pidi Baiq, Fajar Bustomi,
Jumlah penonton film Dilan 1991 adalah 3
|| Abas || Yogi || Anisa ||
73
7 -jumlahFilm: int
8 //Jumlah dari Film yang ditampung (default = 0)
9 sampai property ini*/
10
11 //konstruktor
12 public RumahProduksi(String sutradara){
11 this.sutradara = sutradara;
13 }
14
15 //method
16 public String getNamaSutradara(){
17 return sutradara;
18 }
19 /*Buat dan isi method-method dibawah ini
20 +buatFilm(f Film): void
21 //Tambah film yang dibuat
22 +getListFilm(): Film[]
23 //Kembalikan list film yang ditonton
24 +getJumlahFilm(): int
25 //Kembalikan jumlah film yang ditonton
26 sampai method ini*/
27
28 public static void main(String[] args) {
29 RumahProduksi rp1 = new RumahProduksi("Pidi Baiq");
30
RumahProduksi rp2 = new RumahProduksi("Fajar Bustomi");
31
RumahProduksi rp3 = new RumahProduksi("Anthony Russo");
32
RumahProduksi rp4 = new RumahProduksi("Joe Russo");
33
34
rp1.buatFilm(new Film("Dilan 1990"));
35
rp1.buatFilm(new Film("Dilan 1991"));
36
rp2.buatFilm(new Film("Dilan 1990"));
37
rp2.buatFilm(new Film("Dilan 1991"));
74
38 rp3.buatFilm(new Film("Avenger: Endgame"));
39 rp4.buatFilm(new Film("Avenger: Endgame"));
40
41 System.out.println("Jumlah film yang dibuat
42 "+rp1.getNamaSutradara()+" adalah "+rp1.getJumlahFilm());
43 Film[] f1 = rp1.getListFilm();
44 System.out.print("|| ");
45 for(int i=0; i<rp1.getJumlahFilm(); i++){
46 System.out.print(f1[i].getNamaFilm()+" || ");
47 }
48 }
49 }
Output:
Jumlah film yang dibuat Pidi Baiq adalah 2
|| Dilan 1990 || Dilan 1991 ||
Kode sumber 5.1 Class Penonton, Film, dan RumahProduksi
5.5 Kesimpulan
1. Keterkaitan umum antar class yaitu asosiasi, agregrasi, komposisi dan pewarisan
2. Asosiasi adalah hubungan umum yang menggambarkan keterkaitan antara 2 class.
3. Agregasi adalah bentuk khusus dari asosiasi yang mewakili keterkaitan antara dua
objek.
4. Pemilik objek disebut aggregating object dan kelasnya disebut aggregating class.
Objek subjek disebut aggregated object, dan kelasnya disebut aggregated class.
5. Kita bisa menyebut keteraitan komposisi jika keberadaan aggregated object
tergantung pada aggregating object.
75
5.7 Praktikum
1. Lengkapi kode sumber 5.1 pada class Penonton
2. Lengkapi kode sumber 5.1 pada class RumahProduksi
76
BAB 6 ARRAY DAN COLLECTION
Dibutuhkan suatu cara yang efisien agar programmer tidak perlu menuliskan banyak variabel
untuk menampung data. Beberapa bahasa pemrograman tingkat tinggi (seperti Java) sudah
menyediakan struktur data yang disebut dengan istilah Array. Array memungkinkan
programmer untuk menyimpan suatu koleksi elemen nilai yang serupa secara terurut dengan
tipe data yang sama. Sebagai contoh, programmer membutuhkan penyimpanan nilai-nilai
integer sebanyak 6 elemen nilai integer. Maka programmer hanya cukup membuat satu
variabel array untuk menampung seluruh koleksi dari setiap elemen nilai integer yang ada.
Setiap elemen nilai yang ada didalam Array diakses dengan suatu indeks. Indeks tersebut
merepresentasikan urutan data yang ada didalam array. Pada bahasa pemrograman Java
indeks dimulai dari nilai 0 (karena di bahasa pemrograman lain indeks kadang dimulai dari
nilai 1). Berikut adalah ilustrasi array ListNilai:
Indeks 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ListNilai 34 5 23 23 2 12 123 1 28 4 6 76 45 64 66
Pada contoh tersebut kita memiliki variabel array dengan nama ListNilai dengan tipe
integer. Misal dari ListNilai tersebut elemen pertama memiliki nilai 34 dan berada pada
indeks ke-0. Kita dapat menyederhanakan pemanggilan nilai pada indeks ke-0 tersebut
dengan cara ListNilai[0]=34. Sehingga jika dilihat elemen variabel ListNilai akan menjadi
77
ListNilai[0], ListNilai[1], ... , ListNilai[14]. Perhatikan bahwa jumlah seluruh
elemen array pada variabel ListNilai adalah 15, bukan 14. Hal itu dikarenakan indeks array
dimulai dari 0 bukan 1.
tipeElement[] arrRefVar;
atau,
tipeElement arrRefVar[];
Suatu tipeElement bisa jadi apapun termasuk tipe data primitif atau objek. Pada contoh
sintak kedua yaitu tipeElement arrRefVar[]; menggunakan gaya penulisan sintak pada
C/C++, untuk pemograman dengan Java menuliskan sintak array dengan cara tersebut tidak
disarankan. Implementasi kode dari deklarasi array dengan nama variabel ListNilai dengan
referensi array dari elemen bertipe data int adalah sebagai berikut:
int[] ListNilai;
Kita tidak dapat mengisi nilai element array sampai array tersebut selesai diciptakan. Setelah
mendeklarasikan array, untuk menciptakan array kita harus mengunakan operator new dan
melakukan assignment kepada tipe data yang direferensi pada variabel array tersebut. Berikut
adalah cara untuk menciptakan array pada variabel ListNilai yang sudah dideklarasikan
sebelumnya:
ListNilai[0] = 34;
ListNilai[1] = 5;
ListNilai[2] = 23;
ListNilai[3] = 23;
ListNilai[4] = 2;
ListNilai[5] = 12;
ListNilai[6] = 123;
ListNilai[7] = 1;
ListNilai[8] = 28;
ListNilai[9] = 4;
ListNilai[10] = 6;
ListNilai[11] = 76;
ListNilai[12] = 45;
ListNilai[13] = 64;
ListNilai[14] = 66;
Pada dasarnya sewaktu array dibuat, programmer mendefinisikan nilai kapasitas dari array
tersebut, misalnya pada variabel ListNilai memiliki kapasitas array sejumlah 15 elemen.
Jumlah atau kapasitas dari elemen tersebut dapat diakses dengan memanggil length dari nama
variabel array yang dideklarasikan sebelumnya, seperti ListNilai.length. Sehingga kita
dapat mengisi elemen array ke 14 dengan cara ListNilai[ListNilai.length-1] = 66;
dari pada ListNilai[14] = 66;. Kenapa harus ListNilai.length-1? Karena maksimal
indeks yang dimiliki ListNilai adalah 14 bukan 15 yang merupakan jumlah seluruh element
array.
Bagaimana jika programmer tidak men-assign nilai dari variabel array yang sudah dibuat?
Secara otomatis, ketika array diciptakan setiap elemen dari array tersebut akan diberi nilai
awal. Untuk tipe data numerik nilai awal adalah 0, karakter adalah \u0000, dan false untuk
boolean.
79
Inisialiasasi suatu array dapat dilakukan dengan dua cara. Cara pertama memasukkan nilai-
nilai elemen array saat array diciptakan secara langsung. Cara kedua adalah memasukkan
nilai-nilai setelah array di ciptakan. Cara pertama adalah sebagai berikut:
double[] arrNilai;
arrNilai[0] = 23.2;
arrNilai[1] = 1.2;
arrNilai[2] = 4.2;
Cara kedua memberikan leluasa kepada programmer untuk dapat menginisialisasi setiap
elemen array. Namun demikian, jika jumlah kapasitas array yang diciptakan besar, maka
tidak mungkin akan dilakukan di isi nilai satu per satu. Maka dari itu, biasanya programmer
akan menginisialisasi dengan bantuan perulangan. Berikut adalah Kode 7.1 merupakan
contoh mengisi array dan men-outputkan array dengan mekanisme perulangan.
80
11 arrNilai[i] = input.nextDouble();
12 // outputkan setiap elemen array yang sudah diinputkan
13 for (int i = 0; i < arrNilai.length; i++) {
14 System.out.print(arrNilai[i] + " ");
15 }
16 }
17 }
Kode 7.1 dapat dimodifikasi jika user tidak menginginkan untuk menginputkan nilai secara
manual melainkan dengan nilai random dari 0 sampai 10 misalnya. Maka mekanisme input
nilai pada setiap elemen array dapat diganti seperti berikut:
for(double e: arrNilai) {
System.out.print(e+" ");
}
81
arr1 = arr2;
Berikut adalah contoh implementasi menyalin nilai setiap member array dari suatu variabel
ke variabel lain:
Programmer juga dapat mencari element didalam array. Pada dasarnya array menyimpan
data-data yang mungkin akan di cari oleh user. Dalam pencarian data didalam array dapat
menggunakan algoritma pencarian seperti: pencarian linier/sekuensial, pencarian biner, dan
lain sebagainya. Berikut adalah contoh method yang berisi algoritma pencarian linier didalam
array.
83
public static int linierSearch(int[] arr, int yangdicari)
{
for(int i=0;i<arr.length;i++)
if(yangdicari == arr[i])
return i;
return -1;
}
Elemen array dapat juga diurutkan dengan suatu algoritma pengurutan. Seperti halnya
algoritma pencarian, banyak sekali algoritma pengurutan yang dapat digunakan untuk
mengurutkan setiap elemen array, seperti: pengurutan sekuensial, buble sort, merge sort, dan
lain sebagainya. Berikut adalah contoh method dengan pengurutan sekuensial:
Hanum 92 80
Heri 67 70
Dari data nilai tersebut, programmer dapat memubuat array 2D-nya dengan cara seperti
berikut:
double[][] nilai = {
{92,80},
{75.6,98.4},
{67,70}};
Perhatikan bahwa sintak [][] merupakan deklarasi untuk array 2D. Kode sebelumnya dapat
dibuat seperti berikut:
85
nilai[1][1] = 98.4; nilai[2][0] = 67; nilai[2][1] = 70;
Array 2D seringkali juga dapat digunakan untuk pengganti “matriks”. Untuk dapat
menggunakan array 2D biasanya programmer tetap memanfaatkan perulangan. Berikut
adalah kode untuk deklarasi dan inisialisasi array 2D dengan diberikan nilai random dan
kemudian dicetak pada console output:
//deklarasi
int[][] matriks = new int[10][10];
//inisialisasi dan pemberian nilai random 0-99
for(int baris=0;baris<matriks.length;baris++)
for(int kolom=0;kolom<matriks[baris].length;kolom++)
matriks[baris][kolom] = (int)(Math.random() * 100);
//cetak pada console output
for(int baris=0;baris<matriks.length;baris++) {
for(int kolom=0;kolom<matriks[baris].length;kolom++) {
System.out.print(matriks[baris][kolom]+” ”);
}
System.out.println();
}
86
7 }
8 public String getNim()
9 {
10 return this.nim;
11 }
12 }
A11.2020.1
A11.2020.2
87
A11.2020.3
A11.2020.4
A11.2020.5
A11.2020.6
A11.2020.7
A11.2020.8
A11.2020.9
A11.2020.10
Didalam ArrayList terdapat beberapa method yang seringkali digunakan. Berikut adalah
beberapa method tersebut:
88
add(obj) untuk menambahkan member list
Kode 7.5 adalah Kode TestMahasiswaIndividu yang isinya telah dirubah menggunakan
ArrayList.
89
Selain ArrayList juga terdapat Vector. Turunan dan implementasi yang sama dengan
ArrayList. Setiap vektor mencoba untuk mengoptimalkan manajemen penyimpanan dengan
mempertahankan kapasitasnya. Termasuk juga kedalam Java Collection. Lebih banyak
Method dari Vector jika dibandingakan dengan ArrayList. Vector tensinkronisasi sedangkan
ArrayList tidak. Tensinkronisasi maksudnya ”Thread-Safe" dari semua keuntungan method
yang sedang disinkronkan (melalui kata kunci synchronized). Berikut adalah method-method
yang ada pada Vector:
set(index, element) isikan elemen vector pada suatu index yang diingkan
90
8 System.out.println("Initial size: " + v.size());
9 System.out.println("Initial capacity: " + v.capacity());
10
11 v.addElement(new Integer(1));
12 v.addElement(new Integer(2));
v.addElement(new Integer(3));
13 v.addElement(new Integer(4));
14 System.out.println("Capacity after four additions: " +
v.capacity());
15
16 v.addElement(new Double(5.45));
17 System.out.println("Current capacity: " + v.capacity());
18
19 v.addElement(new Double(6.08));
20 v.addElement(new Integer(7));
21 System.out.println("Current capacity: " + v.capacity());
22
23 v.addElement(new Float(9.4));
24 v.addElement(new Integer(10));
25 System.out.println("Current capacity: " + v.capacity());
26 v.addElement(new Integer(11));
27 v.addElement(new Integer(12));
28 System.out.println("First element: " +
(Integer)v.firstElement());
29 System.out.println("Last element: " +
(Integer)v.lastElement());
30
31 if(v.contains(new Integer(3)))
32 System.out.println("Vector contains 3.");
33
34 }
35 }
91
6.7 Kesimpulan
Array sangat membantu programmer untuk membuat list dari serangkaian data. Terdapat dua
jenis array yaitu array statis dan dinamis. Array Statis merupakan array yang sudah memiliki
ukuran yang ditentukan dari awal. Sedangkan array dinamis merupakan array yang dapat
memiliki ukuran yang dapat disesuaikan (growable). Pada dasarnya stuktur data akan lebih
teratur dan rapi jika menggunakan array. Pada java sudah disediakan beberapa objek array
dinamis seperti ArrayList dan Vector.
6.9 Praktikum
Buat class Mobil dan kemudian buat implementasi list dari Mobil dengan menggunakan
ArrayList!
92
BAB 7 PEWARISAN
}
public class PersegiPanjang extends Bentuk{
….
PersegiPanjang }
Multi Level public class Bentuk{
Inheritance Bentuk ….
}
public class PersegiPanjang extends Bentuk{
PersegiPanjang ….
}
public class Balok extends PersegiPanjang{
….
Balok }
Hierarchical public class Bentuk{
Bentuk ….
Inheritance }
public class PersegiPanjang extends Bentuk{
….
PersegiPanjang Lingkaran
}
public class Lingkaran extends Bentuk{
….
}
93
Multiple public class Bentuk{
….
Inheritance <<interface>> }
Bentuk Dimensi public interface Dimensi{
….
}
Balok public class Balok extends implements Dimensi{
….
Kali ini, mari kita menggunakan contoh lain dengan jenis multi level inheritance.
Class Kendaraan sebagai superclass, class Udara sebagai subclass, dan class Pesawat sebagai
subclass lainnya. Berikut gambar 7.1 yang berisi tentang UML Pewarisan Kendaraan.
Kendaraan
-nama: string
-tahunProduksi: integer
+getNama(): string
+setNama(nama: String): void
+getTahunProduksi(): integer
+setTahunProduksi(tahunProduksi: int): void
+Kendaraan()
+Kendaraan(nama: string, tahunProduksi: int)
+cetak(): void
Udara
-mesin: boolean
+getMesin(): boolean
+setMesin(mesin: boolean): void
+Udara()
+Udara(nama: string, tahunProduksi: int, mesin: boolean)
+cetak(): void
Pesawat
-muatan: integer
+getMuatan(): integer
+setMuatan(muatan: integer ): void
94
+Pesawat ()
+Pesawat (nama: string, tahunProduksi: int, mesin: boolean, muatan: int)
+reset(nama: string, tahunProduksi; int, mesin: boolean, muatan: int): void
+kategori(muatan: int): String
+cetak(): void
Gambar 7.1. UML Pewarisan Kendaraan
Class Kendaraan memiliki property dan method umum, seperti contoh property nama
dan tahunProduksi, serta method-method pendukung. Karena class Kendaraan merupakan
superclass, maka semua property dan method tersebut dapat digunakan pada class Udara.
Class Udara juga merupakan superclass dari class Pesawat, jadi class Pesawat bisa
mengakses semua property dan method milik class Udara maupun class Kendaraan. Gunakan
katakunci extends untuk menunjukkan bahwa kelas tersebut merupakan pewarisan.
Subclass Superclass
Berikut kode sumber 7.1 yang menjelaskan pewarisan kendaraan berdasarkan UML gambar
7.1.
95
16 }
17 public Kendaraan(){ //overloading method, ingat.. kontruktor juga
merupakan methhod
18
19 }
20 public Kendaraan(String nama, int tahunProduksi){ //overloading
method
21 setNama(nama);
22 setTahunProduksi(tahunProduksi);
23 }
24 public void cetak(){//overriding method
25 System.out.println("Nama\t\t= "+nama);
26 System.out.println("Tahun Produksi = "+tahunProduksi);
27 }
28 }
96
15 super(nama, tahunProduksi); //memanggil konstruktor Kendaraan
16 setMesin(mesin);
17 }
18 public void cetak(){ //overriding method
19 super.cetak(); //memanggil method cetak dari Kendaraan
20 System.out.print("Mesin\t\t= ");
21 if(mesin==true)
22 System.out.println("Jet");
23 else
24 System.out.println("Baling-baling");
25 }
26 }
97
17 }
18 public void reset(String nama, int tahunProduksi, boolean mesin,
int muatan){
19 setNama(nama); //memanggil method setNama dari Kendaraan
20 setTahunProduksi(tahunProduksi); //memanggil method
setTahunProduksi dari Kendaraan
21 setMesin(mesin); //memanggil method setMesin dari Udara
22 setMuatan(muatan);
23 }
24 public String kategori(int muatan){
25 if(muatan<=100)
26 return "Mini";
27 else if(muatan<=200)
28 return "Sedang";
29 else
30 return "Besar";
31 }
32 public void cetak(){ //overriding method
33 super.cetak();//memanggil method cetak dari Udara
34 System.out.println("Muatan \t\t= "+muatan+" orang");
35 System.out.println("Kategori\t= "+kategori(muatan));
36 }
37 }
98
8 }
9 public static boolean isNamaSama(Pesawat p1, Pesawat p2){
10
11 if(p1.getNama().toLowerCase().equals(p2.getNama().toLowerCase()))
12 return true;
13 else
14 return false;
15 }
16 public static void main(String[] args){
17 Pesawat[] p = new Pesawat[3];
18 p[0] = new Pesawat();
19 p[1] = new Pesawat("Garuda Boeing 777", 1990, true, 305);
20 p[2] = new Pesawat("Citilink Airbus A320", 1988, true, 150);
21 p[0].reset("Wings Air ATR 72-500", 1988, false, 72);
22
23 p[0].cetak(); System.out.println("");
24 p[1].cetak(); System.out.println("");
25 p[2].cetak(); System.out.println("");
26
27 System.out.print("Nama pesawat pertama dan kedua ");
28 if(isNamaSama(p[0], p[1]))
29 System.out.println("sama");
30 else
31 System.out.println("tidak sama");
32
33
System.out.print("");
34
if(p[0].getMuatan()<min2(p[1].getMuatan(), p[2].getMuatan()))
35
System.out.println("Muatan paling sedikit =
"+p[0].getNama());
36
else if(p[1].getMuatan()<min2(p[0].getMuatan(),
p[2].getMuatan()))
37
System.out.println("Muatan paling sedikit =
99
"+p[1].getNama());
38 else
39 System.out.println("Muatan paling sedikit =
"+p[2].getNama());
40 }
41 }
Output:
Nama = Wings Air ATR 72-500
Tahun Produksi = 1988
Mesin = Baling-baling
Muatan = 72 orang
Kategori = Mini
100
7.3 Keyword Super
Keyword super digunakan untuk merujuk langsung property/ method/ konstruktor pada
superclass. Contoh masing-masing penerapan sebagai berikut:
Keyword super untuk property,contohnya super.nama berarti kita merujuk property nama
dari class Kendaraan
Keyword super untuk method, contohnya pada kode sumber 7.1 Udara.java baris ke-17.
Menggunakan super.cetak(); berarti memanggil method cetak dari Kendaraan. Karena
pada class Udara juga memiliki method cetak, maka kita wajib menggunakan super jika
ingin memanggil method cetak milik superclass
Keyword super untuk konstruktor, contohnya pada kode sumber 7.1 Udara.java baris ke-
13. Menggunakan super(nama, tahunProduksi); berarti memanggil konstruktor
Kendaraan yang memiliki parameter inputan nama dan tahunProduksi.
101
Tabel 7.1. Overriding vs Overloading
Overriding Overloading
7.6 Kesimpulan
Pewarisan/ inheritance memungkinkan kita untuk mendefinisikan class baru dari class yang
sudah ada. Konsep ini sangat penting dan bermanfaat untuk menghindari redundansi,
membuat sistem mudah dipahami dan musah dirawat. Superclass dapat juga disebut dengan
parent class atau base class berisi property atau method umum yang akan diturunkan untuk
subclass. Subclass disebut dengan child class, extended class, atau derived class, dapat
menggunakan property atau method dari superclass. Syarat untuk melakukan pewarisan,
harus menggunakan keywords extends. Keyword super digunakan untuk merujuk langsung
property/ method/ konstruktor pada superclass. Overriding method adalah method yang
memiliki nama dan parameter inputan yang sama. Itu berarti overriding menyediakan
implementasi baru untuk suatu method dalam subclass.
2. Apakah benar, kita bisa menggunakan semua property atau method dari superclass?
102
3. Apa keyword yang digunakan untuk melakukan pewarisan?
4. Apa keyword yang digunakan untuk merujuk langsung property/ method/ konstruktor
pada superclass?
7.8 Praktikum
1. Buatlah implementasi kode sumber dari UML class diagram di bawah ini!
2. Buatlah UML Class Diagram dan kode sumber yang menerapkan konsep pewarisan
dengan tema bebas! Minimal 3 class.
Bentuk
-warna: String = “red”
-isi: boolean = true
+Bentuk()
+Bentuk(warna: String, isi: boolean)
+getWarna(): String
+setWarna(warna: String): void
+setIsi(isi: boolean): boolean
+getIsi(): Boolean
+toString(): String
Lingkaran PersegiPanjang
-radius: double = 0.0 -panjang: double = 1.0
+Lingkaran() -lebar: double = 1.0
+Lingkaran(radius: double) +PersegiPanjang()
+Lingkaran(radius: double, warna: +PersegiPanjang(panjang: double, lebar:
String, isi: boolean) double)
+setRadius(): double +PersegiPanjang(panjang: double, lebar:
+getRadius(): double double: double, warna: String, isi: boolean)
+getLuas(): double +setPanjang(): void
+getKeliling(): double +getPanjang (): double
+toString(): String +setLebar(): void
+getLebar(): double
+getLuas(): double
+getKeliling(): double
+toString(): String
103
BAB 8 POLYMORPHISM
Lalu apa yang dimaksud dengan mereferensi? Hubungan inheritance memungkinkan subclass
untuk mewarisi fitur dari superclass-nya dengan tambahan fitur baru. Subclass adalah
spesialisasi superclass-nya. Setiap contoh dari subclass juga merupakan instance dari
superclass, tetapi tidak sebaliknya. Misalnya setiap kotak adalah ObjekGeometri, tetapi tidak
setiap ObjekGeometri adalah kotak. Karena itu, kita bisa selalu meneruskan instance dari
subclass ke parameter dari jenis superclassnya.
104
12 }
13 }
105
16 System.out.println(obj.getColor());
17 }
18 }
Output
Blue
Red
Black
Pada Kode 8.4 terdapat static method untuk mendisplay warna objek yaitu displayObject.
Pada mehthod tersebut terdapat parameter masukan ObjekGeometri yang berarti super-type
dari Lingkaran dan Kotak. Secara sederhana polymorphism berarti variabel super-type dapat
merujuk ke objek sub-type.
106
11 }
12 }
13 class GraduateStudent extends Student { }
14
15 class Student extends Person {
16 @Override
17 public String toString() {
18 return "Student" ;
19 }
20 }
21 class Person extends Object {
22 @Override
23 public String toString() {
24 return "Person";
25 }
26 }
Output:
Student
Student
Person
Java.lang.Object@15db9742
8.3 Kesimpulan
Salah satu konsep penting dalam pemrograman berorientasi objek adalah polymorphism.
Dengan polyomrphism objek akan dianggap memiliki banyak bentuk sehingga hal ini akan
memudahkan programmer dalam membuat referensi pemanggilan objek dari satu method.
Perluasan dari teknik polymorphism adalah Dynamic Binding. Dynamic Binding
memungkinkan programmer untuk melakukan polymorphism disepanjang hierarki turunan
dari suatu objek-objek dari sistem yang dikembangkan.
107
8.4 Kuis dan Latihan Soal
1. Jelaskan apa yang dimaksud dengan polymorphism?
2. Mengapa programmer membutuhkan polymorphism?
3. Apakah polymorphism selalu terkait dengan inheritance?
8.5 Praktikum
Buat class Kendaraan, Mobil, Truk, SepedaMotor, Bus, MobilBerat. Pehatikan bahwa
Kendaraan merupakan super-class dari Mobil, SepedaMotor, dan MobilBerat. Kemudian,
MobilBerat merupakan super-class dari Truk dan Bus. Buat method yang dapat
mengimplementasikan Dynamic Binding! Member class (property atau method) pada setiap
Class boleh dibuat sesuka hati.
108
BAB 9 ABSTRACT CLASS DAN INTERFACE
109
Kode 9.2 Ayam.java
1 public class Ayam extends Hewan
2 {
3 public void bernapas()
4 {
5 System.out.println("aku bernapas");
6 }
7
8 public static void main(String[] args)
9 {
10 Ayam kutuk = new Ayam();
11 kutuk.bisaTerbang(true);
12 System.out.println("Apakah bisa terbang:
"+kutuk.isTerbang());
13 kutuk.bernapas();
14 }
15 }
Setiap sub-class yang menerapkan abstract class sebagai super-class harus dengan
menambahkan kata kunci “extends” seperti halnya menerapkan pewarisan biasa. Perhatikan
bahwa jika didalam abstract class memiliki abstract method, abstract method tersebut harus
dijelaskan secara konkret di dalam sub-class seperti pada method bernapas(). Kita juga
tidak dapat membuat objek Hewan karena merupakan abstract class.
Abstract class
Hewan dan abstract
+terbang: boolean = false method
+bisaTerbang(terbang: boolean): void ditandai
+isTerbang(): boolean dengan huruf
+bernapas(): void miring
Ayam
110
Gambar 9.1 menjelaskan tentang UML class diagram abstract Hewan yang mewariskan
atribut dan methodnya ke class Ayam. Untuk menandakan jika class Hewan termaksud class
abstract, maka harus ditulis dengan huruf miring, begitu pula untuk method dan atribut.
Method bernafas() pada class Ayam tidak perlu ditulis kembali, karena default harus
dijelaskan secara konkret dalam artian wajib dikoding di kelas Ayam.
9.2 Interface
Mirip dengan abstract, interface hanya berfokus pada konstruksi operasi umum pada suatu
object. Kita dapat menganggap interface ini sebagai kerangka dari suatu class. Secara struktu
interface bukan merupakan class. Sehingga dalam membuat kode program interface tidak lagi
menggunakan kata “class”. Kode 9.3 merupakan contoh interface MahlukHidup.
Interface hanya berisi abstract method baik yang menggunakan kata abstract maupun tidak.
Disini ditandai dengan definisi method yang langsung ditutup dengan tanda titik koma bukan
kurung kurawal buka dan tutup. Interface dapat diterapkan kepada class biasa maupun
abstract class. Untuk mengimplementasikan interface dibutuhkan tambahan sintak
implements seperti Kode 9.4 Hewan.java yang telah dimodifikasi ini.
111
8 }
9
10 public boolean isTerbang()
11 {
12 return this.terbang;
13 }
14
15 public abstract void bernapas();
16
17 public boolean isHidup()
18 {
19 return true;
20 }
21 }
112
12 System.out.println("Apakah bisa terbang:
"+kutuk.isTerbang());
13 kutuk.bernapas();
14 System.out.println("Apakah benda hidup:
"+kutuk.isHidup());
15 }
16 }
Pada contoh kode sebelumnya interface diterapkan pada abstract method. Bagaimana jika
diterapkan pada class biasa. Kode 9.6 merupakan contoh penerapan interface MahlukHidup
pada class biasa.
113
<<interface>>
MahlukHidup
+bernapas(): void
+isHidup(): boolean
Hewan Tumbuhan
+terbang:boolean = false
+bisaTerbang(terbang: boolean): void +main(args: String[]): void
+isTerbang():boolean
Ayam
Gambar 9.2 menjelaskan tentang UML class diagram interface MahlukHidup. Class interface
dapat diwariskan dengan keyword implements, dalam UML class diagram digambarkan
dengan garis panah putus-putus. Class interface dituliskan dengan huruf miring dan
dijelaskan lagi dengan keterangan kata <<interface>>. Secara implisit atribut di class
interface bersifat public static dan final. Sedangkan untuk method, secara implisit bersifat
public dan abstrak sehingga ditulis dengan huruf miring. Method bernafas() dan
isHidup() pada class Hewan dan Tumbuhan tidak perlu ditulis kembali, karena method
tersebut bersifat abstract dan wajib dikoding.
114
4 {
5 System.out.println("daun melambai-lambai");
6 }
7 }
Kita akan memodifikasi Kode 9.6 tidak hanya menerapkan interface MahlukHidup, tetapi
juga menerapkan abstract class Dedaunan. Kode 9.8 merupakan class Tumbuhan yang telah
dimodifikasi. UML class diagram dapat dilihat pada GAMBAR 9.
115
<<interface>> Dedaunan
MahlukHidup
+daunBergerak(); void
+bernapas(): void
+isHidup(): boolean
Hewan Tumbuhan
+terbang:boolean = false
+bisaTerbang(terbang: boolean): void +main(args: String[]): void
+isTerbang():boolean
Ayam
9.4 Kesimpulan
Seorang desainer sistem, dalam mendesain suatu class terkadang membutuhkan bentuk class
yang abstrak atau kerangka dari sebuah class sebelum diimplementasikan. Hal ini digunakan
untuk memudahkan programmer dalam menerjemahkan “bahasa bisnis” kedalam kode
program. Abstract class merupakan class yang hanya menyajikan fitur-fitur umum dan tidak
dapat dibuat objek. Sedangkan interface merupakan bentuk kerangka suatu class yang juga
berisi fitur-fitur umum yang berbentuk abstrak.
PETUNJUK:
1. Minimal terdapat 7 kelas (terserah boleh subclass, superclass, abstract class, atau
interface)
2. Method dan property bebas yang sesuai dengan ilustrasi kasus diatas.
3. Keterangan setiap property dan method yang ada pada class diagram dijelaskan
beserta potongan kode programnya.
4. Boleh dikembangkan. Dan beri keterangan pengembangan dari kasus diatas.
117
BAB 10 EXCEPTION, PEMROGRAMAN GENERIK, DAN
DESIGN PATTERN
10.1 Exception
Pada dasarnya ada tiga jenis error didalam pemrograman dengan Java, yaitu: syntax error,
logic error, dan runtime error. Syntax error merupakan kesalahan yang terjadi saat
programmer salah menuliskan kode program. Misalnya, saat programmer kurang
memberikan titik koma di akhir dari statement. Biasanya error ini akan muncul saat progam
di-compile. Logic error berkaitan dengan kesalahan yang dilakukan programmer saat
programmer membuat kode sehingga akan menghasilkan output kode yang tidak sesuai
dengan yang diinginkan. Kesalahan logic error seringkali disebut sebagai bug/kutu. Untuk
menangani bug dilakukan proses debugging. Proses debugging adalah mencari satu persatu
baris perbaris kode yang mana yang membuat output yang dihasilkan tidak sesuai.
Runtime error adalah kesalahan program yang terjadi saat program sudah berjalan dimana
jika lingkungan pemrograman mendeteksi operasi yang tidak mungkin dapat ditangani.
Contoh nyata dari error runtime ini adalah misalnya saat kita menjalankan aplikasi berbasis
java yang membutuhkan koneksi internet, tiba-tiba internet mati dan menyebabkan aplikasi
tadi berhenti/terminate secara mendadak. Error runtime disebabkan oleh exception. Exception
adalah objek yang mewakili error atau kondisi yang mencegah eksekusi dari proses yang
tidak berjalan normal.
Ada banyak sekali objek atau tipe exception, misalnya: input mismatch exception, aritmethic
exception, null pointer exception, index of out bound exception, illegal argument exception,
dll. Berikut adalah contoh kode yang berpotensi menghasilkan input mismatch exception:
import java.util.Scanner;
public class TestException
{
public static void main(String[] args)
{
// Buat objek Scanner
Scanner input = new Scanner(System.in);
// Kabari user untuk memasukkan angka sisi persegi
118
System.out.print("Masukkan sisi persegi: ");
double sisi = input.nextDouble();
System.out.print("Sisi: "+sisi);
}
}
Perhatikan bahwa output dari program tersebut adalah “Masukkan sisi persegi: ”. Jika user
memberikan inputan berupa string misalnya “as”. Maka akan muncul error exception
Exception in thread "main" java.util.InputMismatchException“. Kita sebagai programmer
terkadang tidak memerhatikan user dalam hal inputan sederhana ini. Tetapi hal ini bisa saja
terjadi. Maka dari itu perlu penanganan exception.
119
10
11 try{
12 angka = input.nextInt();
13 System.out.print("Angka yang dimasukkan: "+angka);
14 }
15 catch(Exception e)
16 {
17 System.out.print("Inputan salah!");
18 }
19 }
20 }
Output:
Masukkan sembarang angka: 12
Angka yang dimasukkan: 12
Suatu program yang dapat mendeteksi error dapat dibuat dari instance dari tipe exception
yang sesuai dan lemparkan (throw it). Sebagai contoh, terdapat program meneruskan nilai
dari suatu method dan argument harus berupa argument non-negative, tetapi malah argument
negative. Program dapat dibuat dari instance IllegalArgumentException dan kemudian di
throw seperti berikut:
120
finally
{
System.out.print("Terima kasih.");
}
Biasa Generik
Pada versi non-generic clas Box jika seandainya instance dari Box adalah Kotak dan
Kotak.set(“50”), maka akan menghasilkan error. Error disebabkan hanya boleh diset oleh
nilai integer saja. Pada versi generic dapat di set oleh berbagai tipe data, baik primitive
maupun tipe data bentukan, dan bahkan array/list. Format class generic:
22 System.out.println(p2.getValue());
23
122
24 }
25 }
Output:
2
Contoh lain dari generik tidak hanya pada class tetapi juga dapat diterapkan pada method
secara langsung. Berikut adalah contoh method generic untuk menampilkan elemen array:
123
Gambar 10.1 Class Diagram Singleton
Kode 10.3 merupakan contoh implementasi singleton patten untuk class SingleObject.
124
17 System.out.println("Hello World!");
18 }
19
20 public static void main(String[] args) {
21 SingleObject object = SingleObject.getInstance();
22 object.showMessage();
23 }
24 }
Pada main method tidak ada keyword untuk melakukan instance atau “new”. Objek langsung
dibuat dan langsung dapat digunakan ketika memanggil method getInstance(). Dua baris
kode didalam main dapat digantikan dengan kode dibawah ini:
SingleObject.getInstance().showMessage();
Eksekusi dari kode tersebut akan menghasilkan output yang sama dengan dua baris kode
sebelumnya.
125
Gambar 10.2 Model View Controller (MVC)
Pola MVC memiliki layer yang disebut dengan Model yang merepresentasikan data yang
digunakan oleh aplikasi sebagaimana proses bisnis yang diasosiasikan terhadapnya. Dengan
memilahnya sebagai bagian terpisah, seperti penampungan data, persistence, serta proses
manipulasi, terpisah dari bagian lain aplikasi. Terdapat beberapa kelebihan dalam pendekatan
ini. Pertama, membuat detail dari data dan operasinya dapat ditempatkan pada area yang
ditentukan (Model) dibanding tersebar dalam keseluruhan lingkup aplikasi. Hal ini
memberikan keuntungan dalam proses pemeliharaan aplikasi. Kedua, dengan pemisahan total
antara data dengan implementasi interface, komponen model dapat digunakan kembali oleh
aplikasi lain yang memiliki kegunaan yang hampir sama.
Layer view mengandung keseluruhan detail dari implementasi user interface. Disini,
komponen grafis menyediakan representasi proses internal aplikasi dan menuntun alur
interaksi user terhadap aplikasi. Tidak ada layer lain yang berinteraksi dengan pengguna,
hanya View. Penggunaan layer View memiliki beberapa kelebihan: memudahkan
pengabungan divisi desain dalam development team. Divisi desain dapat berkonsentrasi pada
style, look and feel, dan sebagainya, dalam aplikasi tanpa harus memperhatikan lebih pada
detail yang lain. Dengan memiliki layer View yang terpisah memungkinkan ketersediaan
multiple interface dalam aplikasi. Jika inti dari aplikasi terletak pada bagian lain (dalam
126
Model), multiple interfaces dapat dibuat (Swing, Web, Console), secara keseluruhan
memiliki tampilan yang berbeda namun mengeksekusi komponen Model sesuai
fungsionalitas yang diharapkan.
Terakhir, arsitektur MVC memiliki layer Controller. Layer ini menyediakan detail alur
program dan transisi layer, dan juga bertanggungjawab akan penampungan events yang
dibuat oleh user dari View dan melakukan update terhadap komponen Model menggunakan
data yang dimasukkan oleh user. Kelebihan dalam penggunaan layer Controller secara
terpisah adalah dengan menggunakan komponen terpisah untuk menampung detail dari
transisi layer, komponen view dapat didesain tanpa harus memperhatikan bagian lain secara
berlebih. Hal ini memudahkan team pengembang multiple interface bekerja secara terpisah
dari yang lain secara simultan. Interaksi antar komponen View terabstraksi dalam Controller.
Data Access Object (DAO) merupakan sebuah object yang menyediakan sebuah abstract
interface terhadap beberapa database atau mekanisme persistence, menyediakan beberapa
operasi tertentu tanpa mengekspos detail database. Penerapan konsep ini sering disebut
dengan separation of concern dimana setiap kode dipisahkan berdasarkan fungsinya sehingga
kode diatasnya hanya perlu mengetahui secara abstrak cara mengakses data tanpa perlu
mengetahui bagaimana akses ke sumber data diimplementasikan. DAO sering dikaitkan
dengan Java EE dan akses ke relational database melalu JDBC API, karena memang DAO
berasal dari pedoman praktek Sun Microsystem. Kebanyakan peggunaan DAO adalah satu
objek DAO untuk satu objek entity.
127
BAB 11 PEMROGRAMAN JAVA GUI DENGAN JAVA FX
11.1 Java FX
JavaFX adalah framework untuk membangun program-program Java berbasis Graphical
User Interface (GUI). Ketika Java diperkenalkan, class GUI dipaket dalam sebuah library
yang dikenal sebagai AbstractWindows Toolkit (AWT). AWT baik digunakan untuk
mengembangkan user interface grafis sederhana, namun tidak untuk mengembangkan proyek
GUI yang komprehensif. Selain itu, AWT rentan terhadap bug khususnya permasalahan
platform. Komponen user interface AWT digantikan oleh library yang lebih baik, fleksibel,
dan yang dikenal sebagai swing. Komponen swing dilukis secara langsung pada kanvas
menggunakan kode Java. Komponen swing lebih sedikit bergantung pada platform target,
dan menggunakan lebih sedikit sumber daya GUI asli. Swing dirancang untuk
mengembangkan aplikasi GUI desktop. Saat ini penggunaan swing digantikan oleh platform
GUI yang benar-benar baru yang dikenal sebagai JavaFX.
128
10 Scene scene = new Scene(btOK, 600, 250);
11 primaryStage.setTitle("MyJavaFX"); // Set judul stage
12 // menempatkan scene pada stage
13 primaryStage.setScene(scene);
14 primaryStage.show(); // Display stage
15 }
16 /* main method hanya diperlukan
17 untuk IDE yg tdk support JavaFX */
18 public static void main(String[] args) {
19 Application.launch(args);
20 }
21 }
Hasil dari Kode 11.1 ketika dijalankan disajikan pada Gambar 11.1. Method start()
merupakan method yang dibaca pertamakali untuk semua aplikasi javaFX, Method launch
adalah method statis yang didefinisikan dalam class aplikasi untuk menjalankan aplikasi
JavaFX yang berdiri sendiri. method Main tidak diperlukan jika program dijalankan dari
command Line,namun diperlukan untuk menjalankan program JavaFX dari IDE yang tidak
support dengan JavaFX. Ketika menjalankan aplikasi JavaFX tanpa method main, JVM
secara otomatis memanggil method launch untuk menjalankan aplikasi.
Class main meng-override method start yang didefinisikan dalam javafx.application. Setelah
application JavaFX diluncurkan, JVM membangun instance class menggunakan constructor
no-arg dan memanggil method awal. Method start biasanya menempatkan kontrol UI dalam
sebuah scene dan menampilkan scene dalam stage, seperti yang ditunjukkan pada Gambar 2
129
Gambar 11.2 (a) Pane dan Group digunakan untuk menempatkan Nodes. (b) Node bisa
berupa shape,image view,UI control,group, dan pane.
Contoh pembuatan tombol Button dilakukan dengan Button btOK = new Button("OK");.
Untuk membuat objek Button dan menempatkannya di dalam objek Scene dilakukan dengan
Scene scene = new Scene(btOK, 600, 250);. Objek Scene dapat dibuat menggunakan
constructor Scene (node, lebar, tinggi) seperti berikut: Scene scene = new Scene(btOK,
600, 250);. Membuat scene dengan menentukan lebar dan tinggi dan menempatkan suatu
node (Button) pada Scene. Objek Stage merupakan suatu window. Objek Stage dengan nama
primary stage secara otomatis dibuat oleh JVM ketika aplikasi dijalankan. Kode
primaryStage.setScene(scene); baris ini mengatur scene ke primary stage
primaryStage.show(); dan ini menampilkan primary stage.
JavaFX memberi nama class Stage dan Scene menggunakan analogi dari sebuah drama.
stage dianggap sebagai platform untuk mendukung Scene, dan nodes sebagai aktor untuk
tampil di Scene. Kita bisa membuat lebih dari satu stage seperti Kode 11.2.
130
4 import javafx.stage.Stage;
5 public class MultipleStageDemo extends Application {
6 @Override
7 public void start(Stage primaryStage) {
8 Button btOK = new Button("OK");
9 Scene scene = new Scene(btOK, 600, 250);
10 primaryStage.setTitle("MyJavaFX");
11 primaryStage.setScene(scene);
12 primaryStage.show();
13 Stage stage = new Stage(); // membuat stage baru
14 stage.setTitle("Second Stage"); // Set judul stage
15 // Set scene dengan sebuah button di dalam stage
16 stage.setScene(new Scene(new Button("New Stage"),
17 200, 250));
18 stage.setResizable(false);
19 stage.show();
20 }
21 }
131
5 import javafx.scene.layout.StackPane;
6
7 public class ButtonInPane extends Application {
8 @Override
9 public void start(Stage primaryStage) {
10 StackPane pane = new StackPane();
11 pane.getChildren().add(new Button("OK"));
12 Scene scene = new Scene(pane, 200, 50);
13 primaryStage.setTitle("Button in a pane");
14 primaryStage.setScene(scene);
15 primaryStage.show();
16 }
17 }
133
Hasil dari Kode ShowCircleCentered.java diperlihatkan pada Gambar 11.4.
Contoh:
Property rotate dapat mengatur sudut perputaran suatu node terhadap titik pusatnya, nilai
positif membuat node berputar searah jarum jam dan nilai negatif sebaliknya. Implementasi
dari rotate tersebut dilakukan pada Kode 11.5. Hasil dari Kode 11.5 disajikan pada Gambar
11.5.
134
5 import javafx.scene.layout.StackPane;
6
7 public class NodeStyleRotateDemo extends Application {
8 @Override
9 public void start(Stage primaryStage) {
10 StackPane pane = new StackPane();
11 Button btOK = new Button("OK");
12 btOK.setStyle("-fx-border-color: blue;");
13 pane.getChildren().add(btOK);
14 pane.setRotate(45);
15 pane.setStyle("-fx-border-color: red; -fx-background-
color: lightgray;");
16 Scene scene = new Scene(pane, 200, 250);
17 primaryStage.setTitle("NodeStyleRotateDemo");
18 primaryStage.setScene(scene);
19 primaryStage.show();
20 }
21 }
Class Color digunakan untuk menentukan warna, JavaFX mendefinisikan class Paint dalam
menggambar suatu node. Instan color dapat dibuat menggunakan constructor berikut ini:
135
Dimana r, g, dan b merupakan komponen warna red,green,blue dengan nilai dengan range
0.0 (gelap) sampai dengan 1.0 (terang). Nilai opacity menentukan transparansi warna dengan
nilai berada pada range 0.0 (completely transparent) sampai dengan 1.0 (completely opaque),
hal ini dikenal sebagai model RGBA (Red Green Blue Alpha). Berikut contoh penerapannya:
136
18
19 Label label = new Label("JavaFX");
20 label.setFont(Font.font("Times New Roman",
21 FontWeight.BOLD, FontPosture.ITALIC, 20));
22 pane.getChildren().add(label);
23
24 Scene scene = new Scene(pane);
25 primaryStage.setTitle("FontDemo");
26 primaryStage.setScene(scene);
27 primaryStage.show();
28 }
29 }
Berikutnya adalah penambahan citra atau gambar dengan Java FX yang diwakilkan oleh class
Image dan Class ImageView. Class Image mewakili suatu citra grafis, sedangkan class
ImageView digunakan untuk menampilkan suatu citra. Class javafx.scene.image.Image
mewakili suatu image grafis dan digunakan untuk menampilkan image dari suatu namaFile
atau suatu URL Berikut adalah contoh dari membuat suatu objek Image dari suatu gambar
gif:
new Image("image/us.gif")
new Image("http://liveexample.pearsoncmg.com/book/image/ us.gif")
Kode javafx.scene.image.ImageView merupakan suatu node yang digunakan untuk
menampilkan image, sebuah ImageView dapat dibuat dari obyek Image, misalnya:
Kode 11.7 merupakan implementasi full dari Image dan ImageView. Gambar 11.6
merupakan hasil output dari Kode 11.7.
137
Kode 11.7 ShowImage.java
1 import javafx.application.Application;
2 import javafx.scene.Scene;
3 import javafx.scene.layout.HBox;
4 import javafx.scene.layout.Pane;
5 import javafx.geometry.Insets;
6 import javafx.stage.Stage;
7 import javafx.scene.image.Image;
8 import javafx.scene.image.ImageView;
9
10 public class ShowImage extends Application {
11 @Override
12 public void start(Stage primaryStage) {
Pane pane = new HBox(10);
13 pane.setPadding(new Insets(5, 5, 5, 5));
14 Image image = new Image("image/srt30.png");
15 pane.getChildren().add(new ImageView(image));
16 ImageView imageView2 = new ImageView(image);
17 imageView2.setFitHeight(100);
18 imageView2.setFitWidth(100);
19 pane.getChildren().add(imageView2);
20 ImageView imageView3 = new ImageView(image);
21 imageView3.setRotate(90);
22 pane.getChildren().add(imageView3);
23 Scene scene = new Scene(pane);
24 primaryStage.setTitle("ShowImage");
25 primaryStage.setScene(scene);
26 primaryStage.show();
27 }
28 }
138
Gambar 11.6 Hasil output ShowImage.java
JavaFX menyediakan banyak jenis Pane yg secara otomatis menempatkan node pada lokasi
dan ukuran yang diinginkan. Pane dan Group merupakan container yang mengatur
penempatan suatu node. Class group digunakan untuk mengelompokkan node dan
menjalankan transformasi dan mengatur skala dalam group. Obyek Pane dan UI control dapat
dirubah ukurannya, namun obyek group,shape,dan text tidak dapat dirubah ukurannya.
JavaFX menyediakan beberapa jenis pane untuk mengorganisir node dalam suatu container
yang di sajikan pada Tabel 11.1.
Class Deskripsi
Pane Base Class yaitu berupa layout pane, berisi method getChildren untuk
mengembalikan list node yang ada dalam suatu pane.
FlowPane Menempatkan node perbaris secara horisontal atau perkolom secara vertikal
Menempatkan node secara perbaris dalam susunan horisontal dari kiri ke kanan, atau secara
perkolom dengan susunan vertikal dari atas ke bawah, dalam susunan sesuai urutan suatu
139
node ditambahkan. Setelah satu baris/kolom di isikan, selanjutnya berpindah ke baris/kolom
baru. Untuk menentukan arah susunan penempatan node baik secara horizontal atau vertical
digunakan konstanta: Orientation.HORIZONTAL atau Orientation.VERTICAL. Kode 11.8
merupakan kode untuk menampilkan Pane dan Gambar 11.7 merupakan hasil output dari
Kode 11.8.
140
Gambar 11.7 Hasil output ShowFlowPane.java
GridPane menyusun node dalam bentuk susunan grid/matriks, suatu node ditempatkan pada
suatu cell.
141
18 pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));
19 pane.setHgap(5.5);
20 pane.setVgap(5.5);
21
22 pane.add(new Label("First Name:"), 0, 0);
23 pane.add(new TextField(), 1, 0);
24 pane.add(new Label("MI:"), 0, 1);
25 pane.add(new TextField(), 1, 1);
26 pane.add(new Label("Last Name:"), 0, 2);
27 pane.add(new TextField(), 1, 2);
28 Button btAdd = new Button("Add Name");
29 pane.add(btAdd, 1, 3);
30 GridPane.setHalignment(btAdd, HPos.RIGHT);
31
32 Scene scene = new Scene(pane);
33 primaryStage.setTitle("ShowGridPane");
34 primaryStage.setScene(scene);
35 primaryStage.show();
36 }
37 }
Output
11.4.1 BorderPane
BorderPane menempatkan node pada lima area yaitu: top,right,bottom,left, dan center
dengan menggunakan method:setTop(node), setBottom(node), setLeft(node), setRight (node)
, dan setCenter(node).
142
Kode 11.9 ShowBorderPane.java
1 import javafx.application.Application;
2 import javafx.geometry.Insets;
3 import javafx.scene.Scene;
4 import javafx.scene.control.Label;
5 import javafx.scene.layout.BorderPane;
6 import javafx.scene.layout.StackPane;
7 import javafx.stage.Stage;
8
9 public class ShowBorderPane extends Application {
10 @Override
11 public void start(Stage primaryStage) {
12 BorderPane pane = new BorderPane();
13 pane.setTop(new CustomPane("Top"));
14 pane.setRight(new CustomPane("Right"));
15 pane.setBottom(new CustomPane("Bottom"));
16 pane.setLeft(new CustomPane("Left"));
17 pane.setCenter(new CustomPane("Center"));
18
19 Scene scene = new Scene(pane);
20 primaryStage.setTitle("ShowBorderPane");
21 primaryStage.setScene(scene);
22 primaryStage.show();
23 }
24 }
25
26 class CustomPane extends StackPane {
27 public CustomPane(String title) {
28 getChildren().add(new Label(title));
29 setStyle("-fx-border-color: red");
30 setPadding(new Insets(11.5, 12.5, 13.5, 14.5));
31 }
143
32 }
Output
144
19 pane.setLeft(getVBox());
20 Scene scene = new Scene(pane);
21 primaryStage.setTitle("ShowHBoxVBox");
22 primaryStage.setScene(scene);
23 primaryStage.show();
24 }
25 private HBox getHBox() {
26 HBox hBox = new HBox(15);
27 hBox.setPadding(new Insets(15, 15, 15, 15));
28 hBox.setStyle("−fx−background−color: gold");
29 hBox.getChildren().add(new Button("Computer Science"));
30 hBox.getChildren().add(new Button("Chemistry"));
31 ImageView imageView = new ImageView(new
Image("image/srt30.png"));
32 hBox.getChildren().add(imageView);
33 return hBox;
34 }
35
36 private VBox getVBox() {
37 VBox vBox = new VBox(15);
38 vBox.setPadding(new Insets(15, 5, 5, 5));
39 vBox.getChildren().add(new Label("Courses"));
40
41 Label[] courses = {new Label("CSCI 1301"), new
Label("CSCI 1302"),
42 new Label("CSCI 2410"), new Label("CSCI 3720")};
43
44 for (Label course: courses) {
45 VBox.setMargin(course, new Insets(0, 0, 0, 15));
46 vBox.getChildren().add(course);
47 }
48 return vBox;
145
49 }
50 }
Output
146
Interface EventHandler<ActionEvent> berisi method handle(ActionEvent) utk memproses
action-event. Class handler yang dibuat harus melakukan override method ini untuk
merespon suatu event.
HandleEvent.java
1 import javafx.application.Application;
2 import javafx.geometry.Pos;
3 import javafx.scene.Scene;
4 import javafx.scene.control.Button;
5 import javafx.scene.layout.HBox;
6 import javafx.stage.Stage;
7 import javafx.event.ActionEvent;
8 import javafx.event.EventHandler;
9 public class HandleEvent extends Application {
10 @Override
11 public void start(Stage primaryStage) {
12 HBox pane = new HBox(10);
13 pane.setAlignment(Pos.CENTER);
14 Button btOK = new Button("OK");
15 Button btCancel = new Button("Cancel");
16 OKHandlerClass handler1 = new OKHandlerClass();
17 btOK.setOnAction(handler1);
18 CancelHandlerClass handler2 = new CancelHandlerClass();
19 btCancel.setOnAction(handler2);
20 pane.getChildren().addAll(btOK, btCancel);
21
22 Scene scene = new Scene(pane);
23 primaryStage.setTitle("HandleEvent");
24 primaryStage.setScene(scene);
25 primaryStage.show();
26 }
27 }
28
147
29 class OKHandlerClass implements EventHandler<ActionEvent> {
30 @Override
31 public void handle(ActionEvent e) {
32 System.out.println("OK button clicked");
33 }
34 }
35
36 class CancelHandlerClass implements EventHandler<ActionEvent> {
37 @Override
38 public void handle(ActionEvent e) {
39 System.out.println("Cancel button clicked");
40 }
41 }
Output
Dua class handler yang didefinisikan pada listing code diatas dan masing--masing class
handler meng-implementasikan EventHandler<ActionEvent> untuk memproses Action-
Event. Obyek handler1 merupakan instan dari class OKHandler,yang diregistrasikan untuk
button btOK. Ketika button OK diclick method handle(ActionEvent) dalam class OKHandler
dipanggil untuk memproses event.
148
Program GUI java berinteraksi dengan user dan event mengendalikan(drive) eksekusinya
proses seperti ini disebut pemrograman event-driven. Event dapat didefinisikan sebagai
sinyal ke program bahwa sesuatu telah terjadi. event dibangkitkan oleh aksi-aksi user seperti
pergerakan mouse,click mouse, penekanan tombol. program dapat memilih utk merespon
atau mengabaikan event.
ActionEvent
MouseEvent
EventObject Event InputEvent
KeyEvent
WindowEvent
Gambar 11.9 obyek event pada JavaFX yang merupakan obyek dari class javafx.event.Event
149
7 int varDalam; 6 l.printLuar();
8 void printDalam(){ 7 d.printDalam();
9 System.out.println("cetak 8
dalam"); 9 //cara2 membuat obyek
10 } 10 Luar.Dalam dlm = new
11 } Luar().new Dalam();
12 } 11 dlm.printDalam();
12 }
13 }
150
15 //OKHandlerClass handler1 = new OKHandlerClass();
16 //btOK.setOnAction(handler1);
17 //membuat obyek handler
18 btOK.setOnAction(new OKHandlerClass());
19 //CancelHandlerClass handler2 = new
CancelHandlerClass();
20
//btCancel.setOnAction(handler2);
21
//membuat obyek handler
22
btCancel.setOnAction(new CancelHandlerClass());
23
pane.getChildren().addAll(btOK, btCancel);
24
Scene scene = new Scene(pane);
25
primaryStage.setTitle("HandleEvent");
26
primaryStage.setScene(scene);
27
primaryStage.show();
28
}
29
//inner classs
30
class OKHandlerClass implements EventHandler<ActionEvent> {
31
@Override
32
public void handle(ActionEvent e) {
33
System.out.println("OK button clicked");
34
}
35
}
36
//inner classs
37
class CancelHandlerClass implements EventHandler<ActionEvent> {
38
@Override
39
public void handle(ActionEvent e) {
40
System.out.println("Cancel button clicked");
41
}
42
}
43
}
Output:
151
11.8 Handler berupa Anonymous Inner-Class
Anonymous inner class merupakan suatu inner class tanpa nama,dimana dalam
mendefinisikan suatu inner class sekaligus juga membuat instannya.
152
18 //menggunakan Anonymous inner class
19 btOK.setOnAction(new
EventHandler<ActionEvent>(){
20 public void handle(ActionEvent e) {
21 System.out.println("OK button clicked");
22 }
23 });
24 //membuat obyek handler
25 //btCancel.setOnAction(new CancelHandlerClass());
26 //menggunakan Anonymous inner class
27 btCancel.setOnAction(new EventHandler<ActionEvent>(){
28 public void handle(ActionEvent e) {
29 System.out.println("Cancel button clicked");
30 }
31 });
32 pane.getChildren().addAll(btOK, btCancel);
33 Scene scene = new Scene(pane);
34 primaryStage.setTitle("HandleEvent");
35 primaryStage.setScene(scene);
36 primaryStage.show();
37 }
38 }
Output:
153
Kode 11. 15 HandleEvent4.java
1 import javafx.application.Application;
2 import javafx.geometry.Pos;
3 import javafx.scene.Scene;
4 import javafx.scene.control.Button;
5 import javafx.scene.layout.HBox;
6 import javafx.stage.Stage;
7 import javafx.event.ActionEvent;
8 import javafx.event.EventHandler;
9 public class HandleEvent4 extends Application {
10 @Override
11 public void start(Stage primaryStage) {
12 HBox pane = new HBox(10);
13 pane.setAlignment(Pos.CENTER);
14 Button btOK = new Button("OK");
15 Button btCancel = new Button("Cancel");
16 //membuat obyek handler
17 btOK.setOnAction((ActionEvent e) -> {
18 System.out.println("OK button clicked");
19 });
20 //membuat obyek handler
21 //membuat obyek handler
22 btCancel.setOnAction((ActionEvent e) -> {
23 System.out.println("Cancel button clicked");
24 });
25 pane.getChildren().addAll(btOK, btCancel);
26 Scene scene = new Scene(pane);
27 primaryStage.setTitle("HandleEvent");
28 primaryStage.setScene(scene);
29 primaryStage.show();
30 }
31 }
154
Output
155
22 this.bungaPerTahun = bungaPerTahun;
23 }
24
25 public int getJmlTahun() {
26 return jmlTahun;
27 }
28
29 public void setJmlTahun(int jmlTahun) {
30 this.jmlTahun = jmlTahun;
31 }
32
33 public double getJmlPinjaman() {
34 return jmlPinjaman;
35 }
36
37 public void setJmlPinjaman(double jmlPinjaman) {
38 this.jmlPinjaman = jmlPinjaman;
39 }
40
41 public double getBayarPerBulan() {
42 double bungaPerBulan = bungaPerTahun / 1200;
43 double BayarPerBulan = jmlPinjaman * bungaPerBulan/
44 (1 - (1 / Math.pow(1 + bungaPerBulan, jmlTahun * 12)));
return BayarPerBulan;
45 }
46
47 public double getTotalBayar() {
48 double totalBayar = getBayarPerBulan() * jmlTahun * 12;
49 return totalBayar;
50 }
51 public java.util.Date getTglPeminjaman() {
52 return tglPeminjaman;
156
53 }
54 }
157
30 gridPane.add(tfJmlHutang, 1, 2);
31 gridPane.add(new Label("Pembayaran per bulan:"), 0, 3);
32 gridPane.add(tfBayarPerBulan, 1, 3);
33 gridPane.add(new Label("Pembayaran Total:"), 0, 4);
34 gridPane.add(tfTotalBayar, 1, 4);
35 gridPane.add(btHitung, 1, 5);
36
37 // Set properti UI
38 gridPane.setAlignment(Pos.CENTER);
39 tfBungaPerTahun.setAlignment(Pos.BOTTOM_RIGHT);
40 tfJmlTahun.setAlignment(Pos.BOTTOM_RIGHT);
41 tfJmlHutang.setAlignment(Pos.BOTTOM_RIGHT);
42 tfBayarPerBulan.setAlignment(Pos.BOTTOM_RIGHT);
43 tfTotalBayar.setAlignment(Pos.BOTTOM_RIGHT);
44 tfBayarPerBulan.setEditable(false);
tfTotalBayar.setEditable(false);
45 GridPane.setHalignment(btHitung, HPos.RIGHT);
46
47 // Process events
48 btHitung.setOnAction(e -> hitungPembayaranHutang());
49
50 // buat scene dan tempatkan dlm stage
51 Scene scene = new Scene(gridPane, 400, 250);
52 primaryStage.setTitle("Menghitung Hutang");
53 primaryStage.setScene(scene);
54 primaryStage.show();
55 }
56
57 private void hitungPembayaranHutang() {
58 // ambil nilai dari text fields
59 double bunga =
Double.parseDouble(tfBungaPerTahun.getText());
158
60 int year = Integer.parseInt(tfJmlTahun.getText());
61 double loanAmount =
Double.parseDouble(tfJmlHutang.getText());
62
63 // membuat obyek hutang
64 Hutang hutang = new Hutang(bunga, year, loanAmount);
65
66 // Display pembayaran bulanan dan pembayaran total
67 tfBayarPerBulan.setText(String.format("Rp%.2f",hutang.
getBayarPerBulan()));
68 tfTotalBayar.setText(String.format("Rp%.2f",hutang.
getTotalBayar()));
69 }
70 }
Output
159
Gambar11.10 UI controls yang sering digunakan dalam membuat user-interface
11.11.1 Label
Label adalah area tampilan untuk teks pendek ataupun node. Label sering digunakan untuk
memberi keterangan teks (memberi label) terhadap suatu UI kontrol.
Membuat label:
Label(text: String, graphic: Node) Membuat label dengan teks dan gambar
160
Properti Deskripsi
Alignment : <Pos> Menentukan alignment dari text dan node yang diberi
label
161
14 public class LabelWithGraphic extends Application {
15 @Override
16 public void start(Stage primaryStage) {
17 ImageView ina = new ImageView(new
Image("image/benderaIna.jpeg"));
18 ina.setPreserveRatio(true);
19 ina.setFitWidth(250);
20 //membuat label dengan teks dan gambar
21 Label lb1 = new Label("INA\nIndonesia", ina);
22 lb1.setStyle("-fx-border-color: green; -fx-border-width:
2");
23 lb1.setContentDisplay(ContentDisplay.BOTTOM);
24 lb1.setTextFill(Color.RED);
25 Label lb2 = new Label("Circle", new Circle(50, 50, 25));
26 lb2.setContentDisplay(ContentDisplay.TOP);
27 lb2.setTextFill(Color.ORANGE);
28 Label lb3 = new Label("Rectangle", new Rectangle(10, 10,
50, 25));
29 lb3.setContentDisplay(ContentDisplay.RIGHT);
30 Label lb4 = new Label("Ellipse", new Ellipse(50, 50, 50,
25));
31 lb4.setContentDisplay(ContentDisplay.LEFT);
32 Ellipse ellipse = new Ellipse(50, 50, 50, 25);
33 ellipse.setStroke(Color.GREEN);
34 ellipse.setFill(Color.WHITE);
35 StackPane stackPane = new StackPane();
36 stackPane.getChildren().addAll(ellipse, new
Label("JavaFX"));
37 Label lb5 = new Label("pane dalam sebuah label",
stackPane);
38 lb5.setContentDisplay(ContentDisplay.BOTTOM);
39 HBox pane = new HBox(20);
162
40 pane.getChildren().addAll(lb1, lb2, lb3, lb4, lb5);
41
42 Scene scene = new Scene(pane, 750, 300);
43 primaryStage.setTitle("LabelWithGraphic");
44 primaryStage.setScene(scene);
primaryStage.show();
45 }
46 }
Output
11.11.2 Button
Button adalah suatu tombol yang membangkitkan event ketika diclick. JavaFX menyediakan
regular buttons, toggle buttons, check box buttons, dan radio buttons.
Constructor Deskripsi
Button(text: String, graphic: Node) Membuat button dengan teks dan gambar
163
Kode 11.19 ButtonDemo.java
1 import javafx.application.Application;
2 import javafx.stage.Stage;
3 import javafx.geometry.Pos;
4 import javafx.scene.Scene;
5 import javafx.scene.control.Button;
6 import javafx.scene.image.ImageView;
7 import javafx.scene.layout.BorderPane;
8 import javafx.scene.layout.HBox;
9 import javafx.scene.layout.Pane;
10 import javafx.scene.text.Text;
11
12 public class ButtonDemo extends Application {
13 protected Text text = new Text(50, 50, "JavaFX Programming");
14 protected BorderPane getPane() {
15 HBox paneForButtons = new HBox(20);
16 Button btLeft = new Button("Kiri",new
ImageView("image/panahKiri.png"));
17 Button btRight = new Button("Kanan",new
ImageView("image/panahKanan.png"));
18 paneForButtons.getChildren().addAll(btLeft, btRight);
19 paneForButtons.setAlignment(Pos.CENTER);
20 paneForButtons.setStyle("−fx−border−color: green");
21
22 BorderPane pane = new BorderPane();
23 pane.setBottom(paneForButtons);
24
25 Pane paneForText = new Pane();
26 paneForText.getChildren().add(text);
27 pane.setCenter(paneForText);
28 btLeft.setOnAction(e->text.setX(text.getX() - 10));
29 btRight.setOnAction(e -> text.setX(text.getX() + 10));
164
30 return pane;
31 }
32 @Override
33 public void start(Stage primaryStage) {
34 Scene scene = new Scene(getPane(), 450, 200);
35 primaryStage.setTitle("ButtonDemo");
36 primaryStage.setScene(scene);
37 primaryStage.show();
38 }
39 }
Output
11.11.3 CheckBox
CheckBox digunakan user untuk menentukan pilihan mirip dengan button sebuah checkbox
memiliki properti turunan yaitu onAction, text, graphis, dan lain-lain.
Constructor Deskripsi
Contoh checkbox:
165
chkUS.setStyle("−fx−border−color: black");
chkUS.setSelected(true);
chkUS.setPadding(new Insets(5, 5, 5, 5));
166
28 CheckBox chkItalic = new CheckBox("Italic");
29 paneForCheckBoxes.getChildren().addAll(chkBold,
chkItalic);
30 pane.setRight(paneForCheckBoxes);
31
32 EventHandler<ActionEvent> handler = e -> {
33 if (chkBold.isSelected() && chkItalic.isSelected()) {
34 text.setFont(fontBoldItalic);
35 }
36 else if (chkBold.isSelected()) {
37 text.setFont(fontBold);
38 }
39 else if (chkItalic.isSelected()) {
40 text.setFont(fontItalic);
41 }
42 else {
43 text.setFont(fontNormal); }
44 };
chkBold.setOnAction(handler);
45 chkItalic.setOnAction(handler);
46 return pane;
47 }
48 public static void main(String[] args) {
49 launch(args);
50 }
51 }
Output
167
11.11.4 RadioButton
Radio button dikenal juga sebagai option buttons, digunakan untuk memilih single item dari
sekelompok item yang ada.
Constructor Deskripsi
168
7 public class RadioButtonDemo extends CheckBoxDemo {
8 @Override
9 protected BorderPane getPane() {
10 BorderPane pane = super.getPane();
11 VBox paneForRadioButtons = new VBox(20);
12 paneForRadioButtons.setPadding(new Insets(5, 5, 5, 5));
13 paneForRadioButtons.setStyle
14 ("−fx−border−width: 2px; -fx-border-color: green");
15
16 RadioButton rbRed = new RadioButton("Red");
17 RadioButton rbGreen = new RadioButton("Green");
18 RadioButton rbBlue = new RadioButton("Blue");
19 paneForRadioButtons.getChildren().addAll(rbRed, rbGreen,
rbBlue);
20 pane.setLeft(paneForRadioButtons);
21
22 ToggleGroup group = new ToggleGroup();
23 rbRed.setToggleGroup(group);
24 rbGreen.setToggleGroup(group);
25 rbBlue.setToggleGroup(group);
26
27 rbRed.setOnAction(e -> {
28 if (rbRed.isSelected()) {
29 text.setFill(Color.RED);
30 }
31 });
32
33 rbGreen.setOnAction(e -> {
34 if (rbGreen.isSelected()) {
35 text.setFill(Color.GREEN);
36 }
37 });
169
38
39 rbBlue.setOnAction(e -> {
40 if (rbBlue.isSelected()) {
41 text.setFill(Color.BLUE);
42 }
43 });
44 return pane;
45 }
46
47 public static void main(String[] args) {
48 launch(args);
49 }
50 }
Output
11.11.5 TextField
Text field digunakan untuk memasukkan/menampilkan teks. Contoh penggunaan textfield:
170
4 import javafx.scene.control.TextField;
5 import javafx.scene.layout.BorderPane;
6 public class TextFieldDemo extends RadioButtonDemo {
7 @Override
8 protected BorderPane getPane() {
9 BorderPane pane = super.getPane();
10
11 BorderPane paneForTextField = new BorderPane();
12 paneForTextField.setPadding(new Insets(5, 5, 5, 5));
13 paneForTextField.setStyle("-fx-border-color: green");
14 paneForTextField.setLeft(new Label("Enter a new message:
"));
15
16 TextField tf = new TextField();
17 tf.setAlignment(Pos.BOTTOM_RIGHT);
18 paneForTextField.setCenter(tf);
19 pane.setTop(paneForTextField);
20
21 tf.setOnAction(e -> text.setText(tf.getText()));
22
23 return pane;
24 }
25 public static void main(String[] args) {
26 launch(args);
27 }
28 }
Output
171
11.11.6 TextArea
TextArea digunakan untuk mengisikan teks panjang multiline. Contoh:
172
20 lblImageTitle.setFont(new Font("SansSerif", 16));
21 taDescription.setFont(new Font("Serif", 14));
22
23 taDescription.setWrapText(true);
24 taDescription.setEditable(false);
25
26 // buat scroll pane utk text area
27 ScrollPane scrollPane = new ScrollPane(taDescription);
28
29 // tempatkan label dan scroll pane dalam border pane
setLeft(lblImageTitle);
30 setCenter(scrollPane);
31 setPadding(new Insets(5, 5, 5, 5));
32 }
33
34 /** Set title */
35 public void setTitle(String title) {
36 lblImageTitle.setText(title);
37 }
38
39 /** Set image view */
40 public void setImageView(ImageView icon) {
41 lblImageTitle.setGraphic(icon);
42 //ina.setPreserveRatio(true);
43 //ina.setFitWidth(250);
44 }
173
Kode 11.24 TextAreaDemo.java
1 import javafx.application.Application;
2 import javafx.stage.Stage;
3 import javafx.scene.Scene;
4 import javafx.scene.image.ImageView;
5
6 public class TextAreaDemo extends Application {
7 @Override
8 public void start(Stage primaryStage) {
9 // membuat description pane
10 DescriptionPane descriptionPane = new DescriptionPane();
11 // Set title, text, and image in the description pane
12 descriptionPane.setTitle("Indonesia");
13 String description = "Bendera Merah Putih ... ";
14 descriptionPane.setImageView(new
15 ImageView("image/benderaIna2.png"));
descriptionPane.setDescription(description);
16 // buat scene dan letakkan pada stage
17 Scene scene = new Scene(descriptionPane, 500, 300);
18 primaryStage.setTitle("TextAreaDemo");
19 primaryStage.setScene(scene);
20 primaryStage.show();
21 }
22 }
Ouput
174
11.11.7 ComboBox
Combo box atau daftar pilihan atau drop-down list berisi daftar item yang dapat dipilih oleh
user.Contoh:
ComboBox<String> cbo = new ComboBox<>();
cbo.getItems().addAll("Item 1", "Item 2","Item 3", "Item 4");
cbo.setStyle("−fx−color: red");
cbo.setValue("Item 1");
175
22 };
23
24 private String[] flagDescription = new String[7];
25 private DescriptionPane descriptionPane = new DescriptionPane();
26 // buat combo box utk memilih negara
27 private ComboBox<String> cbo = new ComboBox<>();
28 @Override
29 public void start(Stage primaryStage) {
// Set text description
30 flagDescription[0] = "Bendera Indonesia ... ";
31 flagDescription[1] = "Description for Kamboja ... ";
32 flagDescription[2] = "Description for Malasya ... ";
33 flagDescription[3] = "Description for Philipina ... ";
34 flagDescription[4] = "Description for singapura ... ";
35 flagDescription[5] = "Description for Thailand ... ";
36 flagDescription[6] = "Description for Vietnam ... ";
37 // Set the first country (Ina) for display
38 setDisplay(0);
39
40 //tambahkan combo box dan description pane pada border
pane
41 BorderPane pane = new BorderPane();
42
43 BorderPane paneForComboBox = new BorderPane();
44 paneForComboBox.setLeft(new Label("pilih negara: "));
45 paneForComboBox.setCenter(cbo);
46 pane.setTop(paneForComboBox);
47 cbo.setPrefWidth(400);
48 cbo.setValue("Indonesia");
49
50 ObservableList<String> items =
FXCollections.observableArrayList(flagTitles);
176
51 cbo.getItems().addAll(items);
52 pane.setCenter(descriptionPane);
53
54 // tampilkan negara terpilih
55 cbo.setOnAction(e ->
setDisplay(items.indexOf(cbo.getValue())));
56
57 // buat scene dan letakkan pada stage
58 Scene scene = new Scene(pane, 550, 270);
59 primaryStage.setTitle("ComboBoxDemo");
60 primaryStage.setScene(scene);
61 primaryStage.show();
62 }
63
64 /** Set display informasi pada description pane */
65 public void setDisplay(int index) {
66 descriptionPane.setTitle(flagTitles[index]);
67 descriptionPane.setImageView(flagImage[index]);
68 descriptionPane.setDescription(flagDescription[index]);
69 }
70 }
Output
11.11.8 ListView
ListView merupakan kontrol yang pada dasarnya sama dengan combobox namun
membolehkan user untuk memilih sebuah item ataupun beberapa item. Contoh:
177
ObservableList<String> items = FXCollections.observableArrayList("Item 1", "Item 2","Item
3", "Item 4", "Item 5", "Item 6");
ListView<String> lv = new ListView<>(items);
lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
// menambahkan suatu listener pada property untuk menangani perubahan nilai pada properti:
lv.getSelectionModel().selectedItemProperty().addListener(ov -> {
System.out.println("Selected indices: " + lv.getSelectionModel().getSelectedIndices());
System.out.println("Selected items: "+ lv.getSelectionModel().getSelectedItems());
});
178
21 new ImageView("image/benderaSing.jpg"),
22 new ImageView("image/benderathai.jpg"),
23 new ImageView("image/benderaViet.jpg")
24 };
25
26 @Override
27 public void start(Stage primaryStage) {
28 ListView<String> lv = new ListView<>
29 (FXCollections.observableArrayList(flagTitles));
30 lv.setPrefSize(400, 400);
31 lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
32 // buat pane utk image views
33 FlowPane imagePane = new FlowPane(10, 10);
34 BorderPane pane = new BorderPane();
35 pane.setLeft(new ScrollPane(lv));
36 pane.setCenter(imagePane);
37 lv.getSelectionModel().selectedItemProperty().addListener(
38 ov -> {
39 imagePane.getChildren().clear();
40 for (Integer i:
41 lv.getSelectionModel().getSelectedIndices()) {
42 imagePane.getChildren().add(flagImage[i]);
}
43 });
44 Scene scene = new Scene(pane, 850, 370);
45 primaryStage.setTitle("ListViewDemo");
46 primaryStage.setScene(scene);
47 primaryStage.show();
48 }
49 }
Output
179
11.11.9 ScrollBar
ScrollBar merupakan control yang digunakan untuk memilih suatu range nilai.
contoh:
ScrollBar sb = new ScrollBar();
sb.valueProperty().addListener(ov −> {
System.out.println("old value: " + oldVal);
System.out.println("new value: " + newVal);
});
180
14 ScrollBar sbHorizontal = new ScrollBar();
ScrollBar sbVertical = new ScrollBar();
15 sbVertical.setOrientation(Orientation.VERTICAL);
16
17 Pane paneForText = new Pane();
18 paneForText.getChildren().add(text);
19
20 BorderPane pane = new BorderPane();
21 pane.setCenter(paneForText);
22 pane.setBottom(sbHorizontal);
23 pane.setRight(sbVertical);
24 // Listener utk horizontal scroll bar value change
25 sbHorizontal.valueProperty().addListener(ov ->
text.setX(sbHorizontal.getValue() * paneForText.getWidth() /
sbHorizontal.getMax()));
26 // Listener utk vertical scroll bar value change
27 sbVertical.valueProperty().addListener(ov ->
text.setY(sbVertical.getValue() * paneForText.getHeight() /
sbVertical.getMax()));
28 Scene scene = new Scene(pane, 450, 170);
29 primaryStage.setTitle("ScrollBarDemo");
30 primaryStage.setScene(scene);
31 primaryStage.show();
32 }
33 }
Output
181
11.11.20 Slider
Slider sama dengan ScrollBar, namun Slider memiliki lebih banyak properties dan memiliki lebih
banyak variasi tampilan.Contoh:
182
21 slVertical.setValue(100);
22 // buat sebuah teks dlm pane
23 Pane paneForText = new Pane();
24 paneForText.getChildren().add(text);
25
26 // buat border pane utk text dan scroll bars
27 BorderPane pane = new BorderPane();
28 pane.setCenter(paneForText);
29 pane.setBottom(slHorizontal);
30 pane.setRight(slVertical);
31
32 slHorizontal.valueProperty().addListener(ov ->
text.setX(slHorizontal.getValue() * paneForText.getWidth()
/slHorizontal.getMax()));
slVertical.valueProperty().addListener(ov –>
33
text.setY((slVertical.getMax()-
slVertical.getValue())*paneForText.getHeight() /slVertical.getMax()));
34
// buat scene dan letakkan pada stage
35
Scene scene = new Scene(pane, 450, 170);
36
primaryStage.setTitle("SliderDemo");
37
primaryStage.setScene(scene);
38
primaryStage.show();
39
}
40
}
41
Output
183
BAB 12 KONSEP DATABASE DAN DBMS
Sistem database sudah digunakan di banyak tempat,sebagai contoh kartu rencana studi
mahasiswa ,nilai mahasiswa,pembayaran mahasiswa di simpan di dalam suatu database.
Ketika belanja online pemesanan barang yang kita lakukan di simpan di dalam database.
Sistem database tidak hanya menyimpan data saja, namun juga menyediakan akses terhadap
data dalam melakukan update,manipulasi, dan analisis terhadap data.
Sistem database terdiri dari data,software yang melakukan penyimpan dan manajemen data
dalam suatu database, dan program aplikasi untuk menyajikam data dan membuat user dapat
berinteraksi menggunakan sistem database.
Gambar 21.1 Sistem database terdiri dari data, DBMS dan program aplikasi.
184
Gambar 12.2 Program aplikasi dapat mengkases banyak DBMS
Gambar 12.3 Suatu table memiliki nama table, nama kolom dan baris
185
Gambar 12.5 Tabel Enrollment menyimpan informasi tentang Enrollment dari student.
Integritas (integrity constraint) merupakan kondisi legal pada suatu tabel yang harus
dipenuhi, dimana ada tiga jenis constraint yaitu:domain constraint,primary key
constraint,foreign key constraint.
12.2 SQL
SQL merupakan bahasa untuk mengakses sistem database relasional.program aplikasi harus
menggunakan SQL untuk dapat mengakses database. create,drop table,retrieve,modifikasi
data. MySQL adalah salah satu software DBMS, untuk memasang MySQL pada komputer
kita , kita dapat menggunakan XAMPP , yang merupakan software aplikasi gratis untuk
aplikasi database mysql,web server, dan mail server.
186
Lokasi file mysql pada folder xampp
D:\xampp\mysql\bin\Mysql –root –p
(password dikosongkan kemudian enter)
187
Eksekusi query menggunakan command text:
SQLYog merupakan program aplikasi mode GUI untuk me-manage database mysql dimana
untuk memanage database akan lebih mudah menggunakan aplikasi ini dibandingkan dengan
command text.
188
Gambar 12.10 eksekusi query membuat user,membuat database,membuat table,mengisi data
pada tabel,dan menampilkan isi tabeL.
189
BAB 13 APLIKASI CRUD DENGAN JDBC
JDBC merupakan API java untuk membuat aplikasi database.Dengan menggunakan API
JDBC suatu aplikasi dapat mengeksekusi query SQL,menampilkan hasil, dan menyajikan
data ke dalam bentuk yang user-friendly.
Gambar 13.1 Program Java yang mengakses dan memanipulasi database menggunakan JDBC
Driver
Gambar 13.2 Class-class JDBC membuat program dapat terkoneksi dengan database,
mengirim statement SQL dan memproses result/hasil.
190
13.2 Koneksi ke database
Untuk membuat koneksi ke database menggunakan method getConnection pada class
Connetion.
Contoh:
Connection cn =
DriverManager.getConnection("jdbc:mysql://localhost/dbjava","nina","123");
Statement st = cn.createStatement();
String sql = "insert into tbmhs(idmhs, nim, nama, kota_asal) values (3,
'A11.2017.00003', 'BUDI', 'SALATIGA')";
st.executeUpdate(sql);
191
pst.setString(3,"UMAR");
pst.setString(4,"SEMARANG");
pst.executeUpdate();
System.out.println("Insert berhasil ...");
cn=DriverManager.getConnection("jdbc:mysql://localhost/dbjava","nina","123
");
System.out.println("Koneksi Berhasil");
//membuat statement
Statement st = cn.createStatement();
String sql="select * from tbmhs";
ResultSet rs = st.executeQuery(sql);
rs.beforeFirst();
while (rs.next()){
System.out.println(rs.getString(1));
}
192
"123");
7 System.out.println("Koneksi berhasil");
8 }catch(SQLException se){
9 se.printStackTrace();
10 }
11 return cn;
12 }
13 public static void main(String[] args){
14 MySQLDB.getConnection();
15 }
16 }
Output
193
11 }
12 return cn;
13 }
14 }
194
27 try{
28 Connection cn=MySQLDB.getConnection();
29 Statement st = cn.createStatement();
30 String sql="Update tbmhs set nama='HERU' where
idmhs=1";
31 st.executeUpdate(sql);
32 System.out.println("UPDATE berhasil ...");
33 }catch(SQLException se){
34 se.printStackTrace(); }
35 });
36 btDel.setOnAction(e->{
37 try{
38 Connection cn=MySQLDB.getConnection();
39 Statement st = cn.createStatement();
40 String sql="delete from tbmhs where idmhs=7";
41 st.executeUpdate(sql);
42 System.out.println("Delete berhasil ...");
43 }catch(SQLException se){
44 se.printStackTrace();
45 }
46 });
47 hb.getChildren().addAll(btInsert,btUpdate,btDel);
48 Scene sc = new Scene(hb,300,200);
49 s.setTitle("Test Database");
50 s.setScene(sc);
51 s.show();
52 }
53 }
Output
195
Contoh program dengan PreparedStatement insert,update,delete
196
28 });
29 btUpdate.setOnAction(e->{
30 try{
31 Connection cn=MySQLDB.getConnection();
32 String sql="Update tbmhs set nama='HERU' where idmhs=?";
33 PreparedStatement pst = cn.prepareStatement(sql);
34 pst.setInt(1,1);
35 pst.executeUpdate();
36 System.out.println("Update berhasil ...");
37 }catch(SQLException se){
38 se.printStackTrace();
39 }
40 });
41 btDel.setOnAction(e->{
42 try{
43 Connection cn=MySQLDB.getConnection();
44 String sql="delete from tbmhs where idmhs=?";
45 PreparedStatement pst = cn.prepareStatement(sql);
46
pst.setInt(1,7);
47
pst.executeUpdate();
48
System.out.println("Delete berhasil ...");
49
50 }catch(SQLException se){
51 se.printStackTrace();
52 }
53 });
54 hb.getChildren().addAll(btInsert,btUpdate,btDel);
55 Scene sc = new Scene(hb,300,200);
56 s.setTitle("Test Database");
57 s.setScene(sc);
58 s.show();
59 }
197
60 }
198
26 public String getNama() {
27 return nama;
28 }
29
30 public void setNama(String nama) {
31 this.nama = nama;
32 }
33
34 public String getKota_asal() {
35 return kota_asal;
36 }
37
38 public void setKota_asal(String kota_asal) {
39 this.kota_asal = kota_asal;
40 }
41 }
199
16 Scene sc = new Scene(getHBTabel(),600,400);
17 s.setTitle("Test Database");
18 s.setScene(sc);
19 s.show();
20 }
21 public HBox getHBTabel(){
22 HBox hb= new HBox();
23 TableView<MHS> tbMHS = new TableView();
24 hb.getChildren().add(tbMHS);
25 TableColumn<MHS,Integer> colIdmhs= new
TableColumn("ID");
26 TableColumn<MHS,String> colNim=new
TableColumn("NIM");
27 TableColumn<MHS,String> colNama=new
TableColumn("Nama");
28 TableColumn<MHS,String> colKota_asal=new
TableColumn("Kota Asal");
29
30 colIdmhs.setCellValueFactory(new
PropertyValueFactory<>("idmhs"));
31 colNim.setCellValueFactory(new
PropertyValueFactory<>("nim"));
32 colNama.setCellValueFactory(new
PropertyValueFactory<>("nama"));
33 colKota_asal.setCellValueFactory(new
PropertyValueFactory<>("kota_asal"));
34
35 colIdmhs.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
36
37 colNim.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
38 colNama.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
200
39 colKota_asal.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
tbMHS.getColumns().addAll(colIdmhs,colNim,colNama,colKota_asal);
40
tbMHS.setItems(getAllMhs());
41
return hb;
42
}
43
public ObservableList<MHS> getAllMhs(){
44
Output
201
Metadata
interface Connection membuat koneksi terhadap database, koneksi yang membuat statement
sql dapat dieksekusi dan dapat menghasilkan data resultset. Connetion juga menyediakan
akses informasi meta data dari sebuah database dimana informasi metadata tersebut
menjelaskan kapabilitas dari suatu database diantaranya dukungan terhadap bentuk SQL,store
procedure dll.
Untuk membuat obyek dari Metadata sebuah database digunakan method getMetadata pada
obyek koneksi.
202
12 System.out.println("JDBC driver version: " +
dbMetaData.getDriverVersion());
13 System.out.println("JDBC driver major version: " +
dbMetaData.getDriverMajorVersion());
14 System.out.println("JDBC driver minor version: " +
dbMetaData.getDriverMinorVersion());
15 System.out.println("Max number of connections: " +
dbMetaData.getMaxConnections());
16 System.out.println("MaxTableNameLength: " +
dbMetaData.getMaxTableNameLength());
17 System.out.println("MaxColumnsInTable: " +
dbMetaData.getMaxColumnsInTable());
18 connection.close();
19 }
20 }
203
3 public class TestRSMetaData {
4 public static void main(String[] args) throws SQLException,
ClassNotFoundException {
5 // Connect to a database
6 Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost/dbjava",
"root", "");
7 System.out.println("Database connected");
8 // Create a statement
9 Statement statement = connection.createStatement();
10 // Execute a statement
11 ResultSet resultSet = statement.executeQuery("select *
from tbmhs");
12
13 ResultSetMetaData rsMetaData =
resultSet.getMetaData();
14 for (int i = 1; i <= rsMetaData.getColumnCount(); i++)
15 System.out.printf("%-12s\t", rsMetaData.getColumnName(i));
16 System.out.println();
17 // Iterate through the result and print the students'
column
18 while (resultSet.next()) {
19 for (int i = 1; i <= rsMetaData.getColumnCount();
i++)
20 System.out.printf("%-12s\t",
resultSet.getObject(i));
21 System.out.println();
22 }
23 // Close the connection
24 connection.close();
25 }
26 }
204
Output
205
Gambar 13.9 Project terdiri dari package controller, model dan view.
Package view
Kode 13.9 AplikasJiFX5.java
1 package aplikasijfx5.view;
2
3 import javafx.application.Application;
4 import javafx.event.ActionEvent;
5 import javafx.event.EventHandler;
6 import javafx.scene.Scene;
7 import javafx.scene.control.Button;
8 import javafx.scene.layout.HBox;
9 import javafx.scene.layout.StackPane;
10 import javafx.stage.Stage;
11 public class AplikasJiFX5 extends Application {
12 static PanelKiri pnKiri= new PanelKiri();
13 static PanelKanan pnKanan = new PanelKanan();
206
14 @Override
15 public void start(Stage primaryStage) {
16 HBox hbMain = new HBox(10);
17
pnKiri.prefWidthProperty().bind(hbMain.widthProperty().divide(3));
18 pnKanan.prefWidthProperty().bind(hbMain.
widthProperty().subtract(hbMain.widthProperty().divide(3)));
19 hbMain.getChildren().addAll(pnKiri,pnKanan);
20 Scene scene = new Scene(hbMain, 800, 600);
21
22 primaryStage.setTitle("Data MHS");
23 primaryStage.setScene(scene);
24 primaryStage.show();
25 }
26 public static void main(String[] args) {
27 launch(args);
28 }
29 }
207
14 import javafx.scene.control.cell.PropertyValueFactory;
15 import javafx.scene.image.Image;
16 import javafx.scene.image.ImageView;
17 import javafx.scene.layout.HBox;
18 import javafx.scene.layout.VBox;
19
20 public class PanelKanan extends VBox{
21 HBox hbSearch = new HBox(10);
22 TextField tfSearch = new TextField();
23 Button btSearch,btAdd,btEdit,btDelete ;
24 TableView<MHSM> tbMHS = new TableView();
25 MHSC mhsc = new MHSC();
26 public PanelKanan(){
27 Image imgAdd = new Image("image/tambah.png");
28 Image imgEdit = new Image("image/edit.png");
29 Image imgDel = new Image("image/del.png");
30 Image imgSearch = new Image("image/search.png");
31
32 ImageView ivAdd = new ImageView(imgAdd);
33 ivAdd.setFitWidth(70);
34 ivAdd.setFitWidth(30);
35 ImageView ivEdit = new ImageView(imgEdit);
36 ivEdit.setFitWidth(70);
37 ivEdit.setFitWidth(30);
38 ImageView ivDel = new ImageView(imgDel);
39 ImageView ivSearch = new ImageView(imgSearch);
40 btSearch = new Button("Search",ivSearch);
41 btAdd = new Button("Add",ivAdd);
42 btEdit = new Button("Edit",ivEdit);
43 btDelete = new Button("Delete",ivDel);
44 btAdd.setPrefWidth(120);
45 btAdd.setPrefHeight(40);
208
46 btEdit.setPrefWidth(120);
47 btEdit.setPrefHeight(40);
48 btDelete.setPrefWidth(120);
49 btDelete.setPrefHeight(40);
50 btSearch.setPrefWidth(120);
51 btSearch.setPrefHeight(40);
52 tfSearch.setPrefWidth(200);
53 TableColumn<MHSM,Integer> colIdmhs= new TableColumn("ID");
54 TableColumn<MHSM,String> colNim=new TableColumn("NIM");
55 TableColumn<MHSM,String> colNama=new TableColumn("Nama");
56 TableColumn<MHSM,String> colKota_asal=new TableColumn("Kota
Asal");
57
58 colIdmhs.setCellValueFactory(new
PropertyValueFactory<>("idmhs"));
59 colNim.setCellValueFactory(new
PropertyValueFactory<>("nim"));
60 colNama.setCellValueFactory(new
PropertyValueFactory<>("nama"));
61 colKota_asal.setCellValueFactory(new
PropertyValueFactory<>("kota_asal"));
62
colIdmhs.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
63 colNim.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
64 colNama.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
65 colKota_asal.prefWidthProperty().bind(tbMHS.widthProperty().
divide(4));
66
67
68 tbMHS.getColumns().addAll(colIdmhs,colNim,colNama,colKota_asal);
69 tbMHS.setItems(mhsc.getAllMhs());
209
70 //hbSearch.setAlignment(Pos.CENTER);
71
hbSearch.getChildren().addAll(btAdd,btEdit,btDelete,tfSearch,
btSearch);
72 this.getChildren().addAll(hbSearch,tbMHS);
73 btAdd.setOnMouseClicked(e->{
74 AplikasJiFX5.pnKiri.aktif(true);
75 AplikasJiFX5.pnKiri.blAdd=true;
76 AplikasJiFX5.pnKiri.tfID.requestFocus();
77 });
78 btSearch.setOnMouseClicked(e->{
79
80 this.tbMHS.setItems(mhsc.searchMHS(tfSearch.getText()));
81 });/*
82 tbMHS.setOnMouseClicked(e->{
83 MHSM m= tbMHS.getSelectionModel().getSelectedItem();
84 AplikasJiFX5.pnKiri.tfID.setText(
String.valueOf(m.getIdmhs()));
85 AplikasJiFX5.pnKiri.tfNIM.setText( m.getNim());
86 AplikasJiFX5.pnKiri.tfNama.setText( m.getNama());
87 AplikasJiFX5.pnKiri.tfKota.setText( m.getKota_asal());
88 AplikasJiFX5.pnKiri.tempId=m.getIdmhs();
89 }); */
90 btEdit.setOnMouseClicked(e->{
91 MHSM m= tbMHS.getSelectionModel().getSelectedItem();
92 AplikasJiFX5.pnKiri.tfID.setText(
String.valueOf(m.getIdmhs()));
93 AplikasJiFX5.pnKiri.tfNIM.setText( m.getNim());
94 AplikasJiFX5.pnKiri.tfNama.setText( m.getNama());
95 AplikasJiFX5.pnKiri.tfKota.setText( m.getKota_asal());
96 AplikasJiFX5.pnKiri.tempId=m.getIdmhs();
97
98 AplikasJiFX5.pnKiri.aktif(true);
210
99 AplikasJiFX5.pnKiri.tfID.setEditable(false);
100 AplikasJiFX5.pnKiri.blAdd=false;
101 AplikasJiFX5.pnKiri.tfNama.requestFocus();
102 });
103 btDelete.setOnMouseClicked(e->{
104 MHSM m= tbMHS.getSelectionModel().getSelectedItem();
105 //
106 Alert alert = new Alert(AlertType.CONFIRMATION);
107 alert.setTitle("Hapus Data");
108 alert.setHeaderText("Yakin data dihapus?");
109 alert.setContentText("data "+m.getNama()+" dihapus");
110 Optional<ButtonType> option = alert.showAndWait();
111
112 if (option.get() == ButtonType.OK){
113 mhsc.delete(String.valueOf(m.getIdmhs()));
114 this.tbMHS.setItems(mhsc.getAllMhs());
115 }
116 //
117 });
118 }
119 }
211
11 import javafx.scene.image.ImageView;
12 import javafx.scene.layout.GridPane;
13 import javafx.scene.layout.VBox;
14
15 public class PanelKiri extends VBox {
16 Label lbID = new Label("ID");
17 Label lbNIM = new Label("NIM");
18 Label lbNama = new Label("Nama");
19 Label lbKota = new Label("Kota Asal");
20 TextField tfID=new TextField();
21 TextField tfNIM=new TextField();
22 TextField tfNama=new TextField();
23 TextField tfKota=new TextField();
24 Button btUpdate ;
25 Button btCancel;
26 int tempId;
27 boolean blAdd;
28 MHSC mhsc = new MHSC();
29
30 public PanelKiri(){
31 GridPane gp = new GridPane();
32 gp.add(lbID,0,0);
33 gp.add(lbNIM,0,1);
34 gp.add(lbNama,0,2);
35 gp.add(lbKota,0,3);
36 gp.add(tfID,1,0);
37 gp.add(tfNIM,1,1);
38 gp.add(tfNama,1,2);
39 gp.add(tfKota,1,3);
40 gp.setVgap(5);gp.setHgap(5);
41 tfID.setPromptText("ID MHS");
42 tfNIM.setPromptText("NIM");
212
43 tfNama.setPromptText("Nama");
44 tfKota.setPromptText("Kota Asal");
45 lbID.setStyle("-fx-text-fill:white;");
46 lbNIM.setStyle("-fx-text-fill:white;");
47 lbNama.setStyle("-fx-text-fill:white;");
48 lbKota.setStyle("-fx-text-fill:white;");
49 Image imgUpd = new Image("image/diskette.png");
50 Image imgCancel = new Image("image/rotation.png");
51 ImageView ivUpd = new ImageView(imgUpd);
52 ImageView ivCancel = new ImageView(imgCancel);
53 ivUpd.setFitWidth(70);
54 ivUpd.setFitWidth(30);
55
56 btUpdate = new Button("Update",ivUpd);
57 btUpdate.setPrefWidth(120);
58 btUpdate.setPrefHeight(40);
59 btCancel = new Button("Cancel",ivCancel);
60 btCancel.setPrefWidth(120);
61 btCancel.setPrefHeight(40);
62 //btUpdate.setStyle("-fx-background-color:green;-fx-text-
fill:white;-fx-font-size:14;");
63 //btCancel.setPrefWidth(100);
64 //btCancel.setStyle("-fx-background-color:green;-fx-text-
fill:white;-fx-font-size:14;");
65
66 tfID.setEditable(false);
67 this.getChildren().addAll(gp,btUpdate,btCancel);
68 this.setSpacing(10);
69 this.setPadding(new Insets(10));
70 this.setStyle("-fx-background-color:blue;");
71 this.setAlignment(Pos.CENTER);
72 aktif(false);
213
73 btCancel.setOnMouseClicked(e -> {
74 kosong();
75 aktif(false);
76 });
77 btUpdate.setOnMouseClicked(e -> {
78 if (!tfID.getText().equals("")){
79 MHSM m = new MHSM();
80 m.setIdmhs(Integer.parseInt(tfID.getText()) );
81 m.setNim(tfNIM.getText());
82 m.setNama(tfNama.getText());
83 m.setKota_asal(tfKota.getText());
84 if (blAdd==true)
85 mhsc.insert(m);
86 else{
87 m.setIdmhs(tempId);
88 mhsc.update(m);
89 }
90
AplikasJiFX5.pnKanan.tbMHS.setItems(mhsc.getAllMhs());
91 kosong();
92 aktif(false);
93 }
94
95 });
96 }
97 public void kosong(){
98 tfID.setText("");
99 tfNIM.setText("");
100 tfNama.setText("");
101 tfKota.setText("");
102 }
103 public void aktif(boolean bl){
214
104 tfID.setEditable(bl);
105 tfNIM.setEditable(bl);
106 tfNama.setEditable(bl);
107 tfKota.setEditable(bl);
108 }
109 }
Package model
215
24 public void setNim(String nim) {
25 this.nim = nim;
26 }
27 public String getNama() {
28 return nama;
29 }
30 public void setNama(String nama) {
31 this.nama = nama;
32 }
33 public String getKota_asal() {
34 return kota_asal;
35 }
36 public void setKota_asal(String kota_asal) {
37 this.kota_asal = kota_asal;
38 }
39 }
Package controller
216
15 public void insert(MHSM m){
16 try {
17 st=MyConnection.getConnection().createStatement();
18 String sql="insert into tbmhs
(idmhs,nim,nama,kota_asal) values('"+m.getIdmhs()+"','"+m.
getNim()+"','"+m.getNama()+"','"+m.getK ota_asal()+"') ";
19 st.executeUpdate(sql);
20 } catch (SQLException ex) {
21
Logger.getLogger(MHSC.class.getName()).log(Level.SEVERE, null, ex);
22 }
23 }
24 public void update(MHSM m){
25 try {
26 st=MyConnection.getConnection().createStatement();
27 String sql="update tbmhs set Nim =
'"+m.getNim()+"',nama='"+m.getNama()+"',kota_asal='"+
m.getKota_asal()+"' where idmhs='"+m.getIdmhs()+"'";
28 st.executeUpdate(sql);
29 } catch (SQLException ex) {
30
Logger.getLogger(MHSC.class.getName()).log(Level.SEVERE,
31
null, ex);
}
32
}
33
public void delete(String idMhs){
34
try {
35
st=MyConnection.getConnection().createStatement();
36
String sql = "delete from tbmhs where idMhs='"+
37
idMhs+"'";
st.executeUpdate(sql);
38
} catch (SQLException ex) {
39
217
40 Logger.getLogger(MHSC.class.getName()).log(Level.SEVERE,
null, ex);
41 }
42 }
43 public ObservableList<MHSM> getAllMhs(){
44 ObservableList<MHSM> lmhs=
FXCollections.observableArrayList();
45 try {
46 st=MyConnection.getConnection().createStatement();
47 String sql="select * from tbmhs";
48 ResultSet rs=st.executeQuery(sql);
49 rs.beforeFirst();
50 while(rs.next()){
51 MHSM m = new MHSM();
52 m.setIdmhs(Integer.parseInt(rs.getString(1)));
53 m.setNim(rs.getString(2));
54 m.setNama(rs.getString(3));
55 m.setKota_asal(rs.getString(4));
56 lmhs.add(m);
57 System.out.println(m);
58 }
59 } catch (SQLException ex) {
60
Logger.getLogger(MHSC.class.getName()).log(Level.SEVERE,
null, ex);
61 }
62 return lmhs;
63 }
64 public ObservableList<MHSM> searchMHS(String nama){
65 ObservableList<MHSM> lmhs=
FXCollections.observableArrayList();
66 try {
218
67 st=MyConnection.getConnection().createStatement();
68 String sql="select * from tbmhs where nama
like'%"+nama+"%'";
69 ResultSet rs=st.executeQuery(sql);
70 rs.beforeFirst();
71 while(rs.next()){
72 MHSM m = new MHSM();
73 m.setIdmhs(Integer.parseInt(rs.getString(1)));
74 m.setNim(rs.getString(2));
75 m.setNama(rs.getString(3));
76 m.setKota_asal(rs.getString(4));
77 lmhs.add(m);
78 System.out.println(m);
79 }
80 } catch (SQLException ex) {
81
Logger.getLogger(MHSC.class.getName()).log(Level.SEVERE,
null, ex);
82 }
83 return lmhs;
84 }
85 }
219
10 public static Connection getConnection(){
11 if (con==null){
12 try{
13 con =
DriverManager.getConnection("jdbc:mysql://localhost/javadb","root",
"");
14 //System.out.println("KOneksi berhasil...");
15 }catch(SQLException se){
16 se.printStackTrace();
17 }
18 }
19 return con;
20 }
21 public static void disconnect(){
22 if (con!=null)
23 con=null;
24 }
25 }
220
13.6 SQLLite
SQLite adalah database-engine SQL transaksional yang berdiri sendiri. dan merupakan
database yang dalam penggunaannya tidak memerlukan konfigurasi sehingga berbeda
dengan database lain .
SQLite tidak memerlukan proses server atau sistem yang terpisah untuk beroperasi
(serverless).
SQLite tidak memerlukan konfigurasi dalam penggunaannya, yang artinya tidak diperlukan
pengaturan atau administrasi terhadap database. Database SQLite lengkap disimpan dalam
sebuah file disk yang memiliki format lintas platform. SQLite sangat kecil dan ringan,
dengan ukuran kurang dari 400KB atau kurang dari 250KB dengan fitur opsional
dihilangkan.
SQLite mandiri, yang berarti tidak ada ketergantungan eksternal dengan aplikasi dan sistem
lainnya.
Transaksi SQLite sepenuhnya sesuai standar ACID(Atomicity, Consistency, Isolation,
Durability), yang memungkinkan akses yang aman dari berbagai proses atau threads. SQLite
mendukung sebagian besar fitur bahasa query dalam standar SQL92 (SQL2).SQLite ditulis
dalam ANSI-C dan menyediakan API yang sederhana dan mudah digunakan.SQLite tersedia
di UNIX (Linux, Mac OS-X, Android, iOS) dan Windows (Win32, WinCE, WinRT).
Tabel 13.1 Beberapa fitur yang tidak didukung dari SQL92 di SQLite
No Fitur yg tidak didukung Keterangan
3 ALTER TABLE RENAME TABLE dan ADD COLUMN pada the ALTER
TABLE didukung
221
5 View VIEW dalam SQLite bersifat read-only
6 GRANT and REVOKE Satu-satunya izin akses yang dapat diterapkan adalah izin
akses file normal dari sistem operasi yang mendasarinya.
222
" nama TEXT NOT NULL, " +
" kota_asalCHAR(50))";
9 stmt.executeUpdate(sql);
10 stmt.close();
11 c.close();
12
13 } catch ( ClassNotFoundException | SQLException e ) {
14 System.err.println( e.getClass().getName() + ": " +
e.getMessage() );
15 }
223
18 c.close();
19 } catch ( Exception e ) {
System.err.println( e.getClass().getName() + ": " +
20 e.getMessage() );
}
224
Contoh Aplikasi Lengkap dengan database SQLLite:
225
13 import javafx.event.ActionEvent;
14 import javafx.event.EventHandler;
15 import javafx.scene.Scene;
16 import javafx.scene.control.Button;
17 import javafx.scene.control.TableColumn;
18 import javafx.scene.control.TableView;
19 import javafx.scene.control.cell.PropertyValueFactory;
20 import javafx.scene.layout.HBox;
21 import javafx.scene.layout.StackPane;
22 import javafx.scene.layout.VBox;
23 import javafx.stage.Stage;
24
25 public class JFXSQLLite1 extends Application {
26 TableView<MHS> tbMHS = new TableView();
27 @Override
28 public void start(Stage primaryStage) {
29
30 Button btnDB = new Button("createDB");
31 Button btnTB = new Button("createTable");
32 Button btnIns = new Button("InserData");
33 btnDB.setOnAction(e->{
34 createDB();
35 });
36 btnIns.setOnAction(e->{
37 insertData();
38 });
39 btnTB.setOnAction(e->{
40 createTabel();
41 });
42 HBox hb = new HBox();
43 hb.getChildren().addAll(btnDB,btnTB,btnIns);
44 VBox vb = new VBox();
226
45 vb.getChildren().addAll(hb,getTbl());
46 Scene scene = new Scene(vb, 300, 250);
47 primaryStage.setTitle("Hello World!");
48 primaryStage.setScene(scene);
49 primaryStage.show();
50 }
51
52 public static void main(String[] args) {
53 launch(args);
54 }
55
56 void createDB(){
57 Connection c ;
58 Statement stmt;
59 try {
60 Class.forName("org.sqlite.JDBC");
61 c = DriverManager.getConnection("jdbc:sqlite:test.db");
62 System.out.println("Opened database successfully");
63 c.close();
64
65 } catch ( ClassNotFoundException | SQLException e ) {
66 System.err.println( e.getClass().getName() + ": " +
e.getMessage() );
67 //System.exit(0);
68 }
69 System.out.println("Opened database successfully");
70 }
71
72 void createTabel(){
73 Connection c = null;
74 Statement stmt = null;
75 try {
227
76 Class.forName("org.sqlite.JDBC");
77 c = DriverManager.getConnection("jdbc:sqlite:test.db");
78 System.out.println("Opened database successfully");
79 stmt = c.createStatement();
80 String sql = "CREATE TABLE tbmhs " +
"(idmhs INT PRIMARY KEY NOT NULL," +
" nim TEXT, " +
" nama TEXT, " +
" kota_asal TEXT )";
81 stmt.executeUpdate(sql);
82 stmt.close();
83 c.close();
84
85 } catch ( Exception e ) {
86 System.err.println( e.getClass().getName() + ": " +
e.getMessage() );
87 //System.exit(0);
88 }
89 System.out.println("Create table successfully");
90 }
91
92 void insertData(){
93 Connection c = null;
94 Statement stmt = null;
95 try {
96 Class.forName("org.sqlite.JDBC");
97 c = DriverManager.getConnection("jdbc:sqlite:test.db");
98 System.out.println("Opened database successfully");
99 stmt = c.createStatement();
100 String sql = "insert into tbmhs(idmhs,nim,nama,kota_asal)
values (1,'A11.2017.00001','AGUS','SEMARANG') ";
101 stmt.executeUpdate(sql);
228
102 sql = "insert into tbmhs(idmhs,nim,nama,kota_asal) values
(2,'A11.2017.00002','BUDI','SEMARANG') ";
stmt.executeUpdate(sql);
103
sql = "insert into tbmhs(idmhs,nim,nama,kota_asal) values
104
(3,'A11.2017.00003','WATI','SEMARANG') ";
stmt.executeUpdate(sql);
105
106
stmt.close();
107
c.commit();
108
c.close();
109
110
} catch ( Exception e ) {
111
System.err.println( e.getClass().getName() + ": " +
112
e.getMessage() );
113 }
114 System.out.println("insert data successfully");
115 }
116
117 @SuppressWarnings("CallToPrintStackTrace")
118 public ObservableList<MHS> getAllMhs(){
119 Connection c ;
120 Statement st;
121 ResultSet rs;
122 ObservableList<MHS> lmhs=
FXCollections.observableArrayList();
123 try {
124 c = DriverManager.getConnection("jdbc:sqlite:test.db");
125 String sql="select * from tbmhs";
126 st = c.createStatement();
127 rs=st.executeQuery(sql);
128 while(rs.next()){
129 MHS m = new MHS();
229
130 m.setIdmhs(Integer.parseInt(rs.getString(1)));
131 m.setNim(rs.getString(2));
132 m.setNama(rs.getString(3));
133 m.setKota_asal(rs.getString(4));
134 lmhs.add(m);
135 System.out.println(m);
136 }
137 } catch (Exception ex) {
138 System.err.println(ex);
139 }
140 return lmhs;
141 }
142 public HBox getTbl(){
143 HBox hb = new HBox();
144
145 TableColumn<MHS,Integer> colIdmhs= new TableColumn("ID");
146 TableColumn<MHS,String> colNim=new TableColumn("NIM");
147 TableColumn<MHS,String> colNama=new TableColumn("Nama");
148 TableColumn<MHS,String> colKota_asal=new TableColumn("Kota
Asal");
149
150 colIdmhs.setCellValueFactory(new
PropertyValueFactory<>("idmhs"));
151 colNim.setCellValueFactory(new
PropertyValueFactory<>("nim"));
152 colNama.setCellValueFactory(new
PropertyValueFactory<>("nama"));
153 colKota_asal.setCellValueFactory(new
PropertyValueFactory<>("kota_asal"));
154
colIdmhs.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
155
156 colNim.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
230
157
colNama.prefWidthProperty().bind(tbMHS.widthProperty().divide(4));
158
159 colKota_asal.prefWidthProperty().bind(tbMHS.widthProperty().divide(4)
);
160
161
tbMHS.getColumns().addAll(colIdmhs,colNim,colNama,colKota_asal);
162 tbMHS.setItems(getAllMhs());
163 hb.getChildren().add(tbMHS);
164 return hb;
165 }
166 }
231
19 }
20 public String getNim() {
21 return nim;
22 }
23 public void setNim(String nim) {
24 this.nim = nim;
25 }
26 public String getNama() {
27 return nama;
28 }
29 public void setNama(String nama) {
30 this.nama = nama;
31 }
32 public String getKota_asal() {
33 return kota_asal;
34 }
35 public void setKota_asal(String kota_asal) {
36 this.kota_asal = kota_asal;
37 }
38 }
Output
232
BAB 14 GUI DAN MVC CRUD MENGGUNAKAN NETBEANS
Pada bab-bab sebelumnya, untuk membuat program Java kita menggunakan Notepad.
Selain itu kita juga bisa menggunakan text editor yang lain seperti Wordpad, Sublime, Visual
Studio Code, atau yang lain. Untuk compile dan run program menggunakan command
window. Namun, pada bab ini kita bisa menggunakan Java development tools berupa
Integrated Development Evironment (IDE) seperti Netbeans atau Eclipse. IDE tersebut dapat
digunakan untuk membuat, mengedit, compile, run, dan debugging pemrograman Java
dengan cepat dengan satu tampilan. Sehingga kita dapat meningkatkan produktivitas kita
dalam pemrograman. Berikut cara membuat pemrograman Graphical User Interface (GUI)
Java menggunakan IDE Netbeans.
233
14.2 Java Form
Setelah membuka Netbeans, mari kita membuat Project untuk program kita. Ikuti
langkah-langkah berikut dengan seksama:
1. Klik File – New Project – pilih Java – Java Application – Next – ketik judul project
dengan “MenuForm” – terakhir klik Finish.
234
3. Rubah nama variabel pada textfield. Nama variabel digunakan sebagai perwakilan dari
komponen UI tersebut untuk dapat di program. Cara 1: klik pada textfield lihat
property. Cara 2: klik kanan pada textfield Change Variable Name. Beri nama variabel
textfield denga nama “txtNama”. Selain itu untuk label output “Nama saya ...” ganti
nama variabel menjadi “txtOutput”. Button cetak ganti variabelnya menjadi “btnCetak”.
txtNama
btnCetak txtOutput
4. Netbeans menyediakan Event-Listener Otomatis dengan cara double klik pada btnCetak.
Tambahkan kode seperti pada gambar berikut:
235
GetNama()
btnPindah txtNama
btnBack
7. Mari kita kirimkan teks antar form. Buat Method di dalam form MainMenuForm dengan
nama GetNama().
9. Masih di dalam Form CreditsForm, klik kanan pada Form dan tambahkan event seperti
pada gambar 14.10. Tambahkan didalam event listener windowActivated kode:
txtNama.setText(txtNamaDariFormLain). Tambahkan event pada btnBack (double
klik pada btnBack) seperti pada gambar 14.10. Run dan lihat apa yang terjadi!
236
Gambar 14.10 Edit beberapa tempat di Form CreditsForm
237
3. Tambahkan Library Mysql dengan cara klik kanan pada Libraries Pilih Add Library
Cari MySQL JDBC Driver Add Library
4. Siapkan Package/ Folder untuk MVC. Klik kanan pada Source Packages New Java
Packages. Buat package dengan nama “mvc.Controller”, ”mvc.DAO”,
”mvc.DAOInterface”, ”mvc.Koneksi”, ”mvc.Model”, dan “mvc.View”.
5. Buat Class Koneksi didalam package mvc.Koneksi (Klik kanan pada mvc.Koneksi new
Java Class
238
Gambar 14.14 Class Koneksi
6. Buat Class Mahasiswa didalam package mvc.Model. Buatlah property private Integer id,
private String nim, private String nama, private String jk, dan private String alamat.
Setelah itu, blok semua kode diatas klik kanan Refactor Encapsulate Fields
Refactor. Maka akan membuat Getter Setter otomatis.
239
7. Buat Class TabelModelMahasiswa.java didalam package mvc.Model.
241
242
Gambar 14.18 Class DAOMahasiswa.java
10. Buat Form dengan JFrame Form dialam package mvc.View dengan nama
“FormMahasiswa”. Khusus untuk jkel combo box properties Model diganti L,P.
243
Gambar 14.19 GUI dan aturan nama variabel pada FormMahasiswa
• ControllerMahasiswa cbt;
• cbt.isiTable();
• cbt.insert();
• cbt.isiTable();
244
• cbt.reset();
• cbt.update();
• cbt.isiTable();
• cbt.reset();
• cbt.delete();
• cbt.isiTable();
• cbt.reset();
• cbt.reset();
• cbt.carinama();
246
247
Gambar 14.21 Class ControllerMahasiswa.java
2. Aktifkan Native Packaging pada Project.. Klik kanan pada project misal: CRUD_MVC
Pilih dan klik Properties. Cari Deployment centang enable native pakaging oke
248
3. Klik kanan pada project Package as EXE Installer. Tunggu beberapa saat karena
prosesnya cukup lama.
14.5 Kesimpulan
Kita bisa menggunakan Java development tools berupa Integrated Development
Evironment (IDE) seperti Netbeans atau Eclipse untuk membuat, mengedit, compile, run, dan
debugging pemrograman Java dengan cepat dengan satu tampilan. Sehingga kita dapat
meningkatkan produktivitas kita dalam pemrograman. Komponen-komponen GUI
menggunakan Java Swing yang terdiri dari Swing Containers, Swing Controls, Swing Menus,
dan Swing Windows.
249
14.6 Kuis dan Latihan Soal
1. Jelaskan alasan kenapa lebih cepat membuat program Java menggunakan IDE
daripada menggunakan text editor?
14.7 Praktikum
Terdapat suatu event yang diadakan oleh pemerintah yaitu tentang Pendaftaran Duta Coding.
Pemerintah membutuhkan sebuah sistem yang dapat mempermudah User untuk mendaftar
ketika sudah berada ditempat. Sistem tersebut harus dapat memberikan setidaknya informasi
Nomer KTP atau NIK, Nama, Jenis Kelamin, Tempat Tinggal, Usia, dan Alasan kenapa
mengikuti acara tersebut. User hanya bisa menginputkan informasi tersebut. Admin dari
pegawai pemerintah dapat melihat data User, kemudian dapat melakukan edit dan delete.
Perhatikan bahwa user HANYA bisa menginputkan informasi.
Petunjuk: Ada dua form. Satu untuk user dan satu untuk admin. Keduanya terpisah.
Meskipun demikian hanya menggunakan 1 tabel database.
250
DAFTAR PUSTAKA
Liang, D.J., 2015, Introduction to JAVA Programming Comprehensive Version Tenth
Edition, Pearson.
https://netbeans.org/projects_tags/documentation
https://www.tutorialspoint.com/java/index.htm
https://www.tutorialspoint.com/design_pattern/
Pratama, M.R., 2007, Implementasi MVC Dengan DAO Pada Java Desktop Application, url:
https://ilmukomputer.org/wp-content/uploads/2012/06/Mudafiq-Implementasi-
MVC_DAO-Java-Desktop.pdf
251