Anda di halaman 1dari 99

Modul Praktikum Pemrograman Java

Jurusan Sistem Informasi

Penyusun:
• Cahyadi Lugito, S.Kom, MCP.
• Kiswono Prayogo, S.Kom.
• Agustinus Aruna

Universitas Pelita Harapan Surabaya

2011

1
Daftar Isi
Daftar Revisi...................................................................................5
Bab 1: Java Basic Concept.............................................................6
Tujuan........................................................................................6
Pengantar....................................................................................6
Java Technology.........................................................................6
Keyword.....................................................................................7
Comment....................................................................................7
Variable......................................................................................7
Data Type...................................................................................8
Operator.....................................................................................8
Percabangan...............................................................................9
Perulangan................................................................................10
Array........................................................................................10
Input dari Keyboard.................................................................12
Latihan.....................................................................................13
Bab 2: OOP with Java (Part 1)......................................................15
Tujuan......................................................................................15
OOP (Object Oriented Programming).....................................15
Object.......................................................................................15
Class.........................................................................................16
Method.....................................................................................18
Access Modifier.......................................................................18
Constructor...............................................................................18
Inheritance................................................................................19
Keyword “super” and “this”....................................................20
Latihan.....................................................................................21
Bab 3: OOP with Java (Part 2)......................................................23
Tujuan......................................................................................23
Encapsulation...........................................................................23
Polymorphism..........................................................................24
The ”static” keyword...............................................................26
Latihan.....................................................................................28
Bab 4: OOP with Java (Part 3)......................................................30
Tujuan......................................................................................30

2
Abstraction...............................................................................30
The “final” keyword................................................................30
Interface...................................................................................31
Package....................................................................................32
Java Inner Class.......................................................................33
Latihan.....................................................................................34
Bab 5: Generics.............................................................................37
Tujuan......................................................................................37
Generic Class...........................................................................37
Nested Generics.......................................................................39
Generic Method.......................................................................39
Generic Interface......................................................................40
Wildcard...................................................................................41
Bounded Wildcard....................................................................42
Generic Class Inheritance........................................................42
Latihan.....................................................................................43
Bab 6: Collections.........................................................................44
Tujuan......................................................................................44
Comparable..............................................................................44
Collection.................................................................................44
List...........................................................................................45
Iterator......................................................................................46
Bab 7: GUI....................................................................................47
Tujuan......................................................................................47
Java AWT.................................................................................47
Layout Management................................................................49
Java Swing...............................................................................54
Latihan.....................................................................................56
Bab 8: Event Handling..................................................................57
Tujuan......................................................................................57
Event Handler..........................................................................57
ActionListener dan ItemListener.............................................58
Standard AWT Event Listeners (Listener and Adapter)...........60
Using Event Handler in NetBeans IDE...................................61
Latihan.....................................................................................64
Bab 9: Graphics............................................................................67
Tujuan......................................................................................67

3
Canvas......................................................................................67
Graphics, Paint and Event Handler..........................................68
Using Graphics in NetBeans IDE............................................69
Latihan.....................................................................................72
Bab 10: Multithreading and Java Applet......................................74
Tujuan......................................................................................74
Thread and Multithreading......................................................74
Java Applet...............................................................................76
Latihan.....................................................................................78
Bab 11: File Stream......................................................................81
Tujuan......................................................................................81
InputStream and OutputStream................................................81
FileOutputStream and DataOutputStream...............................81
FileInputStream and DataInputStream....................................82
SequenceInputStream..............................................................83
Serializable and ObjectOutputStream......................................84
ObjectInputStream...................................................................85
File Dialog...............................................................................86
Latihan.....................................................................................87
Bab 12: JDBC...............................................................................89
Tujuan......................................................................................89
JDBC Concept.........................................................................89
Using ODBC............................................................................90
Connect and Select (Using ODBC - Access)...........................92
Insert, Update and Delete.........................................................94
Using MySQL JDBC Connector..............................................94
Connect and Select (Using MySQL).......................................96
Latihan.....................................................................................97
Daftar Referensi............................................................................99

4
Daftar Revisi
2010-08-10 Cahyadi Lugito / Draft 1
2010-08-11 Kiswono Prayogo / Formatting
2010-12-03 Kiswono Prayogo / Draft 2
2011-07-06 Kiswono Prayogo / Draft 3
2011-08-19 Agustinus Aruna / Draft 4
2012-02-17 Kiswono Prayogo / Generics dan Collections

5
Bab 1: Java Basic Concept

Tujuan
Praktikan mampu mengetahui dan menggunakan kontruksi-
konstruksi dasar dan elemen-lemen pembentuk bahasa Java 6.

Pengantar
Java adalah bahasa pemrograman seperti halnya dengan
bahasa pemrograman lain seperti Pascal, Basic, dan C. Java juga
dapat digunakan untuk membuat aplikasi web yang saat ini terus
berkembang. Java dikembangkan oleh Sun Microsystem pada
Agustus 1991 dengan nama semula Oak dan merupakan hasil
perpaduan dari berbagai bahasa pemrograman seperti C, C++,
Objective-C, Smalltalk dan CLISP.
Kelebihan dari Java adalah program java dapat berjalan pada
berbagai platform (multi platform). Kompilasi code Java
menggunakan JVM (Java Virtual Machine) yang nantinya JVM
tersebut akan merubah intermediate code menjadi bytecode
(machine code). Pada Java 2, interpreter Java terkemas dalam
sebuah paket yang disebut JRE (Java Runtime Environment).
Pada praktikum ini kita akan menggunakan IDE NetBeans
versi 7. Namun praktikan dapat menggunakan IDE yang lain seperti
Visual J++, Notepad++, Eclipse dan sebagainya.

Java Technology
Java sebagai salah satu bahasa pemrograman baru
menjanjikan banyak kemudahan bagi programer junior maupun
senior (selama menggunakan IDE handal layaknya NetBeans). Java
adalah bahasa pemrograman berorientasi objek yang
dikembangkan oleh Sun Microsystems. Bahasa ini dikembangkan
dengan model yang mirip dengan bahasa C++ dan Smalltalk, namun
dirancang agar lebih mudah dipakai dan platform independent,
yaitu dapat dijalankan di berbagai jenis sistem operasi dan

6
arsitektur komputer. Bahasa ini juga dirancang untuk pemrograman
di Internet sehingga dirancang agar aman dan portabel. Java telah
digunakan dalam banyak hal dan telah membuktikan
keberadaannya pada abad ke 21. Saat ini, Java digunakan pada
bermacam jenis aplikasi seperti aplikasi mobile phone (J2ME),
aplikasi embedded, aplikasi keuangan, desktop, simulasi pesawat,
pemrosesan citra, game, aplikasi perusahaan terdistribusi yang
disebut J2EE dan masih banyak lagi.

Keyword
Berikut adalah kata-kata kunci yang ada pada Java. Kata
kunci tidak dapat digunakan sebagai pengenal (identifier) ataupun
sebagai nilai variable dalam pemrograman Java.
abstract byte char continue
else finally goto Import
interface new private return
super synchronized throws void
boolean case class do
extends float if instanceof
long null protected short
switch this transient volatile
break catch const double
final for implements Int
native package public static
strictfp throw try While

Comment
Comment merupakan bagian dari source code yang tidak
dijalankan tetapi hanya digunakan untuk dokumentasi. Sama
seperti pada bahasa C, comment pada bahasa Java dimulai dengan
“//” diakhiri dengan enter atau dimulai dengan “/*” dan diakhiri
oleh “*/”.

Variable
Variabel digunakan untuk menampung nilai pada
pemrograman. Kita tidak dapat menyimpan tipe bernilai angka ke
variabel bertipe nilai huruf ataupun sebaliknya, sehingga tipe dan
nilai variable harus sesuai. Variabel merupakan container yang
digunakan untuk menyimpan suatu nilai pada sebuah program
dengan tipe tertentu. Untuk mendefinisikan variabel, sama seperti

7
pada bahasa pemrograman keluarga C lainnya, kita dapat
menuliskan tipe data dan identifier untuk menamai variabel
tersebut.

Data Type
Pada Java memiliki 8 jenis tipe data primitif, antara lain
• Tipe bilangan bulat : long, int, short, byte
• Tipe bilangan riil : float, double
• Tipe data karakter : char
• Tipe data boolean : boolean

Untuk range atau rentang nilai tipe data numerik sebagai


berikut:

Operator
• Operator Aritmatika

8
• Operator Logika

• Operator Relasi

Percabangan
• IF-ELSE
if (kondisi_1) {
// instruksi jika kondisi_1 true
if (kondisi_2) ;// instruksi jika kondisi_2 true
else ; // instruksi jika kondisi_2 false
} else {
// instruksi jika kondisi_1 false
if (kondisi_3) ; // instruksi jika kondisi_3 true
else if(kondisi_4) ;// instruksi jika kondisi_3 false dan
kondisi_4 true
}

• SWITCH-CASE
switch(ekspresi) {
case nilai_1:
// instruksi bila ekspresi bernilai nilai_1
break;
case nilai_2:
// instruksi bila ekspresi bernilai nilai_2
case nilai_3:
// instruksi bila ekspresi bernilai nilai_2 atau nilai_3
break;
default:
// instruksi bila ekspresi tidak selain nilai di atas
}

9
Perulangan
• FOR
for ( /* 1 */ ; /* 2 */ ; /* 3 */ ) {
/* 4 */
if( /* 5 */ ) continue;
if( /* 6 */ ) break;
/* 7 */
}
/* 8 */

Bagian 1 akan dijalankan 1x, lalu dilanjutkan bagian 2,


apabila bagian 2 bernilai salah maka akan dilanjutkan bagian 8,
apabila benar akan dilanjutkan pada semua bagian di dalam
kurung, bagian 3 dan kembali lagi pada bagian 2. Apabila bagian 5
bernilai true, maka program akan berlanjut ke bagian 3. Apabila
bagian bagian 6 bernilai true, maka looping akan berhenti dan
dilanjutkan ke bagian 8.

• WHILE
while (kondisi) {
// blok_pernyataan;
}

• DO-WHILE
do{
// pernyataan_pernyataan;
} while(kondisi);

Pertanyaan: jadi kapankah kita memakai for, while atau do-


while?

Array
• Array 1 Dimensi
int[] angka = new int[5];
int[] angka = {5, 3, 23, 99, 2};

• Array 2 Dimensi
tipeData[][] nama_variabel = new tipeData[jumlah_baris]
[jumlah_kolom];

• Array Dinamis
Untuk dinamis kita dapat menggunakan class Vector atau
class StringTokenizer yang terdapat pada class Java.util.
Penggunaan keduanya dapat kita lihat pada link

10
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html,
http://java.sun.com/javase/7/docs/api/java/util/StringTokenizer.ht
ml

Contoh potongan program, mengisi variabel StringTokenizer


dari string dan menampilkan isinya.
String kata = "Belajar Pemrograman Java";
StringTokenizer st = new StringTokenizer(kata);
while(st.hasMoreTokens()) {
// System.out.println(st.nextToken()+" ");
}

Contoh hasil outputnya:


Belajar
Pemrograman
Java

Pertanyaan: Jadi secara default StringTokenizer akan


memisahkan/memotong string berdasar karakter spasi. Apakah
pemisah dapat menggunakan karakter yang lain selain spasi?
Method apa saja ya yang sering digunakan dalam class
StringTokenizer?
Untuk lebih memahami penggunaan array 2 dimensi, berikut
kita akan mencoba membuat program yang menghasilkan nilai acak
dari 0-9 dan ditampung pada array dua dimensi, kemudian
ditampilkan pada layar.
public class LatArray {
public static void main(String[] args) {
int [][] angka = new int[5][5];
System.out.println("==Data Array 2 dimensi==");
for (int i=0; i < angka.length; i++) {
for(int j=0; j<angka[i].length; j++) {
angka[i][j]= (int) (Math.random() * 10);
}
}
for (int baris=0; baris<angka.length; baris++) {
for(int kolom=0; kolom< angka[baris].length; kolom++) {
System.out.print(angka[baris][kolom] + " ");
}
System.out.println();
}
}
}

Contoh hasil output:


==Data Array 2 dimensi==
3 8 8 5 8
3 3 1 3 0
4 6 6 2 9
8 7 2 7 6
6 3 9 8 0

11
Pertanyaan: contoh array di atas mirip dengan bentuk
matriks pada matematika, apa kalian masih ingat apa itu bentuk
matriks? Bisakah kalian membuat penjumlahan 2 matriks yang
terdiri dari angka acak seperti contoh di atas?

Input dari Keyboard


Pada setiap aplikasi rata-rata telah menggunakan inputan
dari keyboard, misalnya jika kita ingin membuat menu pilihan di
mana user dapat memilih pada menu mana dia akan masuk. Oleh
karena itu, kita harus menggunakan sebuah class yang khusus
bertugas menangani pembacaan inputan keyboard. Beberapa class
seperti DataInputStream, BufferedReader dan JOptionPane yang
berada pada class java.io dapat digunakan untuk menangkap
inputan keyboard.
Selain BufferedReader, dapat juga menggunakan class
Scanner yang berada pada class java.util. Berikut adalah contoh
penulisan program pada java secara lengkap dan cara menangkap
inputan keyboard:
import java.io.*;

public class Main {


public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in)) ;
int input=0;
System.out.print( "==Menu Program==\n"
+ "1. Aplikasi Kotak\n"
+ "2. Aplikasi Segitiga\n"
+ "3. Exit\n" );
System.out.print("Masukkan pilihan: ");
int pilihan = Integer.parseInt(br.readLine());
switch(pilihan) {
case 1: System.out.println("\n==Aplikasi Kotak==");
System.out.print("Masukkan angka: ");
input=Integer.parseInt(br.readLine());
cetak(1, input);
break;
case 2: System.out.println("\n==Aplikasi Segitiga==");
System.out.print("Masukkan angka: ");
input=Integer.parseInt(br.readLine());
cetak(2, input);
break;
case 3: System.out.println("\nKeluar Aplikasi... ");
System.exit(0);
break;
}
}

12
public static void cetak(int jenis, int inputan) {
System.out.println("");
if(jenis==1) {
for(int baris=0; baris<inputan; baris++) {
for(int kolom=0; kolom<inputan; kolom++) {
System.out.print("*");
}
System.out.println("*");
}
} else if(jenis==2) {
for(int baris=0; baris<inputan; baris++) {
for(int kolom=0; kolom<baris; kolom++) {
System.out.print("*");
}
System.out.println("*");
}
} else {
System.out.println("Unknown");
}
}
}

Contoh hasil output:


==Menu Program==
1. Aplikasi Kotak
2. Aplikasi Segitiga
3. Exit
Masukkan pilihan: 1

==Aplikasi Kotak==
Masukkan angka: 4

*****
*****
*****
*****

Latihan
1. Buat program kalkulator.java sederhana, tetapi
menggunakan menu. Contoh:
======================
Kalkulator Sederhana
======================
Menu:
1. Penambahan (+)
2. Pengurangan (-)
3. Perkalian (*)
4. Pembagian (/)
5. Modulus (%)
6. Exit

Masukkan pilihan anda : 1


Masukkan Bilangan1 : 5
Masukkan Bilangan2 : 4

13
Hasil Penjumlahan : 9
(Bila ditekan Enter akan kembali ke menu awal )

2. Buat program untuk mengurutkan data dari angka – angka


yang diinputkan user, angka yang boleh diinputkan 0 – 9,
program akan berhenti bila user menginputkan -1.
Kemudian akan muncul inputan untuk angka yang dicari.
Contoh:
Masukkan Angka: 3
Masukkan Angka: 4
Masukkan Angka: 2
Masukkan Angka: 2
Masukkan Angka: 5
Masukkan Angka: 6
Masukkan Angka: 8
Masukkan Angka: 7
Masukkan Angka: 9
Masukkan Angka: 4
Angka yang dicari: 5
Data setelah diurutkan: 2 2 3 4 4 5 6 7 8 9
Data terkecil : 2
Data terbesar : 9
Angka yang dicari 5, berada pada posisi 6

14
Bab 2: OOP with Java (Part 1)

Tujuan
Praktikan mampu mengetahui dan menggunakan fitur-fitur
object-oriented dasar bahasa Java.

OOP (Object Oriented Programming)


Pemrograman berorientasi object atau sering kita kenal
dengan OOP merupakan metode pemrograman yang masih popular
pada saat ini. Dalam OOP, object menjadi konsentrasi utama dalam
pemrograman dibandingkan dengan teknik pemrograman
sebelumnya yaitu pemrograman prosedural di mana fungsi-
fungsinya menjadi konsentrasi utama. Pada pemrograman dengan
prosedural seperti ini sering kita jumpai di mana satu file atau
form memiliki jumlah baris source code sangat banyak karena
semua dituliskan pada file atau form tersebut, selain itu sering
dijumpai redundansi atau penulisan fungsi yang sama pada form
yang lain.
Pada OOP memungkinkan kita untuk membuat beberapa
object yang terdiri dari data dan fungsi kemudian dipanggil pada
object yang lainnya. Dengan pendekatan ini, maka penulisan code
menjadi lebih ringkas dengan mengurangi duplikasi fungsi-
fungsinya. Fungsi cukup dituliskan satu kali kemudian dapat
digunakan pada object-object yang lain. Pengembangan program
ke depan juga akan menjadi lebih mudah. Pengembangan dapat
dilakukan pada object yang diperlukan saja tanpa banyak
mempengaruhi code pada object yang lain.

Object
Elemen dasar dari konsep OOP adalah object. Object
merupakan abstraksi sesuatu dalam dunia nyata, misalnya:
manusia, binatang, aktivitas, bussiness system atau workflow.
Sebuah object dalam OOP terdiri dari 2 elemen penyusun.

15
• Attribut (state, data member), merupakan ciri-ciri yang
melekat pada suatu object.

• Method (behaviour, member function) merupakan fungsi-


fungsi yang digunakan untuk memanipulasi nilai-nilai pada
attribut atau untuk melakukan hal-hal yang dapat dilakukan
pada suatu object.
Object sepeda motor:
Attribut:
• Merk
• Warna
• Ukuran sepeda
• Nomer kerangka
• Jumlah perseneling

Method:
• Nyalakan mesin
• Berjalan
• Belok
• Mengerem
• Menambah kecepatan

Object mahasiswa:
Attribut:
• NPM
• Nama mahasiswa
• Fakultas
• Jurusan
• Nilai ujian

Method:
• Terima materi
• Melihat nilai
• Melihat tunggakan spp
• serah tugas

Pertanyaan: contoh attribut dan method yang dimiliki object-


object yang lain apa ya? (misal object pesawat terbang, bioskop,
dan flow chart)

Class
Setelah kita memahami tentang object yang masih memiliki
bentuk yang abstrak, maka kita akan melanjutkan ke pembahasan
class. Dikatakan abstrak karena masih belum spesifik untuk
siapakah object tersebut ditujukan, misalnya object sepeda motor
ditujukan untuk jenis sepeda motor apa (honda beat, yamaha

16
yupiter, kawasaki ninja). Ketiga jenis motor tersebut akan menjadi
class untuk object sepeda motor.
Contoh berikutnya misalnya object mahasiswa yang ditujukan
untuk seorang mahasiswa. Sebagai contoh mahasiswa dengan NPM
08120100015, maka dapat dibentuk class mahasiswa dengan NPM
08120100015 yang merupakan spesifikasi atau implementasi dari
object mahasiswa.
Sebuah object yang sudah dibentuk atau digambarkan perlu
didefinisikan menjadi sebuah class. Class merupakan cetak biru
dari object. Berikut contoh sintaks dari class mahasiswa dan class
Main-nya. Class main digunakan untuk melakukan instanisasi class
Mahasiswa, sehingga attribut dan method pada class Mahasiswa
dapat digunakan.
package modul2a;
import java.io.*;
class Mahasiswa{
private String npm, nama, fakultas, jurusan;
private int nTugas, nUjian;
public void setNPM(String npm) {
this.npm = npm;
}
public String getNPM() {
return npm;
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
Mahasiswa mhs = new Mahasiswa();
System.out.print("Masukkan NPM: ");
mhs.setNPM(br.readLine());
System.out.println(mhs.getNPM());
}
}

Pada source code kita melihat baris berikut: adalah sintaks


untuk melakukan instanisasi class sebelum dapat digunakan (diisi
dan ditampilkan nilai-nilainya):
Mahasiswa mhs = new Mahasiswa();

Pertanyaan: pada java sering kita menjumpai class Main,


apakah class Main itu dan apa fungsinya ya?

17
Method
Secara umum method terdiri dari 2 jenis:

• Tidak mengembalikan nilai (prosedur), dengan melihat pada


contoh source code class Mahasiswa, maka method yang
tidak mengembalikan nilai adalah setNPM(String npm).
Memiliki ciri dengan tipe data void.

• Mengembalikan nilai (fungsi), contoh method yang


mengembalikan nilai pada class Mahasiswa adalah
getNPM().
Pertanyaan: method apa lagi ya yang dapat kita tambahkan
pada class Mahasiswa? cobalah untuk menambahkan /
menyempurnakan source code tersebut.

Access Modifier
Access modifier adalah pengaturan hak akses pada class
maupun method. Ada 4 jenis access modifier.

• Default (tanpa modifier): Dapat diakses dalam 1 package.


Diwarisi oleh subclass 1 package, dapat diakses oleh
method 1 package .

• Public: Dapat diakses dimanapun. Diwarisi oleh subclass-


nya, dapat diakses dimanapun.

• Protected: Tidak dapat diterapkan. Diwarisi oleh subclass-


nya, dapat diakses oleh method 1 package

• Private: Tidak dapat diterapkan. Tidak dapat diakses


dimanapun kecuali oleh method-method dalam class itu
sendiri.

Constructor
Constructor adalah method yang dapat digunakan untuk
memberikan nilai awal saat object diciptakan. Constructor
otomatis dipanggil/dijalankan pada saat di-instance pada sebuah

18
class.
Sifat constructor:

• Memiliki nama yang sama dengan nama class.

• Tidak memiliki return value/nilai balik.

• Merupakan method yang pertama kali dipanggil saat


class tersebut dibuat.
Berikut contoh sebuah 2 constructor dalam sebuah class:
class Mahasiswa{
private String npm, nama, fakultas, jurusan;
private int nTugas, nUjian;
public Mahasiswa() {
this.npm = "";
this.nama= "";
}
public Mahasiswa(String npm, String nama) {
this.npm = npm;
this.nama = nama;
}
@Override void finalize() { }
}

Pada contoh di atas terdapat 2 constructor, constructur yang


pertama merupakan constructor tanpa parameter, sedangkan
constructor yang kedua adalah constructor dengan 2 parameter
yaitu npm dan nama. Constructor yang kedua dinamakan
overloading constructor yang akan dibahas pada bab
polymorphism.
Pertanyaan: jika kita tidak membuat atau menuliskan sebuah
constructor, apakah java akan menciptakan secara otomatis
constructornya? Jika iya, bentuk constructor-nya seperti apa ya?

Inheritance
Inheritance merupakan proses pewarisan data dan method
dari suatu class yang telah ada kepada class yang baru. Class yang
merwariskan disebut dengan superclass/parent class/baseclass,
sedangkan yang mewarisi disebut subclass/child class/derived
class. Keuntungan dari inheritance adalah mengurangi penggunaan
code yang berulang (reuse), karena sub class dapat menggunakan
attribute dan method yang ada pada superclass-nya.

19
Untuk menerapkan inheritance pada java menggunakan
statement extends.
namaSubClass extends namaSuperClass {
// definisi class
}

Pertanyaan: apakah pada bahasa pemrograman Java


mendukung pewarisan berganda atau inheritance dengan lebih dari
1 kelas induk, seperti:
namaSubClass extends namaSuperClass1, namaSuperClass2 {
}

Keyword “super” and “this”


Keyword super digunakan oleh subclass untuk memanggil
constructor dan method dari superclass-nya. Contoh sintaks untuk
memanggil constructor dari superclass-nya:
super()
super(parameter)

Contoh sintaks untuk memanggil method dari superclass-nya:


super.namaMethod(parameter1, parameter2, ....)

Keyword this digunakan untuk membedakan antara variabel


pada level class dengan variabel pada method. Keyword this
menandakan bahwa varibel tersebut merupakan variabel pada
level class. Untuk memperjelas, kita lihat contoh berikut.
public class BangunDatar {
private String jenis;
private int panjang1;
private int panjang2;
public BangunDatar(String jenis, int panjang1, int panjang2) {
this.jenis = jenis;
this.panjang1 = panjang1;
this.panjang2 = panjang2;
}
}

Contoh constructor dan inheritance, pada class BangunDatar.


public class BangunDatar {
private String jenis;
private int panjang1;
private int panjang2;
public BangunDatar() {
this.panjang1=0;
this.panjang2=0;
}
public BangunDatar(String jenis, int panjang1, int panjang2) {
this.jenis = jenis;
this.panjang1 = panjang1;

20
this.panjang2 = panjang2;
}
}

class PersegiPanjang extends BangunDatar{


protected int panjang, lebar, luas;
protected String jenis;
public PersegiPanjang(String jenis, int panjang, int lebar) {
super(jenis, panjang, lebar);
this.jenis=jenis;
this.panjang=panjang;
this.lebar=lebar;
}
public int Luas() {
this.luas = panjang * lebar;
return luas;
}
}

class Main{
public static void main(String[] args) {
PersegiPanjang pp = new PersegiPanjang("Square", 10, 8);
System.out.println("Panjang : " + pp.panjang);
System.out.println("Lebar : " + pp.lebar);
System.out.println("Luas : " + pp.Luas());
}
}

Pada contoh terdapat 3 class. Class BangunDatar merupakan


superClass, class PersegiPanjang merupakan subclass, sedangkan
class Main digunakan untuk mencetak hasil dari subclass
PersegiPanjang .

Latihan
1. Buatlah sebuah program yang menerapkan constructor dan
inheritance yang kita pelajari pada modul ini, dengan
ketentuan sebagai berikut:
• super class dengan nama BangunRuang yang memiliki attribut
panjang1, panjang2, panjang3.
• sub class Kubus yang mempunyai attribut sisi, dan method
LuasPermukaan dan Volume.
• Rumus luas permukaan kubus = 6 x sisi x sisi
• Rumus volume kubus = sisi x sisi x sisi
• sub class balok yang mempunyai attribut panjang, lebar,
tinggi, dan method LuasPermukaan dan Volume.
• Rumus luas permukaan balok = 2 x ((panjang x lebar) +
(panjang x tinggi) + (lebar x tinggi))
• Rumus volume balok = panjang x lebar x tinggi
• sub class Tabung yang memiliki attribut jari-jari, tinggi,
dan method LuasPermukaan dan Volume. (π = 3,14)
• Rumus luas permukaan tabung = (2 x π x jari-jari x tinggi)
+ (2 x π x jari-jari x jari-jari)

21
• Rumus volume tabung = π x jari-jari x jari-jari x tinggi
• class Main yang berisi menu yang memanggil fungsi
LuasPermukaan dan Volume dari subclass

contoh:
======================
Perhitungan Bangun Ruang
======================
Menu:
1. Kubus
2. Balok
3. Tabung
4. Exit
Masukkan pilihan anda : 2

Masukkan panjang (cm) : 10


Masukkan lebar (cm) : 5
Masukkan lebar (cm) : 3
Luas Permukaan (cm2) : 190
Volume (cm3) : 150
(Bila ditekan Enter akan kembali ke menu awal )

2. Sebuah rental DVD memiliki desain class untuk data DVD Film
dan DVD Musik sebagai berikut:
Class DVDFilm dengan atribut:
title : judul film
artist : nama-nama pemain di dilm tersebut
director : nama sutradara film tersebut
publisher : yang memproduksi film tersebut
category : SU = Semua Umur, D = Dewasa, R = Remaja, A = Anak
stock : jumlah stok vcd film tersebut

Class DVDMusik dengan atribut:


title : judul album musik
singer : nama penyanyi di album tersebut
producer : nama produser album tersebut
publisher : studio rekaman yang memproduksi cd musik tersebut
top hits : lagu yang diandalkan pada album tersebut
category : C = Classic, J = Jazz, P = Pop, R = Rock, O =
Other
stock : jumlah stok cd musik tersebut

Dari data kedua class diatas, desainlah class-class tersebut


dengan menggunakan konsep constructor dan inheritance. Cari
hubungan antar kedua class tersebut lalu tentukan superclass-nya
dan subclass-nya. Setelah itu implementasikan class-class yang
telah anda desain dan buatlah program sederhana yang memiliki
fasilitas entri data DVDFilm, entri data DVDMusik serta lihat daftar
DVD Film dan DVD Musik yang telah dientrikan.

22
Bab 3: OOP with Java (Part 2)

Tujuan
Praktikan Mampu mengetahui dan mempergunakan konsep
object-oriented lanjutan bahasa Java.

Encapsulation
Inti dari konsep encapsulation adalah menyembunyikan
kompleksitas suatu class dari class yang lain yang mengaksesnya.
Dengan menggunakan public, protected, private dan package
dapat digunakan untuk memilih data mana saja yang ditampilkan
dan disembunyikan.
import java.io.*;
class Manusia {
private String nama, jns_kel;
private double tinggi, berat;
public Manusia(String nama, String jns_kel, double tinggi,
double berat) {
this.nama=nama;
this.jns_kel=jns_kel;
this.tinggi=tinggi;
this.berat=berat;
}
}
class Mahasiswa extends Manusia {
private String npm, asalSMU, fakultas, jurusan;
private int nTugas, nUjian;
public Mahasiswa(String nama, String jns_kel, double tinggi,
double berat, String npm, String asalSMU,
String fakultas, String jurusan,
int nTugas, int nUjian) {
super(nama, jns_kel, tinggi, berat);
}
}

Bila kita perhatikan pada atribut class Manusia yaitu nama,


jenis kelamin, tinggi dan berat memiliki access modifier private,
sehingga attribut tersebut tidak dapat diakses atau digunakan pada
class lain kecuali class itu sendiri yaitu class Manusia.
Encapsulation sangat berkaitan dengan access modifier, dapat
kalian lihat kembali modul pada sebelumnya.
Pertanyaan: apa perbedaan antara access modifier public,

23
protected, private dan package?

Polymorphism
Polymorphism berarti sebuah object dapat memiliki berbagai
bentuk, yaitu dengan memiliki nama yang sama, tetapi behaviour
yang berbeda. Sebuah object dapat memiliki berbagai bentuk baik
dari class itu sendiri ataupun dari superclass-nya. Ada 2 macam
bentuk polymorphism, yaitu:

• Overloading: penggunaan satu nama untuk beberapa


method yang berbeda dalam suatu class. Nama method
yang sama dibedakan dari jumlah parameter dan tipe data
parameternya.

• Overriding: mendeklarasikan sebuah method dengan nama


dan parameter yang sama dari superclass-nya, kemudian
dimodifikasi ulang (menumpuk/mendefinisi ulang).
Pada polymorphism, dikenal juga dynamic binding atau
ikatan dinamis yang umumnya digunakan pada variabel bertipe
class. Jika kita mempunyai variabel bertipe superclass, variabel ini
dapat diisi dengan object superclass ataupun subclass-nya tanpa
melakukan perubahan tipe. Untuk lebih jelas mengenai dynamic
binding kita akan melihat contoh berikut
public class Manusia {
private String nama;
public void setNama(String nama) {
this.nama=nama;
}
public String getNama() {
return "Nama manusia: " + nama;
}
}
class Mahasiswa extends Manusia{
private String namaMhs;
public void setNama(String nama) {
this.namaMhs = nama;
}
public String getNama() {
return "Nama mahasiswa: " + namaMhs;
}
}

class Karyawan extends Manusia{


private String namaKar;
public void setNama(String nama) {

24
this.namaKar = nama;
}
public String getNama() {
return "Nama Karyawan : " + namaKar;
}
}
class Main{
public static void main(String[] args) {
Mahasiswa mhs = new Mahasiswa();
Karyawan kar = new Karyawan();
Manusia mns;
mns = mhs;
mns.setNama("Jesicca Stephanie");
System.out.println(mns.getNama());
mns = kar;
mns.setNama("Handy Gunawan");
System.out.println(mns.getNama());
}
}

Pada contoh class Manusia merupakan superclass, sedangkan


class Mahasiswa dan class Karyawan merupakan subclass dari class
Manusia. Ketiga class tersebut memiliki method setNama() dan
getNama(). Kesamaan nama dan tipe data method pada subclass
yang mengacu superclass dinamakan overriding method.
Kemudian variabel object Manusia (mns) menunjuk ke object
yang dirujuk oleh Mahasiswa (mhs), pada baris
mns = mhs;

variabel object Manusia (mns) ke object yang dirujuk oleh


object Karyawan (kar), pada baris
mns = kar;

Berikut contoh penggunaan class dengan menerapkan


constructor, inheritance, access modifier (encapsulation) dan
polymorphism. Cobalah code di bawah ini sebagai latihan dan
compile-running untuk melihat hasilnya.
import java.io.*;
class Manusia{
private String nama, jns_kel;
private double tinggi, berat;
public Manusia() {
this.nama="";
this.jns_kel="";
this.tinggi=0;
this.berat=0;
}
public Manusia(String nama, String jns_kel, double tinggi,
double berat) {
this.nama=nama;
this.jns_kel=jns_kel;

25
this.tinggi=tinggi;
this.berat=berat;
}
public String cetak() {
return("Nama: " + nama + "\nJenis Kelamin: " + jns_kel +
"\nTinggi: " + tinggi + "\nBerat: " + berat);
}
}

class Mahasiswa extends Manusia {


private String npm, asalSMU, fakultas, jurusan;
public Mahasiswa(String nama, String jns_kel, double tinggi,
double berat, String npm, String asalSMU,
String fakultas, String jurusan) {
super(nama, jns_kel, tinggi, berat);
this.npm = npm;
this.asalSMU = asalSMU;
this.fakultas = fakultas;
this.jurusan = jurusan;
}
public String cetak() {
return(super.cetak()+"\n\nNPM: " + npm + "\nAsal SMU: " +
asalSMU + "\nFakultas: " + fakultas + "\nJurusan: " + jurusan +
"\nNilai Tugas: " + nTugas + "\nNilai Ujian: " + nUjian);
}
}
public class Main {
public static void main(String[] args) throws IOException {
Mahasiswa mhs = new Mahasiswa("Andi", "L", 170, 60,
"08120080035", "SMAN 1 SDA" , "Ilmu Komputer" , "Sistem
Informasi", 80, 90);
System.out.println(mhs.cetak());
}
}

The ”static” keyword


Pada Java terdapat keyword static yang digunakan pada
variabel ataupun pada method. Terdapat perbedaan fungsi antara
static dengan instance yang selama ini sering kita gunakan.

• Instance Variable vs Class Variable


Variabel dengan menggunakan keyword static dinamakan
juga dengan variabel static atau variabel class. Variabel class dapat
diakases langsung dalam class tanpa perlu melakukan instanisasi
class (instance class) seperti pada contoh sebelumnya. Nilai dari
variabel static akan disalin termasuk pada saat instanisasi. Berikut
contoh penggunaan variabel class:
class Point{
static int y=0;
}

26
public class TesVarStatic {
public static void main(String[] args) {
System.out.println(Point.y);
//memanggil variabel class tanpa instance class
Point.y=10;
//men-set ulang variabel class
Point p = new Point();
//membuat instance class
System.out.println(p.y + 5);
//memanggil ulang variabel y
}
}

Bila kita menjalankan code di atas, maka kita akan


mendapati bahwa variabel class dapat diakses tanpa melakukan
instance class terlebih dahulu. Selain itu pada code
System.out.println(p.y + 5);

akan menghasilkan nilai 15, atau 10 + 5. Ini menunjukkan


bahwa nilai variabel class sebelum dilakukan instance akan disalin
dan diteruskan termasuk pada saat instance class.
Sedangkan untuk variabel yang tidak menggunakan keyword
static dinamakan variabel instance. Sebaliknya dengan variabel
class, maka variabel instance harus melakukan instanisasi class
terlebih dahulu untuk dapat memanggil variabel instance. Nilai
dari variabel instance dapat berbeda-beda pada setiap instance
class-nya. Untuk memahami perbedaan antara variabel class dan
variabel instance, kita lihat contoh berikut:
class Point{
int x =0;
static int y=0;
void setX(int nilai) {
this.x = nilai;
}
void setY(int nilai) {
this.y = nilai;
}
int getX() {
return x;
}
int getY() {
return y;
}
}
public class TestStatic {
public static void main(String[] args) {
Point x1 = new Point(); //instance class (object) 1
Point x2 = new Point(); //instance class (object) 2
x1.setX(10); //set object1 (x=10)
x2.setX(20); //set object2 (x=20)
x2.setY(30); //set object2 (x=30)

27
System.out.println(x1.getX()); //cetak x pada object1 = 10
System.out.println(x2.getX()); //cetak x pada object2 = 20
System.out.println(x2.getY()); //cetak y pada object2 = 30
System.out.println(Point.y);
//cetak varriabel class y tanpa instance = 30
Point.y = 7; //set ulang variabel class (y=7)
System.out.println(Point.y); //cetak y yang diset ulang = 7
x1.setY(Point.y + 50); //set y pada object1 (y= 7 + 50)
System.out.println(x1.getY()); //cetak y pada object2 = 57
}
}

Pertanyaan: Bisakah variabel instance pada suatu class


dipanggil pada method static (public static void main..) setelah
dilakukan instance class terlebih dahulu?

• Instance Method vs Class Method


Sama halnya dengan variabel pada method juga mengenal
keyword static. Method dengan yang dideklarasikan dengan static
dinamakan method static atau method class. Method class dapat
dipanggil tanpa membuat object atau instance class terlebih
dahulu. Demikian sebaliknya method tanpa keyword static
dinamakan method instance. Berikut contoh mendeklarasikan class
method:
class BangunRuang{
static int LuasPersegi(int sisi) {
return sisi * sisi;
}
}
public class TestMethStatic {
public static void main(String[] args) {
//memanggil class method LuasPersegi tanpa instance class
System.out.println(BangunRuang.LuasPersegi(10));
}
}

Pertanyaan: selain pada variabel dan method, apakah


keyword static juga dapat diterapkan pada class? Cobalah untuk
mengetahui jawabannya

Latihan
PT. Biting Bersatu memiliki 50 orang pegawai, pegawainya
tersebut terbagi menjadi 2 status kepegawaian, yaitu sebagian
pegawai tetap dan sebagian yang lain (sisanya) adalah pegawai
kontrak. Secara umum perbedaan antara keduanya adalah pegawai
tetap selain mendapatkan gaji juga mendapatkan tunjangan yang

28
besarnya 500 ribu, sedangkan pegawai kontrak hanya mendapatkan
gaji saja. Dari kasus diatas, dapat digambarkan class-class pegawai
sebagai berikut:
Class PegawaiKontrak, dengan atribut:
NIK : no pegawai kontrak (diinputkan)
Nama : nama pegawai (diinputkan)
MasaKontrak : lama kontrak pegawai (diinputkan)
Kehadiran : jumlah hari masuk dalam 1 bulan (diinputkan)
UangMakan : besarnya 8 ribu dikali jumlah kehadiran (tidak
diinputkan)
Gaji : besarnya gaji pokok yang diterima tiap bulan
(diinputkan)

Class PegawaiTetap, dengan atribut:


NIK : no pegawai tetap (diinputkan)
Nama : nama pegawai (diinputkan)
Kehadiran : jumlah hari masuk dalam 1 bulan (diinputkan)
Tunjangan : besarnya 500 ribu (tidak diinputkan)
UangMakan : besarnya 8 ribu dikali jumlah kehadiran (tidak
diinputkan)
Gaji : besarnya gaji pokok yang diterima tiap bulan
(diinputkan)

Method-method yang harus ada:


hitungGaji(): untuk menghitung gaji bersih pegawai, dimana untuk
pegawai kontrak = Uang Makan + Gaji,
pegawai tetap = Tunjangan + Uang Makan + Gaji
lihatData(): untuk menampilkan data-data pegawai secara lengkap
beserta total gaji yang diterima (gaji bersih)

Dari kedua class diatas, analisa dan desainlah superclass yang


tepat untuk kasus tersebut. Setelah itu buatlah class utama/main
class yaitu class PegawaiBitingBersatu (yang menggunakan class-
class diatas) yang memiliki menu utama sebagai berikut:
PT. BITING BERSATU
=====================
MENU UTAMA
=====================
1. Input Data Pegawai
2. Lihat Data Pegawai
3. Keluar
Pilihan Anda [1/2/3] ? ...

Tentukan pula modifier yang tepat untuk semua class diatas.


Kalau mau, anda dapat menggunakan teknik polymorphism dalam
menyelesaikan permasalahan ini.

29
Bab 4: OOP with Java (Part 3)

Tujuan
Praktikan mampu mengetahui dan mempergunakan fitur
object-oriented sesuai tujuan pemrograman object-oriented
dengan menggunakan bahasa Java.

Abstraction
Abstract class digunakan sebagai model atau acuan
(superclass) bagi penurunan untuk sub-sub class-nya. Pada
umumnya abstract class hanya berisi variable-variabel umum dan
abstract method tanpa body, kemudian baru pada class turunannya
mendefinisikan secara detil body methodnya.
Untuk membuat abstract class dan abstract method
menggunakan keyword abstract. Berikut contoh untuk
mendefinisikan abstract class, abstract method, non abstract
method.
public abstract class Manusia{
protected String nama, jns_kel;
public Manusia() { }
public abstract String setNama(String nama);
public abstract void getNama();
public String cetak() {
return this.nama + "/n" + this.jns_kel;
}
}

The “final” keyword


Pada Java terdapat keyword “final” yang digunakan untuk
mencegah suatu class diturunkan atau suatu method di-override.
Keyword final dituliskan pada class atau method setelah access
modifier. Sebagai contoh perhatikan penggunaan keyword final
berikut:
public final class TestFinal {
private String username, password;
public TestFinal() {
this.username = "labkom";
this.password = "LABKOM-123";

30
}
public final boolean isValid(String n, String p) {
if(n.equals(username) && p.equals(password)) {
return true;
}
else return false;
}
}

Sebagai catatan, class atau method yang diberi attribut atau


keyword final tidak boleh berupa abstract class atau abstract
method. Karena abstract class harus diturunkan, sedangkan
abstract method harus di-override pada subclass.

Interface
Interface berisi sekumpulan konstanta dan atau deklarasi
method tanpa menyertakan body methodnya yang dapat digunakan
pada sejumlah class. Sekilas Interface mirip dengan Abstract Class
karena sama-sama menentukan bentuk method untuk subclass-nya.
Untuk mengetahui perbedaan keduanya, kita amati table
perbedaan Interface dengan Abstract Class berikut:

• Abstract Class
◦ Dapat berisi abstract method dan non abstract method.
◦ Dapat berisi variabel instant dan konstanta .
◦ Menggunakan extends .
◦ Pada 1 class pewarisan hanya dapat mewarisi 1 abstract
class.
◦ Abstract method harus di-override pada class turunan,
sedagkan yang bukan abstract method tidak harus dituliskan
pada class turunannya.

• Interface
◦ Hanya berisi abstract method saja.
◦ Hanya dapat berisi konstanta saja .
◦ Menggunakan implements .
◦ Pada 1 class pewarisan dapat mewarisi lebih dari 1
interface .
◦ Semua method harus diturunkan pada class implement-nya

Berikut contoh deklarasi interface:


public interface Manusia {
public String setNama(String nama);
public void getNama();
}

Pertanyaan: Jadi menurut kalian apakah fungsi atau manfaat


dari membuat abstract dan interface? Apakah interface dan class

31
harus terletak pada file yang sama?

Package
Sejumlah class yang terkait pada Java biasa dikelompokkan
dalam sebuah unit yang disebut package (paket). Pada NetBeans
kita dapat mendeklarasikan JavaPackage dalam 1 project, atau
dengan kata lain 1 project dapat memiliki 2 atau lebih package.
Untuk membuat atau mendeklarasikan package dengan
menggunakan keyword package. Berikut contoh membuat class
Mahasiswa08 dan class Mahasiswa09 dalam package modul2c.
package modul2c;
public class Mahasiswa08 {
public void getData() {
System.out.println("Mahasiswa SI 2008");
}
}
package modul2c;
public class Mahasiswa09 {
public void getData() {
System.out.println("Mahasiswa SI 2009");
}
}

Untuk melakukan tes terhadap package yang sudah kita buat,


buatlah sebuah main class yang terletak di luar package modul2c
seperti pada gambar berikut. Untuk memanggil class dalam
package, gunakanlah keyword import. Jika tidak, maka class tidak
bisa di-instance-kan karena tidak dikenali.

32
Java Inner Class
Pada pemrograman java tingkat mahir, banyak programmer
yang menggunakan metode ini untuk melakukan develop di dalam
program yang dibuat. Java inner class atau Nested Class (class
bersarang) memberikan relasi antar class yang ada di dalamnya
(outerClass dengan innerClass). Berbeda dengan konsep yang
selama ini kita pakai di mana class yang satu dengan yang lain
tidak terletak bersarang (perhatikan contoh-contoh latihan
sebelumnya). Java inner class ini secara umum dapat disebut juga
class di dalam class.
Sintaks penggunaan java inner class adalah sebagai berikut:
[access_modifiers] class OuterClassName {
// body code...
[access_modifier] class InnerClassName {
// body code...
}
}

Inner class memiliki keuntungan yang membuat dirinya


menjadi class yang lebih luas dan berguna. Object dari sebuah
inner class memiliki referensi secara implisit terhadap outer class
yang meng-instance inner class tersebut. Akses control menjadi
kelebihan utama dari penggunaan java inner class ini. Untuk lebih

33
jelas hubungan akses antara outer class dengan inner classnya kita
lihat contoh berikut:
public class ObjectOuter {
private void getNameOuter() {
//method pada outer class
}
class InnerLv1{
private void getNameLv1() {
//method pada inner class level 1
}
class InnerLv2{
void callMethod() {
getNameOuter(); //memanggil method outer classnya
getNameLv1();
}
}
}
}
class TestNestedClass{
public static void main(String[] args) {
ObjectOuter obj = new ObjectOuter();
ObjectOuter.InnerLv1 inner1 = obj.new InnerLv1();
ObjectOuter.InnerLv1.InnerLv2 inner2 = inner1.new InnerLv2();
inner2.callMethod();
}
}

Pada contoh kita membuat java class ObjectOuter.java, pada


class InnerLv2 kita dapat melihat method di dalamnya dapat
memanggil method pada outer class-nya. Perhatikan pada class
main, bagaimana outer class dapat meng-instance inner class-nya.

Latihan
1. Buatlah sebuah abstract class Login dimana pada class
tersebut terdapat 2 method, yaitu validasi() dan cekData().
Buatlah sebuah class yang mengimplementasikan interface
tersebut yaitu class DataLogin dengan penjelasan sebagai
berikut:
• Method validasi(): bertipe boolean, digunakan untuk
memastikan bahwa username dan password tidak boleh
kosong (wajib diisi), tentukan sendiri parameternya.
• Method cekData(): bertipe boolean, digunakan untuk
mengecek username dan password apakah cocok dengan
yang terdapat di atribut class DataLogin.
• (private String username1="mhs", private String
pass1="Mahasiswa@#$", private String
username2="mahasiswa", private String
pass2="praktikum@#$"), tentukan sendiri parameternya.

34
Buatlah class TestLogin yang menggunakan class DataLogin
dengan aturan sebagai berikut, saat program dijalankan,
tampilkan menu utama sebagaiberikut:
MENU UTAMA
--------------------
Menu Pilihan:
A. LOGIN
B. EXIT
--------------------
Pilihan Anda:

User dapat memilih pilihan dengan huruf besar maupun huruf


kecil. Jika LOGIN dipilih, maka user diminta menginputkan nama
user dan password. Jika salah, maka tampilkan pesan bahwa user
salah menginputkan username atau password atau keduanya dan
program kembali ke menu utama. Jika benar, maka tampilkan
menu pilihan sebagai berikut:
Selamat datang XXXXX
====================
MENU PILIHAN
--------------------
1. Data Pegawai
2. LOG OFF
Pemrograman JAVA
--------------------
Pilihan Anda:

XXXXX = nama user yang sedang login.

Jika user memilih pilihan 1, maka jalankan class utama PT


Biting Bersatu (lihat kembali latihan pada Modul 3) dengan
memanggil fungsi main-nya. Setelah main class PT Biting Bersatu
dijalankan, maka tampilkan lagi menu pilihan di atas (Data
Pegawai & Log off).
Jika user memilih pilihan 2, maka tampilan kembali ke menu
utama (tidak keluar dari program).
Program akan selesai jika user memilih EXIT.
2. Dengan soal nomor 1, gunakan konsep interface, yaitu
interface Login. Untuk melakukan testing program, buatlah
sebuah class main dengan menggunakan konsep package.
3. Buatlah sebuah outer class Email yang memiliki inner class
level 1 dengan nama class BodyContent dan class Recipient.
Variabel dan method pada tiap class dapat kalian tentukan

35
sendiri. Setelah itu buatlah class main yang menginstance-
kan outer class dan inner class tersebut, buatlah contoh
implementasi sesuai kreatif kalian.

36
Bab 5: Generics

Tujuan
Praktikan mampu membuat dan mempergunakan Generics
pada Java.

Generic Class
Generics digunakan sebagai tipe data yang dapat
didefinisikan ketika sebuah class akan dipakai. Konsep yang paling
mendekati dengan generics java adalah typename/class template
pada C++. Dimana pada C++, sebuah template yang beripe
typename/class dapat digantikan dengan tipe data lain,
bergantung pada inisialisasi class-nya. Hal ini juga berlaku pada
java, hanya saja syntax yang digunakan pada java untuk
mendefinisikan generics adalah “<NAMA_TEMPLATE, … >” setelah
nama class. Berikut ini contoh pembuata template:
class T<X> {
private X d;
public T(X v) { d = v; }
public X getData() { return d; }
public print() {
System.out.println( “ variabel d bertipe : “ +
d.getClass().getName() + “ bernilai “ + d );
}

Pada contoh diatas, kita mendefinisikan sebuah class T dan


generics X, dimana X nantinya dapat digantikan oleh tipe data
apapun bergantung pada proses inisialisasinya. Berikut ini contoh
isi prosedur main:
T<Integer> ii = new T<Integer>(100);
ii.print();
Integer gi = ii.getData();

T<String> ist = new T<String>(“aaa”);


ist.print();
String gs = ist.getData();

Pada contoh di atas, ii merupakan class T yang generics X-nya


didefinisikan sebagai Integer, dan variabel ist merupakan class T
yang generics X-nya didefinisikan sebagai string. Pemberian
generics boleh lebih dari 1 misal X, Y, Z. Contoh class yang

37
menggunakan lebih dari 1 parameter adalah
HashMap<KeyType,ValueType>, dimana class tersebut berguna
sebagai array asosiatif.
Pemberian nama generics menurut standar sebaiknya adalah
1 huruf kapital. Perlu diingat bahwa generics boleh digantikan
dengan Object apapun, dan tidak dapat digantikan dengan tipe-
tipe primitif seperti int (Integer adalah class, int adalah
primitives).
Dengan adanya generics, kita tidak perlu takut akan runtime
error. Hal ini dapat kita coba ketika kita menggunakan ArrayList
yang mendayagunakan generics maupun tidak:
ArrayList x = new ArrayList(); // sama seperti ArrayList<Object>
x.add(1);
x.add(“test”);
Integer x1 = (Integer) x.get(0);
String x2 = (String) x.get(1);
Integer x2b = (Integer) x.get(1); // runtime error

ArrayList<Integer> y = new ArrayList<Integer>();


y.add(1);
y.add(2);
y.add(“test”); // compile error
Integer y1 = y.get(0);
Integer y2 = y.get(1);

Dapat dilihat pada contoh di atas keuntungan dan kerugian


penggunaan generics, yaitu apabila kita tidak mendefinisikan tipe
data yang dipakai, maka kita dapat memasukkan tipe data apapun,
tetapi dalam mengambil nilainya, kita harus melakukan try-catch
agar tidak terjadi error ketika runtime. Sedangkan apabila kita
mendefinisikan tipe data pada variabel generics, maka hanya tipe
data tersebut dan turunannya dapat dimasukkan ke dalamnya. Jadi
dengan kata lain, apabila kita tidak mendefinisikan tipe data
pengganti generics, maka akan otomatis digantikan dengan tipe
data Object, sehingga tiap class dapat masuk di dalamnya, karena
class apapun adalah turunan dari Object.
Berikut ini contoh pengisian generics dengan turunannya:

public class T1 {
public void test() { System.out.println("saya bertipe T1"); }
}
public class T2 extends T1 {
@Override public void test() {
System.out.println("saya adalah tipe T2");

38
}
}
void tester() {
ArrayList<T1> x = new ArrayList<T1>();
T1 t1 = new T1();
T2 t2 = new T2();
x.add(t1);
x.add(t2);
x.get(0).test();
x.get(1).test();
}

ArrayList pada contoh diatas merupakan class yang memiliki


1 parameter generics, dengan mengisinya dengan T1, maka T2
sebagai turunan T1 juga dapat masuk ke dalamnya. Apabila kita
memasukkan sebuah interface sebagai pengganti generics, maka
turunan/implementasi dari inteface tersebut juga dapat
dimasukkan.

Nested Generics
Nested Generics merupakan generics yang digantikan dengan
class yang memiliki parameter generics. Hal ini diperbolehkan di
Java seperti halnya di C++. Berikut ini adalah contoh ArrayList yang
menyimpan ArrayList of String:
ArrayList<ArrayList<String>> x = new ArrayList<ArrayList<String>>()
// setara dengan vector<vector<string> > di c++

ArrayList<String> y = new ArrayList<String>();


y.add(“test”);
y.add(“123”);

x.add(y);

x.add( new ArrayList<String>() );


x.get(1).add(“ahahah”);

Pada contoh di atas, dapat diibaratkan membuat array


dinamis 2 dimensi yang mampu menyimpan string. Untuk mengisi
ArrayList yang luar, kita harus membuat terlebih dahulu ArrayList
yang mampu menyimpan String. Nesting generics boleh dilakukan
berkali-kali.

Generic Method
Generic Method merupakan metode yang memiliki parameter
generics, berbeda dengan generic class, parameter tersebut harus

39
dituliskan sebelum nama fungsi. Berikut ini contoh fungsi static
yang mempergunakan generic:
static <T, V extends T> boolean existsIn(T x, V[] y) {
for (int z = 0; z < y.length; ++z)
if (x.equals(y[z])) return true;
return false;
}

Pada contoh di atas, fungsi tersebut mencari tipe T dari array


V, dimana V merupakan turunan dari T. Hal ini dinamakan bounded
type. Contoh pemanggilan fungsi di atas adalah:
Integer nums[] = { 1, 2, 3, 4, 5 };
if (!existsIn(20, nums))
System.out.println("20 tak ada~ T^T");

if (existsIn(4, nums))
System.out.println("4 ada~ ^^");

Constructor juga dapat memiliki generics, sebagai contoh,


apabila kita ingin hanya angka yang menjadi parameter sebuah
constructor, kita dapat menuliskan:
class HarusAngka {
double z;
public <T extends Number> HarusAngka(T x) {
z = x;
}
}

Pada contoh di atas, kita tidak perlu mendefinisikan tipe


data pada class, karena generics terdapat pada constructornya.
Contoh lain, apabila kita mempergunakan array pada fungsi static:
public static<X> void printArray(X[] arr) {
for( X elem : arr ) System.out.println( “%s ”, elem );
System.out.println();
}

Generic Interface
Selain pada class dan method, generic juga dapat diberikan
pada interface. Sebagai contoh, apabila kita ingin membuat
interface dengan bounded type Comparable (yaitu object harus
dapat di-compare) kita dapat menuliskan:
interface IminMax< T extends Comparable<T>> {
T min();
T max();
}

Pada interface di atas, kita dapat mengimplementasikan


class untuk mencari object terkecil dan maksimumnya:

40
class MinMaxFInder<T extends Comparable<T>> implements IminMax<T> {
T[] arr;
public MinMaxFinder(T[] a) { arr = a }
public T min() {
T r = arr[0];
for(int z=1;z<arr.length;++z)
if( r.compareTo(arr[z]) > 0 ) r = arr[z];
return r;
}
public T max() {
T r = arr[0];
for(int z=1;z<arr.length;++z)
if( r.compareTo(arr[z]) < 0 ) r = arr[z];
return r;
}
}

Class di atas mengimplementasikan interface IMinMax yang


telah dibuat sebelumnya, berikut ini contoh pemakaian class
tersebut:
Integer i[] = { 3, 6, 2, 8, 6 };
Character c[] = { 'A', 'r', 'V', 'w' };
MinMaxFinder<Integer> mmi = new MinMaxFinder<Integer>(i);
MinMaxFinder<Character> mmc = new MinMaxFinder<Character>(c);
Integer mini = mmi.min();
Integer maxi = mmi.max();
Character minc = mmc.min();
Character maxc = mmc.max();

Wildcard
Wildcard digunakan sebagai pengganti generics apapun.
Wildcard umumnya digunakan apabila kita tidak mempedulikan
tipe data dari generics (tidak perlu tahu), ataupun apabila kita
peduli tipe datanya tetapi kita tidak butuh untuk mendefinisikan
variabel dengan tipe tersebut. Berikut ini contoh penggunaan
wildcard pada fungsi:
void printCollection( Collection<?> c ) {
for( Object o : c ) System.out.println( o );
}

Pada contoh di atas, Collection<?> dapat dibaca sebagai


“koleksi dari sesuatu yang tidak kita ketahui”, dimana Collection
merupakan parent dari ArrayList, HashMap dan TreeSet. Sehingga
kita dapat mempassing ArrayList<Apapun> ke dalam fungsi
tersebut. Mengapa tidak menggunakan Collection<Object>? Kanre
Collection<Object> bukanlah tipe yang tepat sebagai parameter
untuk turunan collection yang parameternya bukan Object, seperti
ArrayList<String>. Jadi dapat disimpulkan, apabila parameter

41
fungsi berupa Parent1<X> maka Turunan1<X> dapat dipassing,
sedangkan apabila parameter fungsi berupa Parent1<?> maka
Turunan1<Apapun> dapat dipassing ke dalam fungsi tersebut.
Contoh:
void printCollection( Collection<Object> c ) {}
// ArrayList<Object> dipassing sebagai parameter ke dalamnya
// tetapi ArrayList<String> tidak dapat dipassing
// agar dapat, fungsi di atas harus diubah menjadi
void printCollection( Collection<String> c ) {}
// yang mampu menerima turunan collection apapun
// yang genericnya string, atau
void printCollection( Collection<?> c ) {}
// yang mampu menerima turunan collection apapun, atau
void printCollection( ArrayList<String> c ) {}
// yang mampu menerima tepat arraylist
// dengan generic string, tetapi bukan
void printCollection( ArrayList<Object> c ) {} // compile error

Bounded Wildcard
Bounded wildcard merupakan wildcard yang dibatasi hanya
dari class turunan (extends) atau parent (super) tertentu, sebagai
contoh, fungsi ini hanya menerima parameter generic turunan dari
class number:
public static double getAverage(ArrayList<? extends Number> al) {
double total = 0;
for( Number n : al ) total += n;
return total / al.size();
}

Keyword extends di atas dapat digantikan dengan super, yang


memiliki arti berbeda, yaitu hanya superclass dari number yang
boleh masuk ke dalam fungsi tersebut. Seperti pada contoh bagian
Generic Method di atas, bounded type tidak harus mempergunakan
dengan wildcard.

Generic Class Inheritance


Sebuah class generic dapat diturunkan menjadi class generic
berikutnya, sebagai contoh:
class parent1<T> {}
class child11<T> extends parent1<T> {}
class child12<T,X> extends parent1<T> {}
class parent2 {}
class child2<T> extends parent2 {}

Salah satu cara untuk memeriksa kita dapat mempergunakan

42
syntax instanceof, misal:

public class parent<T> {


T x;
}
public class child<T> extends parent<T> {
T y;
}
void testing() {
parent<Integer> ipp = new parent<Integer>();
parent<Integer> ipc = new child<Integer>();
child<Integer> icc = new child<Integer>();
if( ipp instanceof parent<?> )
System.out.println("ipp ~ parent<?>");
if( ipp instanceof child<?> ) // tidak tercetak
System.out.println("ipp ~ child<?>");
if( ipc instanceof parent<?> )
System.out.println("ipc ~ parent<?>");
if( ipc instanceof child<?> )
System.out.println("ipc ~ child<?>");
if( icc instanceof parent<?> )
System.out.println("icc ~ parent<?>");
if( icc instanceof child<?> )
System.out.println("icc ~ child<?>");
}

Perlu diingat, bahwa informasi isi generics tidak tersedia saat


runtime, sehingga, apabila kita menuliskan “ipp instanceof
parent<Integer>” akan menghasilkan compile error.

Latihan
Buatlah class generic untuk himpunan
Buatlah class generic untuk stack
Buatlah class generic untuk queue

43
Bab 6: Collections

Tujuan
Praktikan dapat mendayagunakan collection yang telah
disediakan java sebagai struktur data umum dalam pembuatan
program.

Comparable
Dalam membuat class yang akan dimasukkan ke dalam
collection, sebaiknya class tersebut mengimplements Comparable,
sehingga algoritma-algoritma seperti sort dan binarySearch dapat
dijalankan pada Collection yang menyimpan class tersebut.
Contoh:
class Manusia implements Comparable<Person> {
private String firstName;
private String lastname;
public Manusia (String firstName, String lastname) {
this.firstName = firstName;
this.lastname = lastname;
}
public String toString() {
return firstName + " " + lastname;
}
public int compareTo(Manusia p) {
int result = lastname.compareTo(p.lastname);
return result == 0 ? firstName.compareTo(p.firstName) : result;
}
}

Class di atas apabila dimasukkan ke dalam array, dapat


mendayagunakan method Arrays.sort dan Arrays.binarySearch dari
Java.util.

Collection
Collection atau sering disebut container merupakan class
yang menyimpan sekumpulan object. Class-class tersebut setara
dengan STL C++. Java mengimplementasikan collection dalam
bentuk class dan interface, yaitu:

• Collection: superclass dari semua collection yang ada

44
• Set: dalam bahasa indonesia artinya adalah himpunan,
dalam sebuah himpunan, tidak diperbolehkan ada data yang
kembar. Diimplementasikan dalam class HashSet, EnumSet,
TreeSet dan LinkedHashSet. Method terpenting dari set
adalah: add, iterator dan remove.

• List: dalam bahasa indonesia artinya adalah daftar, dimana


urutan merupakan hal yang penting. Diimplementasikan
dalam class: ArrayList/Vector, Stack dan LinkedList. Method
terpenting dari list adalah: add, remove, iterator dan get.

• Queue: dalam bahasa indonesia artinya adalah antrian,


umumnya menggunakan algoritma FIFO, terkecuali priority
queue dimana yang keluar terlebih dahulu adalah elemen
dengan prioritas tertinggi. Method terpenting dari Queue
adalah: add/offer, remove/poll, element/peek.

• Map: dalam bahasa pemrograman lainnya sering disebut


array asosiatif, yaitu himpunan dari pasangan-pasangan.
Diimplementasikan dalam class HashMap/Hashtable,
TreeMap, LinkedHashMap, EnumMap, IdentityHashMap,
LinkedHashMap, Properties, WeakHashMap. Method penting
dalam map, diantaranya: put, get, iterator dan remove.

• SortedSet dan SortedMap, yaitu himpunan yang selalu urut.


NavigableSet merupakan interface turunan SortedSet yang
memiliki method: descendingInterator, descendingSet,
headSet, tailSet, subSet, ceiling, floor, higher, lower,
pollFirst dan pollLast. NavigableMap merupakan interface
turunan SortedMap yang memiliki method:
descendingKeySet, descendingMap, headMap, tailMap,
subMap, ceilingKey, floorKey, higherKey, lowerKey,
ceilingEntry, floorEntry, higherEntry, lowerEntry,
pollFirstEntry, pollLastEntry,

List
List menyediakan berbagai algoritma yang dapat digunakan
secara langsung, diantaranya: short, shuffle, reverse, rotate,
swap, replaceAll, fill, copy, binarySearch, indexOfSubList,

45
lastIndexOfSubList

Iterator
Iterator merupakan salah satu cara melakukan iterasi dari
collection selain dengan syntax for-each dari Java. Method
terpenting dari Iterator adalah: hasNext, next dan remove.

46
Bab 7: GUI

Tujuan
Praktikan mampu menggunakan toolkit untuk membuat GUI
bahasa Java.

Java AWT
Pada 4 bab sebelumnya kita sudah menggunakan
pemrograman pada level konsol. Pada modul ini akan dibahas
pemrograman dengan menggunakan windows atau GUI (Graphical
User Interface). Untuk pemrograman GUI ini dengan
mengimplementasikan package java.awt atau dapat juga
menggunakan package javax.swing.
Package java AWT (Abstract Window Toolkit) menggunkan
sistem window pada komputer lokal. Dengan demikian tampilan di
window pada Sistem Operasi yang berbeda dapat menghasilkan
tampilan window yang berbeda pula. Berikut adalah gambar
diagram hirarki dalam java.awt.
Untuk memahami GUI dalam java kita akan menggunakan
teks editor pada class dan tidak menggunakan fitur generate GUI
pada NetBeans. Berikut contoh bila kita akan membuat sebuah
frame dengan menggunakan package java.awt
import java.awt.*;
public class Modul3a {
public static void main(String[] args) {
Frame f = new Frame("New Frame");
f.setSize(400,200);
f.setVisible(true);
}
}

Hasil outputnya (pada OS WIndows):

47
Pada frame yang dibuat, tidak dapat dilakukan fungsi close,
oleh karena itu kita akan memodifikasi code dengan menambahkan
event handling atau pananganan kejadian seperti berikut:
import java.awt.*;
import java.awt.event.*;
public class Modul3a extends Frame {
public Modul3a() {
super("Tes Frame");
setSize(400,200);
addWindowListener(new Modul3a.PenangananKejadian());
setVisible(true);
}
class PenangananKejadian extends WindowAdapter{
@Override public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public static void main(String[] args) {
Modul3a m = new Modul3a();
}
}

Modul3a() adalah constructor untuk memanggil fungsi


addWindowListener dan fungsi lain pada class Frame.
wIndowClosing merupakan override method dari abstract class
WindowAdapter, selain itu beberapa method penanangan kejadian
yang lain seperti windowOpened(), windowActivated(),
windowDeactivated(), windowStateChanged(), dsb.
Untuk penanganan kejadian/ event handler lebih lanjut akan
kita bahas pada bab berikutnya.

48
Layout Management
Pada class Container dalam java awt mendefinisikan metode
bernama setLayout() yang ditujukan untuk mengatur tata letak
komponen-komponen yang ada di dalamnya. AWT terdapat 5 layout
management dasar, antara lain:

• FlowLayout: Layout ini mengatur komponen GUI agar


terletak dalam satu baris saja, dan jika telah melebihi
batas lebar area tampilan akan diletakkan pada baris
berikutnya.
Berikut contoh penggunaan FlowLayout
import java.awt.*;
import java.awt.event.*;
public class TesFlowLay extends Frame {
public TesFlowLay() {
super("Layout: Flow layout");

49
setSize(300,200);
setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
add(new Button("Tombol A"));
add(new Button("Tombol B"));
add(new Button("Tombol C"));
add(new Button("Tombol D"));
addWindowListener(new TesFlowLay.PenangananKejadian());
setVisible(true);
}
class PenangananKejadian extends WindowAdapter{
@Override public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public static void main(String[] args) {
TesFlowLay f = new TesFlowLay();
}
}

Hasil output:

Komponen button yang ada di atas masih diletakkan


langsung pada frame, dapat kita letakkan pada komponen panel-
panel, seperti berikut:
Panel p = new Panel();
p.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
p.add(new Button("Tombol A"));
p.add(new Button("Tombol B"));
p.add(new Button("Tombol C"));
p.add(new Button("Tombol D"));
add(p);

• GridLayout: merupakan layout yang menggunakan grid


dengan ukuran yang sama untuk setiap komponennya.
Berikut contoh GridLayout:
Panel p1 = new Panel();
p1.setLayout(new GridLayout(2,2));
p1.add(new Label("Label 1: "));
p1.add(new TextField("-Text Field 1-"));
p1.add(new Label("Label 2: "));

50
p1.add(new TextField("-Text Field 2-"));

Panel p2 = new Panel();


p2.setLayout(new GridLayout(2, 3, 10, 10));
p2.add(new Button("Save"));
p2.add(new Button("Edit"));
p2.add(new Button("OK"));
p2.add(new Button("Cancel"));
add("North", p1);
add("South", p2);

Hasil Output:

• BorderLayout: adalah layout dengan menempatkan


komponen dengan pendekatan mata angin. BorderLayout
merupakan layout default bila kita tidak menetapkan suatu
layout pada class Window, Frame, dan Dialog.
Berikut contoh BorderLayout:
Panel p = new Panel();
p.setLayout(new BorderLayout());
p.add(new Button("Button A"), BorderLayout.NORTH);
p.add(new Button("Button B"), BorderLayout.SOUTH);
p.add(new Button("Button C"), BorderLayout.WEST);
p.add(new Button("Button D"), BorderLayout.EAST);
p.add(new Button("Button E"), BorderLayout.CENTER);
add(p);

Hasil output:

51
• CardLayout: merupakan layout yang menampilkan object
dalam container seperti tumpukan sebuah kartu. Hanya 1
container yang muncul pada setiap waktu. Berikut contoh
untuk CardLayout:
Panel pTitle = new Panel();
pTitle.setLayout(new FlowLayout());
pTitle.add(new Label("Testing Card Layout"));
pTitle.setForeground(Color.WHITE);
pTitle.setBackground(Color.GRAY);
add("North", pTitle);

CardLayout c = new CardLayout();

Panel pCard = new Panel();


add("Center", pCard);
pCard.setLayout(c);

Panel p1 = new Panel();


p1.add(new Label("Label Satu"));

Panel p2 = new Panel();


p2.add(new Label("Label Dua"));
p2.add(new Button("Button Dua"));

pCard.add("panel satu", p1);


pCard.add("panel dua", p2);

Contoh untuk memanggil container


c.previous(pCard);
c.next(pCard);

52
• GridBagLayout: merupakan layout yang dapat digunakan
untuk meletakkan komponen secara bebas. Berbeda dengan
GridLayout di mana setiap komponen akan diletakkan dalam
grid dengan ukuran yang sama, sedangkan pada
GridBagLayout setiap komponen dapat menempati ukuran
yang berbeda dengan yang lain. Berikut contoh
GridBagLayout:
GridBagLayout gb = new GridBagLayout();
setLayout(gb);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.ipadx = 40; gbc.ipady = 20;

Button b1 = new Button("<<");


gbc.gridx=0;
gbc.gridy=0;
gbc.gridwidth=1;
gbc.gridheight=1;
gb.setConstraints(b1, gbc);
add(b1);

Button b2 = new Button("^");


gbc.gridx=1;
gbc.gridy=0;
gbc.gridwidth=1;
gbc.gridheight=1;
gb.setConstraints(b2, gbc);
add(b2);

Button b3 = new Button(">>");


gbc.gridx=2;
gbc.gridy=0;
gbc.gridwidth=1;
gbc.gridheight=1;
gb.setConstraints(b3, gbc);
add(b3);

Button b4 = new Button("West");


gbc.gridx=0;
gbc.gridy=1;
gbc.gridwidth=2;
gbc.gridheight=3;

53
gb.setConstraints(b4, gbc);
add(b4);

Hasil Output:

Keterangan:
GridBagConstrain
// class untuk menentukan batasan-batasan dalam GridBagLayout.
Fill
// digunakan untuk menentukan komponen dapat menempati lebih
dari satu kolom atau baris.
ipadx dan ipady
// mengembangkan komponen ke kiri-kanan (ipadx) dan atas-bawah
(ipady)
gridx dan gridy
// menentukan posisi kolom (gridx) dan posisi baris (gridy)
tempat komponen pada sel grid.
gridwidth
// menentukan lebar komponen (dalam sel).
girdheight
// menentukan tinggi komponen (dalam sel).

Java Swing
Pada subbab sebelumnya kita telah mengenal pemrograman
GUI dengan AWT di mana hasil tampilan atau output komponennya
dapat berbeda pada setiap sistem operasi yang berbeda. Swing
tidak menggunakan komponen yang ada pada class AWT dan tidak
bergantung pada sistem operasi, sehingga tampilan komponen atau
grafik dari Swing menjadi serupa untuk semua sistem operasi.
Component pada diagram hirarki AWT sama dengan
JComponent pada class Swing. Setiap komponen yang ada pada
class Swing umumnya diawali dengan huruf J, misalnya jika kita
mengenal Frame dan Panel pada class AWT, pada class Swing kita
menggunakan JFrame dan JPanel. Penggunaan LayoutManagement

54
dapat digunakan class AWT dapat diterapkan pada class Swing.
Berikut contoh penggunaan Swing:
import java.awt.*;
import javax.swing.*;

public class SwingA extends JFrame{


Container c = new Container();
public SwingA() {
super(".: Testing Swing:.");
setSize(400,220);
setLocation(100,100);

JPanel p1 = new JPanel();


p1.setLayout(new GridLayout(4,2));
p1.add(new JLabel("NRP: "));
p1.add(new JTextField());
p1.add(new JLabel("Nama Lengkap: "));
p1.add(new JTextField());
p1.add(new JLabel("Alamat: "));
p1.add(new JTextArea("", 1, 10));
p1.add(new JLabel("Kota: "));
String kota[]={"Surabaya", "Sidoarjo", "Malang"};
p1.add(new JComboBox(kota));

JPanel p2 = new JPanel();


p2.setLayout(new FlowLayout());
p2.add(new JLabel("Jenis Kelamin: "));
p2.add(new JRadioButton("Pria",true));
p2.add(new JRadioButton("Wanita"));

JPanel p3 = new JPanel();


p3.setLayout(new GridLayout(1,3));
p3.add(new JButton("Save"));
p3.add(new JButton("Edit"));
p3.add(new JButton("Delete"));

c = getContentPane();
c.add("North", p1);
c.add("West", p2);
c.add("South", p3);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
SwingA s = new SwingA();
}
}

Hasil Output:

55
Untuk komponen-komponen yang ada pada class Swing, dapat
kita coba sebagai latihan seperti JCheckBox, JScrollBar, JSlider,
JList, JProgressBar, JSpinner, JTabbedPane, dsb.
Pertanyaan: menurut kalian, manakah pemrograman GUI
yang lebih sesuai untuk digunakan saat ini, Java AWT atau Java
Swing?

Latihan
1. Buatlah sebuah program kalkulator sederhana dengan
menggunakan class AWT
2. Buatlah sebuah program bidoata mahasiswa dengan
menggunakan class Swing. NB: Gunakanlah seperti pada
contoh di modul 3 dan tidak menggunakan IDE generate pada
NetBeans.

56
Bab 8: Event Handling

Tujuan
Praktikan mampu mempergunakan method untuk menghandle
event yang terjadi pada GUI.

Event Handler
Dalam pemrograman perlu untuk menambahkan sebuah
listener(pendengar) yang merespon request dari inputan user, baik
berupa inputan keyboard, inputan mouse pada komponen-
komponen tertentu seperti Windows Form, Button, TextField,
CheckBox dan sebagainya. Untuk menambahkan sebuah listener
dengan menggunakan addXXXListener dengan XXX dapat diganti
dengan object yang berfungsi sebagai listener. Sebagai contoh
object Window dengan method addWindowListener(), sedangkan
objek Button dengan method addActionListener().
Beberapa contoh tipe event listener yang ada di Java:
ActionListener
FocusListener
ItemListener
KeyListener
ListSelectionListener
MenuListener
MouseListener
MouseMotionListener
PopupMenuListener
TextListener
WindowListener
WindowStateListener
dll

Pada bab sebelumnya sudah disinggung sedikit mengenai


penggunaan event handling pada AWT. Salah satu contohnya yaitu
bila tombol x pada windows diklik maka program akan segera
keluar atau diakhiri, yaitu dengan menggunakan class
WindowAdapter dan override method windowClosing.
public Modul3a() {
super("Tes Frame");
setSize(400,200);
addWindowListener(new Modul3a.PenangananKejadian());
setVisible(true);

57
}
class PenangananKejadian extends WindowAdapter{
@Override public void windowClosing(WindowEvent e) {
System.exit(0);
}
}

Pertanyaan: apakah ada perbedaan jika kita melakukan


inheritance atau pewarisan terhadap class WindowAdapter dengan
WindowListener? Jawaban akan kita temukan di modul ini

ActionListener dan ItemListener


Berikut kita akan mencoba membuat sebuah Frame yang
dapat menghandle komponen seperti CheckBox dan Button. Untuk
Button Click dengan mengimplemen interface ActionListener dan
melakukan override terhadap method actionPerformed().
Sedangkan jika akan menggunakan pemilihan CheckBox dengan
mengimplemtasikan interface ItemListener dan melakukan
override itemStateChanged().
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Modul4a extends Frame implements ActionListener,


ItemListener{
int counter;
Label lb = new Label("Selected: ");
TextField tf = new TextField(20);
Button b = new Button("Counter");
Checkbox c1 = new Checkbox("Check Box 1");
Checkbox c2 = new Checkbox("Check Box 2");
Checkbox c3 = new Checkbox("Check Box 3");

public Modul4a() {
super("Testing Event Windows");
setSize(400,200);

Panel p1 = new Panel();


p1.add(lb);
p1.add(tf);
p1.add(b);
add("North", p1);

Panel p2 = new Panel();


p2.add(c1);
p2.add(c2);
p2.add(c3);
add("South", p2);

58
b.addActionListener(this);
c1.addItemListener(this);
c2.addItemListener(this);
c3.addItemListener(this);
addWindowListener(new Modul4a.penangananKejadian());
setVisible(true);
}

public class penangananKejadian extends WindowAdapter{


@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public void actionPerformed(ActionEvent e) {
counter++;
JOptionPane.showMessageDialog(this, "Klik: " + counter);
}
public void itemStateChanged(ItemEvent e) {
String teks="";
if (c1.getState()) {
teks = "Check Box I";
c2.setState(false); c3.setState(false);
}
else if (c2.getState()==true) {
teks = "Check Box II";
c1.setState(false); c3.setState(false);
}
else if (c3.getState()==true) {
teks = "Check Box III";
c1.setState(false); c2.setState(false);
}
tf.setText(teks);
}
public static void main(String[] args) {
Modul4a ma = new Modul4a();
}
}

Hasil Output:

Sebagai latihan, buatlah sebuah program sederhana dengan


menggunakan interface yang lain seperti KeyListener dan
MouseListener. KeyListener merupakan interface yang digunakan
untuk menangkap event yang disebabkan oleh keyboard yaitu pada

59
saat tombol keyboard ditekan pada sebuah komponen. Sedangkan
MouseListener merupakan interface untuk menagkap event yang
disebabkan oleh mouse, seperti ketika tombol mouse berada di
atas komponen atau ketika tombol mouse ditekan.

Standard AWT Event Listeners (Listener and Adapter)


Pada beberapa contoh, kita jumpai penggunaan event
listener ada yang menggunakan Listener ada juga yang
menggunakan Adapter. Kedua jenis event listener ini memiliki
konsep yang berbeda dalam penggunaannya.

• Listener, merupakan sebuah interface, sehingga methodnya


harus dituliskan kembali pada class yang
mengimplemtasikannya.

• Adapter, merupakan abstract class yang merupakan


implementasi dari suatu interface Listener.
Tujuan penggunaan class Adapter adalah untuk melakukan
efisiensi pemrograman karena hanya mendefinisikan method yang
digunakan saja, sedangkan jika kita menggunakan Listener maka
semua methodnya harus kita definisikan. Contoh class Adapter:
Window Adapter (abstract class yang mengimplementasikan interface
WindowListener).
MouseAdapter (abstract class yang mengimplementasikan interface
MouseListener).

Ada beberapa Event Listener yang sering digunakan dalam


AWT Listener, antara lain:
Listener Adapter Class Registration Method
<Interface> (If Any)
<abstract class>
ActionListener addActionListener
AdjustmentListener addAdjustmentListener

ComponentListener ComponentAdapter addComponentListener


ContainerListener ContainterAdapter addContainerListener
FocusListener FocusAdapter addFocusListener
ItemListener addItemListener
KeyListener KeyAdapter addKeyListener
MouseListener MouseAdapter addMouseListener
MouseMotionListener MouseMotionAdapter addMouseMotionListener

60
TextListener addTextListener
WindowListener WindowAdapter addWindowListener

Berikut contoh code perbedaan penggunaan antara Adapter


dan Listener:
import java.awt.*;
import java.awt.event.*;
public class TestEvent extends Frame implements ActionListener,
ItemListener{
public void actionPerformed(ActionEvent e) {}
public void itemStateChanged(ItemEvent e) {}
public class PenangananKejadian extends MouseAdapter{
@Override
public void mouseClicked(MouseEvent e) {
System.out.println(getX() + " , " + getY());
}
}
public class PenangananKejadian2 implements MouseListener{
public void mouseClicked(MouseEvent e) {
System.out.println(getX() + " , " + getY());
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
}

Using Event Handler in NetBeans IDE


Setelah memahami konsep GUI pada Java, kita akan mencoba
menggunakan GUI pada NetBeans dan penggunaan event handler di
dalamnya. Dengan GUI editor ini, akan memudahkan pengguna
untuk membuat sebuah tampilan tanpa harus melakukan coding
dari awal untuk komponen-komponen yang akan digunakan di
dalamnya. Kita menggunakan drag-drop terhadap komponen-
komponen yang ada di dalamnya ke Frame atau Panel seperti pada
GUI editor seperti Visual Studio.
Pertama-tama buatlah project baru, kemudian tambahkan
file baru untuk Swing GUI pada menu File > New File seperti
tampilan berikut ini, kemudian pilihlah Categories (Swing GUI
Forms) > File Type (JFrame Form).

61
Sebagai latihan kita akan membuat tampilan GUI dengan
menggunakan JFame dan komponen seperti berikut:

Untuk mengubah properties dari komponen yang dipilih dapat


menggunakan jendela properties pada sebelah kanan. Proerties
dapat diakses pula dengan melakukan klik kanan pada komponen
yang dipilih kemudian pilih Properties. Kita dapat mengganti jenis
font, warna background, nama komponen dan lain sebagainya pada
tab properties. Sedangkan untuk mengubah nama komponen
menggunakan tab Code > Variable Name.

62
Terdapat 4 tab pengaturan pada GUI antara lain Tab
Properties, Binding, Events, Code. Gunakan tab Events untuk
menambahkan event handler pada tombol yang dituju, yaitu
jRadioButton (Pria dan Wanita) dan JButton ketika dipilih.
Berikut merupakan contoh source code event pada
komponen.

63
Method tekan() merupakan event handler untuk Button View,
method optWanitaActionPerformed() merupakan event handler
untuk JRadioButton dengan nama variable optWanita.

Latihan
1. Buatlah sebuah program inputan Biodata Mahasiswa dengan
contoh tampilan seperti berikut:

64
Dengan ketentuan seperti berikut:

• Inputan TextField NIM hanya dapat diisi oleh angka 0-9


dan panjang maks 11 digit.

• Jika Field NIM dienter maka focus akan pindah ke field


Nama, dan jika field Nama dienter maka akan pindah ke
field Alamat.

• Jika Combobox Fakultas dipilih, maka akan akan


menampilkan pilihan jurusan yang sesuai pada
combobox Jurusan.

• Tombol Simpan masih tidak berfungsi, sedangkan tombol


Baca Data akan menampilkan data yang sudah
diinputkan pada message box.

• Untuk awal dan lebih memahami tentang GUI dan event


handler sebaiknya gunakan Java Class, kemudian baru
terapkan pada Swing GUI pada IDE NetBeans

65
2. Buatlah sebuah program sederhana dengan Jframe seperti
berikut, dengan ketentuan jika tombol ”chose color”
ditekan maka akan keluar sebuah ColorDialog yang
digunakan untuk mengganti warna pada jPanel di sebelah
kiri.

Tambahkan 3 jSlider untuk melihat nilai RGB yaitu Reg-


Green-Blue. Value untuk ketiga jSlider antara 0-255, jika
kita menggeser ke kanan atau kiri nilai RGB maka warna
pada panel juga akan berubah.
Clue: gunakan class JColorChooser pada event Button untuk
mengeluarkan nilai warna, seting nilai min-max dan
properties lainnya pada jSlider, event StateChanged untuk
menangkap perubahan nilai pada jSlider.
3. Buatlah aplikasi yang lain sesuai kreasi Anda yang
menerapkan GUI dan event handler misalnya seperti:
program calculator, teks editor (mengubah warna, ukuran,
jenis font pada TextArea) atau program Menu Utama dengan
sub-sub menu pada toolbar.

66
Bab 9: Graphics

Tujuan
Praktikan mampu mempergunakan method-method
penggambaran primitif untuk melakukan penggambaran.

Canvas
Jika kita melihat kembali pada diagram hirarki java.awt pada
modul 3, kita akan melihat bahwa Canvas adalah subclass dari class
Component. Canvas digunakan untuk melakukan penggambaran
berbagai bentuk pada java. Salah satu contohnya dengan
menggunakan method paint() yang mengakses class Graphics.
Buatlah sebuah java class file untuk mencoba penggunaan class
Canvas seperti berikut:
import java.awt.*;
import javax.swing.*;
public class Rectangle extends JFrame {
public Rectangle() {
super("Rectangle Example");
setSize(400,150);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

MyCanvas m = new MyCanvas();


add(m);
setVisible(true);
}
public class MyCanvas extends Canvas{
@Override
public void paint(Graphics g) {
g.setColor(Color.GRAY);
g.drawString("Testing Canvas", 150, 10);
g.draw3DRect(20, 20, 100, 100, true);
g.fillRect(20, 20, 100, 100);
g.drawOval(120, 20, 150, 100);
g.drawRoundRect(270, 20, 100, 100, 100, 100);
}
}
public static void main(String[] args) {
Rectangle r = new Rectangle();
}
}

Contoh Hasil output:

67
Graphics, Paint and Event Handler
Data graphics secara konsep terbagi menjadi potongan-
potongan kecil seperti puzzle yang kita namakan dengan pixel.
Dalam graphics kita mengenal beberapa istilah seperti koordinat
dan RGB. Koordinat x-Axis dan y-Axis digunakan untuk menentukan
lokasi gambar atau object dalam Frame (dimulai dari kiri atas).
Sedangkan koordinat digunakan untuk menentukan colors
atau warna dengan mencampurkan nilai RGB dengan nilai antara 0-
255 untuk masing-masing nilai Merah, Hijau dan Biru.
Method paint() digunakan untuk menambahkan atau
menggambarkan komponen-komponen yang ada pada Graphics.
Berikut kita akan melihat penggunaan graphics, paint dan event
handler menggunakan MouseListener / MouseAdapter.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MouseCircle extends JFrame{
int x;
int y;
public MouseCircle() {
super("Draw Circle Listener");
setSize(400,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setForeground(Color.BLUE);
addMouseListener(new CircleListener());
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.fillOval(x-25, y-25, 50, 50);
}
public class CircleListener extends MouseAdapter{
@Override
public void mousePressed(MouseEvent e) {
x = e.getX();

68
y = e.getY();
repaint();
}
}
public static void main(String[] args) {
MouseCircle m = new MouseCircle();
m.setVisible(true);
}
}

Hasil Output:

Pada contoh program tersebut, bila kita menekan tombol


mouse, maka akan terbentuk lingkaran biru sesuai dengan
koordinat mouse pada saat kita tekan.

Using Graphics in NetBeans IDE


Pada modul sebelumnya kita telah mencoba menggunakan
event handler pada NetBeans IDE, dengan menggunakan IDE dapat
membantu kita untuk mempercepat code kita karena menggunakan
fungsi drag drop komponen-komponen yang dibutuhkan saja.
Sekarang kita dapat menerapkan penggunaan graphics dengan
event handler tersebut.

69
Buatlah sebuah file pada project kita dengan melakukan klik
kanan > New > JFrame Form. Kita dapat juga menambahkan
menggunakan menu File > New File. Setelah JFrame kita buat,
tambahkan sebuah panel dan 3 buah button seperti pada gambar
berikut:

70
Hasil Output:

Bila kita melakukan klik pada JButton Rectangle maka akan


muncul gambar kotak berwarna merah pada panel, sedangkan

71
JButton Circle akan muncul lingkaran berwarna hijau dan JButton
Elips akan muncul Elips berwarna biru. Oleh karena gambar yang
muncul adalah menangkap inputan berupa pilihan pada button,
maka kita harus menambahkan event handler pada setiap button.
Kita akan menambahan even actionPerformed pada setiap button,
untuk memberikan event handler pada komponen, lihatlah kembali
pada modul yang sebelumnya.

Latihan
1. Lanjutkan contoh latihan sebelumnya dengan beberapa
ketentuan:

• Tambahkan icon pada button rectangle, circle dan


elips.

• Pertama kali memilih button bentuk


(rectangle/circle/elips) gambar belum muncul, tetapi
ketika melakukan click pada bagian dalam panel.

• Posisi koordinat dari bentuk/shape yang dipilih sesuai


dengan posisi (koordinat) mouse dan tidak statis
seperti pada contoh.

• Ukuran panjang/height dan lebar/width dari bentuk


yang dipilih disesuaikan dengan drag mouse seperti
pada aplikasi paint.

72
Contoh output:

73
Bab 10: Multithreading and Java Applet

Tujuan
Praktikan mampu mempergunakan thread untuk membuat
proses yang berjalan pada background.

Thread and Multithreading


Pada kehidupan sehari-hari seringkali kita menjumpai sebuah
proses atau kegiatan yang dilakukan hampir secara bersamaan.
Misalnya pada saat kita ketika kita membuka laptop dan
menyalakannya, kita dapat membalas sms dari teman kita sembari
kita menunggu proses startup pada Operating System laptop
tersebut selesai. Ilustrasi lainnya misalnya memasak nasi
membutuhkan waktu 30 menit dan mencuci piring membutuhkan
waktu 20 menit. Berapakah waktu yang dibutuhkan untuk
melakukan keduanya? Bisa jadi 50 menit atau 30 menit saja. Total
proses menjadi 50 menit bila kita memasak nasi hingga matang,
kemudian baru mencuci piring. Namun lebih baik lagi jika kita
memasak nasi dan sambil menunggu nasi matang kita bisa mencuci
piring sehingga waktu yang dibutuhkan jauh lebih singkat.
Demikian halnya seperti ilustrasi tadi kita namakan dengan
multithreading. Thread adalah sebuah proses atau instruksi dalam
bahasa pemrograman yang biasanya digunakan untuk membuat
proses interaktif. Sedangkan multithread adalah kemampuan yang
memungkinkan beberapa proses atau instruksi dijalankan secara
hampir bersamaan. Dengan kemampuan processor saat ini
perbedaan antar thread dapat mendekati 0.
Terdapat 2 jenis penggunaan konsep Thread:

• Extends class Thread: pada pendefinisan class ditambahkan


inheritance dari class Thread.
class namaclass extends Thread{
NamaClass() {
//isi constructor
}
public void run() {

74
}
}

• Implements Runnable: pada pendefinisan class ditambahkan


dengan mengimplentasikan interface Runnable.

class NamaClass implements Runnable{


NamaClass() {
//isi constructor
}
public void run() {
}
}

Pada Threading kita akan menjumpai method run() yang akan


mengeksekusi perintah-perintah yang diberikan.
Untuk penggunaan method-method pada Thread dapat kalian
coba-coba sebagai latihan di rumah. Beberapa contoh method yang
ada pada class Thread, antara lain:
void destroy()
String getName()
void setName(String name)
int getPriority()
void setPriority(int priority)
boolean isAlive()
void resume()
void sleep(long milis)
void start()
void stop()
void suspend()

Contoh Thread dengan menggunakan extends Thread


class Mobil extends Thread{
public Mobil(String kode) {
super(kode);
}
@Override
public void run() {
try{
String nama = getName();
for(int i=0; i<5; i++) {
sleep(2000);
System.out.println("Thread "+nama+": Posisi"+i);
}
}
catch(Exception e) {
System.out.println("Interrupted...");
}
}
}

public class TestThread1 {

75
public static void main(String[] args) {
Mobil m1 = new Mobil("Mobil-1");
Mobil m2 = new Mobil("Mobil-2");
m1.start();
m2.start();
}
}

Contoh Thread dengan menggunakan implements Runnable


class Mobil implements Runnable {
String nama;
public Mobil(String kode) {
this.nama = kode;
}
public void run() {
try{
for(int i=0; i<5; i++) {
Thread.sleep(2000);
System.out.println("Thread "+nama+": Posisi "+i);
}
}
catch(Exception e) {
System.out.println("Interrupted...");
}
}
}
public class TestThread2 {
public static void main(String[] args) {
Thread m1 = new Thread(new Mobil("Mobil-1"));
Thread m2 = new Thread(new Mobil("Mobil-2"));
m1.start();
m2.start();
}
}

Bila kita lihat, kedua code di atas memiliki banyak


persamaan, hanya pada saat pemanggilan method sleep dan cara
instanisasi pada class main.

Java Applet
Pada bahasa pemrograman Java, user dapat berinteraksi
dengan aplikasi melalui sebuah web browser. Keunggulan dari cara
ini adalah fleksibilitas yang tinggi karena hanya dibutuhkan web
browser (contohnya: Mozzilla, Opera, Safari, ChromePlus, IE) untuk
mengakses aplikasi Java tersebut. Ada beberapa jenis program java
yang didevelop untuk berjalan pada web browser, antara lain
Applet , Java Server Pages (JSP) dan Servlet .

76
Pada modul ini kita akan membahas penggunaan Applet.
Sama halnya dengan pemrograman GUI pada java dapat
menggunakan 2 class yaitu AWT atau Swing.
Berikut ini adalah daftar method yang dapat digunakan untuk
Applet:

• init() dijalankan ketika applet mulai di-load.


Dijalankan hanya sekali saja. Umumnya digunakan
untuk meletakkan komponen ke panel, mengatur
background warna atau membuka koneksi database

• start() dijalankan setelah inisialisasi atau ketika user


berpindah dari suatu aplikasi atau webpage ke
halaman yang mengandung applet tersebut.

• paint() adalah method yang dipanggil untuk


memperbarui tampilan.

• repaint() adalah method yang dipanggil untuk


memaksa pemanggilan method paint().
Inisialisasi pada applet dapat dengan menggunakan method-
method yang ada pada tabel method. Berikut contoh penggunaan
applet. Pertama kita akan membuat sebuah Java class seperti
berikut:
import java.awt.*;
import javax.swing.JApplet;
public class TesJApplet extends JApplet {
int counter;
String title = "Testing Using Applet";
Font f = new Font("Verdana", Font.BOLD, 14);
@Override
public void paint(Graphics g) {
counter++;
g.setFont(f);
g.setColor(Color.BLUE);
g.drawString((new Integer(counter))+": " + title, 10, 20);
}
@Override
public void init() {
counter = 1;
}
@Override
public void start() {
counter++;
}
// TODO overwrite start(), stop() and destroy() methods

77
}

Untuk memanggil class Applet pada sebuah browser, buatlah


sebuah file html seperti berikut:
<html>
<head> <title>.: Testing Code Applet:.</title> </head>
<body> <applet code="TesJApplet.class" width="300"> </body>
</html>

Simpan dengan nama yang sama dengan nama class Applet


yaitu TesJApplet.html dan letakkan pada direktori yang sama
dengan file class. Kemudian jalankan file html tersebut dengan
menggunakan web browser.

Pada browser dapat kita lihat nilai dari variable counter


adalah 3. Pada saat init() dijalankan maka counter = 1, kemudian
start() dijalankan maka counter = 2. Pada paint() variable counter
ditambahkan kembali ( counter++; ) maka nilai variabel counter =
3.

Latihan
1. Buatlah sebuah aplikasi stopwatch dengan menggunakan

78
Thread, dengan tampilan awal seperti berikut:

Terdapat 4 kotak yang menunjukkan waktu, yaitu jam,


menit, detik dan per100 detik. Kotak menggunakan
component JLabel. Bila kita tekan button START, maka
Thread akan berjalan dan waktu akan mulai menghitung
dan button START akan berubah menjadi STOP. Button
RESET untuk mengembalikan nilai awal yaitu 0: 0: 0: 0

satu kotak/label menggunakan satu thread, sehingga


terdapat 4 thread yang dipanggil secara bersamaan.
2. Buatlah sebuah aplikasi applet yang dapat digunakan untuk
memainkan file suara, dengan tampilan seperti berikut:

79
Contoh tampilan pada browser ChromePlus 1.4
Tampilan applet dapat kita buat sendiri atau menggunakan
fitur pada NetBeans (File > New File > Swing GUI Form >
JAppletForm). Bila kita menekan tombol play, maka akan
memainkan musik pada code yang telah kita definisikan.

• Gunakan class AudioClip pada package java.applet


dan method-method yang ada di dalamnya.

• Beberapa tipe file suara yang dapat diputar oleh


applet: MIDI, RMF, WAV, AIFF, dan AU.

• File suara terletak pada folder/directory yang sama


dengan file .class-nya.

80
Bab 11: File Stream

Tujuan
Praktikan mampu mempergunakan stream, serialization dan
file dalam bahasa Java.

InputStream and OutputStream


Class InputStream dan OutputStream berada pada package
java.io merupakan abstract class yang digunakan untuk menangani
proses input output. Karena merupakan abstract class, maka tidak
dapat digunakan secara langsung, tetapi dapat menggunakan class-
class turunannya. InputStream digunakan pembacaan data dari
suatu sumber. Sedangkan OutputStream digunakan untuk
mengirimkan suatu keluaran.
Class turunan dari class InputStream antara lain:
ByteArrayInputStream
FileInputStream
FilterInputStream
ObjectInputStream
PipedInputStream
StringBufferInputStream

Class turunan dari class OutputStream antara lain:


ByteArrayOutputStream
FileOutputStream
FilterOutputStream
ObjectOutputStream
PipedOutputStream

FileOutputStream and DataOutputStream


FileOutputStream digunakan untuk melakukan operasi tulis
data ke dalam sebuah file. DataOutputStream merupakan class
yang digunakan untuk menulis berbagai tipe data ke stream output
dalam format universal (tidak bergantung pada mesin).
Langkah-langkah menulis ke sebuah file:
• Instanisasi kelas FileOutputStream dengan file yang
dituju
• Penulisan data/writeType()

81
• Tutup koneksi file/close()

Berikut contoh untuk menulis data ke dalam file:


import java.io.*;
public class WriteFile {
public static void main(String[] args) throws IOException{

String namaFile = "dataMHS.txt";


String NIM = "08120060001";
String namaMhs = "Maria Diah";
String fakultas = "Ilmu Komputer";
String jurusan = "Sistem Informasi";
int angkatan = 2006;
try{
FileOutputStream fos = new FileOutputStream(namaFile);
DataOutputStream dos = new DataOutputStream(fos);
dos.writeUTF(NIM);
dos.writeUTF(namaMhs);
dos.writeUTF(fakultas);
dos.writeUTF(jurusan);
dos.writeInt(angkatan);
dos.close();
}
catch(FileNotFoundException e) {
System.out.println("File " + namaFile + " not found");
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

FileInputStream and DataInputStream


Class FileInputStream ini merupakan turunan class
InputStream yang digunakan untuk membaca isi file.
DataInputStream adalah class yang menyediakan metode untuk
membaca data dengan berbagai format misalnya char, byte, int,
long, double.
Contoh program untuk membaca isi file “dataMHS.txt” yang
telah kita buat sebelumnya:
import java.io.*;
public class ReadFile {
public static void main(String[] args) throws IOException{
String namaFile = "dataMHS.txt";
String NIM, namaMhs, fakultas, jurusan;
int angkatan;

try{
FileInputStream fis = new FileInputStream(namaFile);
DataInputStream dis = new DataInputStream(fis);
NIM = dis.readUTF();

82
namaMhs = dis.readUTF();
fakultas = dis.readUTF();
jurusan = dis.readUTF();
angkatan = dis.readInt();
dis.close();
System.out.println("NIM: " + NIM +
"\nNama: " + namaMhs +
"\nFakultas: " + fakultas +
"\nJurusan: " + jurusan +
"\nAngkatan: " + angkatan);
}
catch(FileNotFoundException e) {
System.out.println("File " + namaFile + " not found");
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}

SequenceInputStream
Class ini merupakan class turunan dari InputStream dan
berguna untuk menggabungkan 2 buah stream inputan menjadi
sebuah stream inputan .
Pada directory project buatlah 2 buah file teks yang akan
digunakan dalam SequnceInputStream, yang pertama dengan nama
data1.txt yang berisi:
Computer processing..
Exception handling..

Kemudian pada file teks yang lain berisi (kosongkan baris


awal):
Jalan-jalan naik ojek
ga nyambung jek

Contoh penggunaan:
import java.io.*;
public class SequenceFile {
public static void main(String[] args) throws IOException{
FileInputStream namaFile1 = new FileInputStream("data1.txt");
FileInputStream namaFile2 = new FileInputStream("data2.txt");

SequenceInputStream input =
new SequenceInputStream(namaFile1, namaFile2);

int karakter;

while((karakter=input.read()) != -1) {
System.out.print((char)karakter);
}

83
input.close();
namaFile1.close();
namaFile2.close();
}
}

Hasil output
Computer processing..
Exception handling..
Jalan-jalan naik ojek
ga nyambung jek

Serializable and ObjectOutputStream


Pada java, kita mengenal reusable object in memory. Artinya
suatu object dapat disimpan di memory kemudian digunakan
kembali selama JVM (Java Virtual Machine) masih running. Object
Serialization merupakan proses penyimpanan object real menjadi
sequence of byte atau sebaliknya dari sequence of byte ke object
real. Kita dapat menyimpan sequence of byte menjadi suatu file,
database ataupun mentransferkan melalui jaringan. Object yang
disimpan dengan mekanisme object serialization tersebut disebut
Serializable Object.
Class ObjectOutputStream memungkinkan kita untuk menulis
object ke OutputStream. Kita dapat membungkus sebuah
OutputStream dalam sebuah ObjectOutputStream dengan
menuliskan object di dalamnya. Melalui ObjectOutputStream ini
kita dapat menggunakannya untuk menyimpan Serializable Object
(byte stream menjadi file).
Untuk memperjelas hubungan antara Serializabe Object
dengan ObjectOutputStream, kita akan melihat contoh berikut:
import java.io.Serializable;
import java.io.ObjectOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Calendar;

class PersistentTime implements Serializable{


private Date time;
public PersistentTime() {
time = Calendar.getInstance().getTime();
}
public Date getTime() {
return time;

84
}
}

public class TestOutputStream {


public static void main(String[] args) {
PersistentTime time = new PersistentTime();
FileOutputStream fos = null; //menuliskan ke dalam file
ObjectOutputStream out = null; //menuliskan sequence of
byte

try{
fos = new FileOutputStream("time.ser");
out = new ObjectOutputStream(fos);
out.writeObject(time);
System.out.println(time.getTime());
out.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}

Hasil output (bisa berbeda waktu):


Mon Aug 09 20:14:16 ICT 2010

Terdapat 2 class yaitu PersistentTime yang mengimplemen


interface Serializable dan class TestOuputStream yang digunakan
sebagai class Main. Variabel time pada class PersistentTime
menyimpan waktu saat class tersebut di-compile. Pada class
TestOutputStream kita melihat method out.writeObject(time) yang
berarti object time ditulis atau disimpan, kemudian object time
tersebut dituliskan ke dalam sebuah file bernama “time.ser”.
Bukalah file yang time.ser dengan teks editor seperti
wordpad untuk melihat isinya.

ObjectInputStream
Untuk melakukan restore file setelah disimpan dengan
ObjectOutputStream, maka agar dapat dibaca kembali kita
menggunakan class ObjectInputStream. Berikut code untuk
membaca object time pada yang telah dibuat pada contoh
sebelumnya dengan nama file “time.ser”.
import java.io.ObjectInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Calendar;

public class InflateTime {


public static void main(String [] args) {

85
String filename = "time.ser";
PersistentTime time = null;
FileInputStream fis = null;
ObjectInputStream in = null;
try{
fis = new FileInputStream(filename);
in = new ObjectInputStream(fis);
time = (PersistentTime)in.readObject();
in.close();
}
catch(IOException ex) {
ex.printStackTrace();
}
catch(ClassNotFoundException ex) {
ex.printStackTrace();
}
// cetak waktu sebelumnya yg telah disimpan
System.out.println("Flattened time: " + time.getTime());
System.out.println();
// cetak waktu saat ini
System.out.println("Current time: " +
Calendar.getInstance().getTime());
}
}

Hasil Output (bisa berbeda waktu)


Flattened time: Mon Aug 09 20:14:16 ICT 2010
Current time: Mon Aug 09 20:15:07 ICT 2010

File Dialog
Pada banyak aplikasi saat ini telah dilengkapi dengan
berbagai kotak dialog, misalnya untuk membuka file (OpenDialog)
dan menyimpan file (SaveDialog). Dalam pemrograman window
baik dengan package AWT maupun Swing dilengkapi dengan
component FileDialog.
Buatlah tampilan seperti berikut, jika kita menekan button
“Open File Dialog” akan membuka Open File Dialog dengan
memanggil component JFileChooser. Dengan demikian kita harus
menambahkan event pada button.

86
private void btnDialogActionPerformed(java.awt.event.ActionEvent
evt) {
JFileChooser jfc = new JFileChooser();
jfc.showOpenDialog(this);
txtPath.setText(jfc.getSelectedFile().toString());
}

Pertanyaan: bagaimana code pada FileDialog harus


ditambahkan untuk menampilkan list file dengan ekstensi .java
saja?

Latihan
1. Buatlah sebuah JFrame dan terdapat 2 tab (gunakan
JTabbedPane) yang digunakan untuk menulis ke dalam file
dan membaca dari file yang sudah dihasilkan. Ketentuan
program:

• Inputan NIM, Nama, Angkatan tidak boleh kosong

• Fakultas dan Jurusan dapat Anda deskripsikan sendiri


isi item-itemnya

• Pada tab Write File terdapat button Save File Dialog


yang digunakan untuk menampilkan kotak dialog save
di mana file teks akan disimpan.

87
• Pada tab Read File terdapat button Open File Dialog
yang akan digunakan untuk menampilkan kotak dialog
open dimana file teks akan dibaca dan ditampilkan
pada JFrame.

2. Buatlah program yang digunakan untuk membaca attribut


dari sebuah file, misalnya apakah file itu dapat ditulisi,
dapat dibaca, hidden atau tidak, jenisnya directory atau
file, jenis pathnya absolute atau relatif, size file. Tips:
gunakan class File pada package java.io.

88
Bab 12: JDBC

Tujuan
Praktikan mampu mempergunakan JDBC untuk melakukan
koneksi dan manipulasi basis data.

JDBC Concept
Data atau informasi yang terdapat pada aplikasi dapat
disimpan secara temporary atau permanent. Data disimpan secara
temporary artinya setelah program ditutup maka semua data yang
diinputkan akan hilang dan harus diinputkan kembali. Metode
penyimpanan secara temporary umumnya menggunakan array, baik
static ataupun array dinamis. Agar data dapat disimpan secara
permanent maka data tersebut harus disimpan ke dalam sebuah
file ataupun database. Banyak sekali program database pada saat
ini, beberapa yang populer antara lain MySQL, PostgreSQL, Oracle,
Microsoft SQL Server, Microsoft Access.
JDBC merupakan salah satu API (Application Programming
Interface) pada Java yang bertujuan untuk menangani koneksi ke
dalam sebuah database. Melalui JDBC kita dapat melakukan query
atau memasukkan perintah SQL pada code Java. Berikut gambar
diagram pada arsitektur JDBC dengan menggunakan Pure JDBC
Driver (kiri) dan JDBC dengan menggunakan ODBC sebagai
konektivitasnya (kanan).

89
Secara umum pengolahan database yang sering digunakan
terdapat 4 jenis atau disebut DML (Data Manipulation Language)
yang akan kita bahas, antara lain:
• Mengambil data (select)
• Menyimpan/menambah data (insert)
• Mengubah data (update)
• Menghapus data (delete)

Using ODBC
Pada modul kali ini kita akan menggunakan contoh database
Acces dengan menggunakan ODBC dan database MySQL. Jika kita
menggunakan OS Windows, maka kita dapat menemukan fitur
ODBC (Open Database Connectivity). ODBC digunakan untuk
menghubungkan antara database yang satu dengan database yang
lainnya. Berikut contoh langkah-langkah konfigurasi pada OS
Windows XP
1. Buatlah database dengan nama file Mahasiswa.mdb dengan
field NIM, Nama, Jenis Kelamin, Fakultas, Jurusan.
2. Masuk ke Control Panel > Administrative Tools > Data
Sources (ODBC)

90
3. Pilihlah tab System DSN dan klik Add. Kemudian pilih driver
yang akan digunakan, misalnya Microsoft.

4. Tulis nama data source-nya, misalnya mhs. Kemudian pilih


database access yang telah dibuat sebelumnya.

91
Connect and Select (Using ODBC - Access)
Pada code Java, sebelum dapat melakukan perintah DML
maka kita harus melakukan koneksi agar terhubung terlebih dahulu
dengan database, dalam kasus ini dengan menggunakan koneski
ODBC pada database access. Berikut kita akan mencoba aplikasi
dengan database akses. Pertama-tama buatlah database dengan
table tbl_mhs dan struktur tabelnya sebagai berikut

Isilah data terlebih dahulu pada tabel tersebut. Kemudian


pada source code, kita akan mencoba melakukan koneksi dan
mengambil isi data.

92
import java.sql.*;
public class TestConnection {
public static void main(String[] args) throws Exception{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection c = DriverManager.getConnection("jdbc:odbc:mhs",
"", "");
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * FROM tbl_mhs");
while(rs.next()) {
System.out.println(rs.getString("NIM"));
}
s.close();
c.close();
}
}

• Pertama kali kita harus memberitahukan program mengenai


address pengambilan driver JDBC. Perintah yang digunakan
adalah:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Alamat driver merupakan string dan bersifat case sensitif.

• Kemudian kita mempersiapkan koneksi DSN yang telah kita


buat sebelumnya menggunakan class Connection.
Connection c = DriverManager.getConnection("jdbc:odbc:mhs", "",
"");

String pertama adalah nama DSN yang telah kita buat, string
kedua adalah username database, dan string ketiga adalah
password database untuk mengakses ke dalam database
tersebut. Pada contoh kita mengakses ke DSN mhs.

• Membuat object yang akan digunakan untuk menerima


perintah SQL menggunakan class Statement.
Statement s = c.createStatement();

• Menjalankan perintah SQL, seperti mengambil data (SELECT)


menggunakan class ResultSet.
ResultSet rs = s.executeQuery("SELECT * FROM tbl_mhs");

• Kemudian kita akan menampilkan hasil query. ResultSet


menyimpan data hasil query pada array dinamis. Untuk
memberikan filter data kolom mana yang akan ditampilkan
dapat menggunakan fungsi getString(namaField).

• Pada akhir program tutup statement dan koneksi dengan


fungsi close().

93
Insert, Update and Delete
Perintah insert digunakan untuk menambahkan data baru ke
dalam sebuah tabel. Formatnya:
INSERT INTO table_name
VALUES (dataField1, dataField2, dataField3,…)

Contoh penggunaan pada source code:


Statement s = c.createStatement();
s.executeUpdate("INSERT INTO tbl_mhs VALUES('08120060001',
'Bagus Santoso', 1, 'Ilmu Komputer', 'Sistem Informasi', 1)");

Perintah update digunakan untuk mengubah nilai dari suatu


tabel. Formatnya:
UPDATE table_name SET field_name=value
[WHERE condition…]

Contoh penggunaan pada source code:


Statement s = c.createStatement();
s.executeUpdate("UPDATE tbl_mhs SET Nama='Bagus Santosa Jaya'
WHERE NIM='08120080001'");

Perintah delete digunakan untuk menghapus data dalam


sebuah tabel. Formatnya:
DELETE FROM table_name
[WHERE condition...]

Contoh penggunaan pada source code:


Statement s = c.createStatement();
s.executeUpdate("DELETE FROM tbl_mhs WHERE NIM='08120060001'");

Using MySQL JDBC Connector


Kita akan mencoba menggunakan aplikasi database MySQL
pada modul ini. Pertama-tama download installer untuk MySQL
pada website MySQL di url berikut ini
http://dev.mysql.com/downloads/mysql/. Setelah itu instal MySQL
pada komputer kita. Sebagai saran password default tidak
dibiarkan kosong. Kemudian buatlah sebuah database, misal
database dengan nama ”mhs” dan tabel di dalamnya adalah
”tbl_mhs” seperti pada subbab 10.3.
Untuk menghubungkan antara MySQL – Java, membutuhkan
sebuah connector atau library tambahan yang berfungsi sebagai
connector/penghubung antara MySQL dan Java. Berikut langkah-
langkah instalasi jdbc connector dan akses database:

94
1. Download file connector pada
http://dev.mysql.com/downloads/connector/odbc.
2. Lakukan ekstrak jika kita mendownload file .zip, dan lakukan
instal jika mendownload file msi. Ada 2 cara yang dapat
dilakukan untuk mengaktifkan library jdbc connector yaitu
melakukan setting classpath atau melalui IDE. Kali ini kita
akan mencoba dengan menggunakan IDE untuk memanggil
library tersebut.
3. Buatlah sebuah project (new project) pada aplikasi NetBeans
IDE, kemudian pilih pada bagian Libraries.
4. Klik kanan pada Libraries, pilih ”Add JAR/Folder”. Kemudian
carilah file .jar pada MySQL connector yang telah kita
download sebelumnya. Sebenarnya kita juga bisa langsung
memilih ”Add Library” yang merupakan library default pada
NetBeans, kemudian pilih MySQL JDBC Driver. Kedua hal ini
bersifat alternatif saja, sehingga kita bisa memilih salah satu
cara.

5. Setelah kita berhasil menambahkan library tersebut, maka

95
pada group Libraries akan terdapat file mysql connector,
seperti gambar berikut.

Connect and Select (Using MySQL)


Setelah melakukan konfigurasi MySQL dan JDBC MySQL
Connector telah terinstal dengan benar, maka kita baru dapat
menghubungkan antara code Java dengan database MySQL.
Kemudian pada source code, kita akan mencoba melakukan koneksi
dan mengambil isi data dari ”tbl_mhs”.
import java.sql.*;
//import com.mysql.jdbc.Driver;

public class MySQLConnection{


public static void main(String[] args) {
// Test Driver JDBC
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e) {
System.err.println("Error (1): " + e);
}
// Create connection dan select table
try{
Connection c =
DriverManager.getConnection("jdbc:mysql://localhost/absensi"
,"root","rootPWD");
System.out.println("Connection Success");
Statement s = c.createStatement();
ResultSet rs = s.executeQuery("Select * from tbl_mhs");
while(rs.next()) {
System.out.println(rs.getString("NIM"));
}
}
catch(Exception e) {
System.err.println("Error (1): " + e);
}

96
}
}

Keterangan
1. Pertama kali kita harus memberitahukan program mengenai
address pengambilan driver JDBC. Perintah yang digunakan
adalah:
Class.forName("com.mysql.jdbc.Driver");

Alamat driver merupakan string dan bersifat case sensitif.


2. Kemudian kita mempersiapkan koneksi ke database MySQL
yang telah kita buat sebelumnya menggunakan class
Connection.
Connection c = DriverManager.getConnection
("jdbc:mysql://localhost/absensi","root","rootPWD");

String pertama adalah nama letak database yang telah kita


buat, string kedua adalah username database, dan string
ketiga adalah password database untuk mengakses ke dalam
database tersebut.
3. Membuat object yang akan digunakan untuk menerima
perintah SQL menggunakan class Statement.
Statement s = c.createStatement();

4. Menjalankan perintah SQL, seperti mengambil data (SELECT)


menggunakan class ResultSet.
ResultSet rs = s.executeQuery("SELECT * FROM tbl_mhs");

5. Kemudian kita akan menampilkan hasil query. ResultSet


menyimpan data hasil query pada array dinamis. Untuk
memberikan filter data kolom mana yang akan ditampilkan
dapat menggunakan fungsi getString(namaField).

Latihan
1. Buatlah sebuah form dengan menggunakan JFrame form,
dengan ketentuan:

• Semua data pada tbl_mhs ditampilkan pada form


menggunakan component JTable

• Pada form terdapat fungsi insert, update dan delete.

97
• Setiap perintah yang dilakukan (insert, update dan
delete) maka data pada JTable akan menampilkan
perubahan yang dilakukan sehingga data pada JTable dan
pada tbl_mhs selalu sama.

98
Daftar Referensi
Java Software Solutions 6 th Edition
Lewis, John & Loftus, William. 2009. Pearson International
Dasar Pemrograman Java 2
Kadir, Abdul. 2004. Yogyakarta: Penerbit Andi Offset
Tuntunan Pemrograman Java Jilid 3
Purnama, Rangsang. 2005. Jakarta: Prestasi Pustaka
Absolute Java 3rd Editon
Savitch, Walter. 2008. Pearson International
Java History
http://en.wikipedia.org/wiki/Java_(programming_language)
Java2s
http://java2s.com/Tutorial/Java/CatalogJava.htm
Java Generic Wildcard
http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.h
tml

99

Anda mungkin juga menyukai