PEMROGRAMAN JAVA
POLITEKNIK GAJAH
TUNGGAL
2
MODUL I
THREAD
Tujuan
Memahami multithreading dalam perograman Java
1.1. Multitasking
-
Multitasking adalah istilah yang menjelaskan bahwa sebuah komputer dapat menjalankan
beberapa aktifivas secara simultan/bersamaan
Process based multitasking adalah aktifitas aktifitas yang dijalankan bersamaan dan
aktifitas-aktifitas tersebut berbasis sebuah proses/program
Thread adalah suatu bagian program (berupa barisan kode) yang berdiri sendiri tidak
bergantung pada bagian program yang lain dan dapat dijalankan secara simultan
Suatu Thread dapat diistirahatkan tanpa harus menghentikan bagian program yang lain atau
keseluruhan program, karena setiap thread didefinisikan dalam lokasi eksekusi yang
berbeda
Pada saat sebuah program java dijalankan, otomatis ada satu buah thread yang dibuat,
thread ini disebut thread utama (main thread)
Thread utama dalah induk dari thread-thread lain yang ada dalam program tersebut, yang
disebut thread anak (child thread)
Walaupun thread utama dibuat secara otomatis, namun dapat dikontrol oleh objek dari
kelas Thread, yeng terdapat dalam pacakage java.lang.
Untuk melalukan ini, kita harsu memanggil method currentThread() yang didefinisikan
pada kelas Thread
3
class DemoThreadUtama {
public static void main(String[] args)
throws InterruptedException {
// mendapatkan thread yang sedang aktif
Thread tUtama = Thread.currentThread();
// menampilkan informasi tentang thread
System.out.print("Informasi awal: ");
System.out.println(tUtama.toString());
// mengganti nama thread
tUtama.setName("Thread utama");
// menampilkan kembali informasi tentang thread
System.out.print("Informasi setelah diubah namanya: ");
System.out.println(tUtama.toString());
for (int i=0; i<5; i++)
{ System.out.println("Detik ke-" +
(i+1));
Thread.sleep(5000);
}
}
}
1.3. Method-Method Thread
setName(String name)
Method ini berfungsi untuk mengubah nama thread.
getName()
method untuk mendapatkan nama thread
setPriority(int prio)
Method ini berfungsi untuk menentukan prioritas thread.
sleep(long m)
Method yang mengehentikan eksekusi suatu thread sepanjang selang waktu dalam
parameter (dalam satuan milidetik).
getPriority()
Method yang digunakan untuk mengetahui prioritas suatu thread.
suspend()
Menghentikan aktivitas thread untuk sementara sampai method resume dipanggil.
resume()
Method yang digunakan untuk menjalankan kembali aktivitas thread yang dihentikan
sementara oleh method suspend().
isAlive()
Ini adalah method yang digunakan untuk mengetahui apakah suatu method masih
hidup.
start()
Method yang digunakan untuk menjalankan thread.
Method run() disiikan oleh kode untuk proses yang akan dijalankan oleh thread yang
bersangkutan
Setelah kita membuat kelas yang mengimplementasi interface Runnable, buat objek dari
kelas tersebut
Kemudian lewatkan objek tersebut ke dalam konstruktor Thread, bentuk umum sintaksnya
adalah
Thread(Runnable objThread)
Thread(Runnable objThread, String namaThread)
Method start() secara otomatis akan memanggil method run() yang terdapat
dalam kelas yang mengimplementasi interface Runnable
5
class DemoImplementRunnable1 {
public static void main(String[] args) {
// (LANGKAH KE-1)
// membuat objek Runnable
MyRunnable obj = new MyRunnable();
// (LANGKAH KE-2)
// membuat objek Thread dengan melewatkan objek Runnable
Thread t = new Thread(obj);
// (LANGKAH KE-3)
// menjalankan thread
t.start();
System.out.println("Thread utama dieksekusi");
}
}
Contoh lain
class MyRunnable implements Runnable {
private Thread t;
// constructor kelas MyRunnable
MyRunnable() {
t = new Thread(this); // melewatkan objek MyRunnable
t.start();
// menjalankan thread
}
public void run() {
System.out.println("Thread baru dieksekusi");
}
}
class DemoImplementRunnable2 {
public static void main(String[] args)
{ MyRunnable obj = new
MyRunnable();
System.out.println("Thread utama dieksekusi");
}
}
Cara kedua untuk membuat thread adalah dengan membuat kelas yang merupakan turunan
kelas Thread.
6
class DemoExtendsThread {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
System.out.println("Thread utama dieksekusi");
}
}
Thread yang telah dijalankan secara otomatis akan dihentikan ketika semua proses (kode
dalam method run()) telah selesai dieksekusi
Untuk menghentikan thread yang sedang berjalan, gunakan variabel bertipe boolean
class MyThread extends Thread {
// mendeklarasikan variabel boolean
// untuk mengontrol pengulangan
private boolean selesai = false;
public void run() {
int counter = 0;
System.out.println("Thread anak dijalankan");
while (!selesai)
{ System.out.print((++counter) + "
");
}
System.out.println("Thread anak selesai");
}
public void stopThread() {
selesai = true;
}
}
class DemoStopThread {
public static void main(String[] args)
throws InterruptedException
{ System.out.println("Thread utama
dijalankan");
MyThread t = new MyThread();
// menjalankan thread anak
t.start();
// mengistirahatkan thread utama selama 1/40 detik
Thread.sleep(25);
// menghentikan thread anak
t.stopThread(); // JANGAN GUNAKAN: t.stop();
System.out.println("nThread utama selesai");
}
7
Jika kode program tesebut dieksekusi, outputnya adalah:
Dalam sebuah program Java, kita diijinkan untuk memiliki banyak thread
8
sleep(1000);
} else {
System.out.println("Thread kedua selesai...n");
}
}
} catch (InterruptedException ie)
{ System.out.println(ie.getMessage()
);
}
}
}
class DemoMultipleThread {
public static void main(String[] args)
{ MyThread1 t1 = new MyThread1();
t1.start();
MyThread2 t2 = new MyThread2();
t2.start();
}
}
Prioritas thread digunakan oleh scheduler (penjadwal thread) untuk menentukan thread
mana yang seharusnya dieksekusi terlebih dahulu.
Thread dengan prioritas lebih tinggi akan mendapatkan waktu CPU yang lebih
dibandingkan dengan thread yang prioritasnya lebih rendah
9
-
Thread dengan prioritas lebih tinggi dapat mengesampingkan thread dengan prioritas lebih
rendah. Contohnya, apabila terdapat thread dengan prioritas lebih rendah sedang berjalan
dan kemudian thread dengan prioritas lebih tinggi di-resume atau dijalankan ulang (dari
keadaan wait maupun sleep), maka thread dengan prioritas rendah tersebut akan
dikesampingkan
Untuk
menentukan
method
setPriority(),
yang
deklarasinya adalah
final void setPriority(int level)
-
Untuk
memperoleh
informasi
tentang prioritas
method
10
class DemoPrioritasThread {
public static void main(String[] args)
throws InterruptedException {
MyThread t1 = new MyThread("prioritas-tinggi",
Thread.NORM_PRIORITY + 2);
MyThread t2 = new MyThread("prioritas-rendah",
Thread.NORM_PRIORITY - 2);
t1.start();
t2.start();
// mengistirahatkan thread utama selama 5 detik
Thread.sleep(5000);
t1.stop();
t2.stop();
t1.getThread().join();
t2.getThread().join();
System.out.println("Jumlah
t1.getThread().getName()
System.out.println("Jumlah
t2.getThread().getName()
}
}
Terlihat bahwa thread dengan prioritas lebih tinggi mendapatkan jumlah pengulangan yang
lebih banyak
1.9. Method join() dan isAlive()
-
Pada contoh sebelumnya, kita melihat bahwa thread utama dihentikan sebelum thread anak
Pada beberapa kasus, terkadang kita ingin thread utama adalah thread terakhir yang
dihentikan
Untuk itu kita harus memanggil method join() dari semua thread anak
Untuk mengetahui apakah suatu thread masih hidup, gunakan method isAlive()
11
class MyThread implements Runnable {
private Thread t;
private int n;
MyThread(String nama, int n)
{ t = new Thread(this,
nama); this.n = n;
}
public void run() {
try {
for (int i=0; i<n; i++) {
System.out.println("Thread "+t.getName()+": detik ke-"
+(i+1));
Thread.sleep(1000);
}
System.out.println("Thread "+t.getName() + " selesai...");
} catch (InterruptedException ie)
{ System.out.println(ie.getMessage()
);
}
}
public void start() {
t.start();
}
public Thread getThread() {
return t;
}
}
class DemoIsAliveJoin {
public static void main(String[] args)
throws InterruptedException {
System.out.println("Thread utama dijalankann");
MyThread t1 = new MyThread("pertama", 2);
MyThread t2 = new MyThread("kedua", 3);
MyThread t3 = new MyThread("ketiga", 4);
t1.start();
t2.start();
t3.start();
// pada saat thread t1, t2, dan t3 aktif
System.out.println("t1.getThread().isAlive() : "
t1.getThread().isAlive());
System.out.println("t2.getThread().isAlive() : "
t2.getThread().isAlive());
System.out.println("t3.getThread().isAlive() : "
t3.getThread().isAlive());
System.out.println();
// menunggu sampai thread t1, t2, dan t3 selesai
t1.getThread().join();
+
+
+
dieksekusi
12
t2.getThread().join();
t3.getThread().join();
// setelah thread t1, t2, dan t3 selesai
System.out.println();
System.out.println("t1.getThread().isAlive() : " +
t1.getThread().isAlive());
System.out.println("t2.getThread().isAlive() : " +
t2.getThread().isAlive());
System.out.println("t3.getThread().isAlive() : " +
t3.getThread().isAlive());
System.out.println("nThread utama selesai");
}
}
1.10.
-
Sinkronisasi Thread
Thread-thread dalam sebuah program saling membagi ruang memori, artinya thread-thread
tersebut dapat saling berbagi resource
Pada saat dua atau lebih thread mengakses suati resource yang di-share, maka dibutuhkan
suatu cara untuk meyakinkan bahwa resource tersebut hanya
Lock merupakan kunci virtual yang dimiliki oleh obyek. Kunci virtual ini dapat dimiliki
oleh obyek lain yang mengakses obyek pemilik kunci.
Akibatnya adalah : selama obyek A memiliki kunci dari obyek yang diakses ( misalnya
obyek B) , maka obyek C tidak dapat mengakses obyek B.
Obyek C akan terus menunggu sampai obyek A melepaskan kunci obyek B dan obyek B
memiliki kembali kunci tersebut.
13
Untuk menghasilkan sinkronisasi di antara thread, maka teknologi Java menyediakan kata
kunci synchronized yang akan menyebabkan lock / kunci obyek berpindah ke thread yang
mengakses obyek tersebut.
Pada diagram state model tersebut, terdapat tambahan status, yaitu BLOCKED in objects
lock pool. Artinya, ketika ada thread yang mengakses suatu obyek B yang memiliki method
atau blok yang menggunakan kata kunci synchronized, thread lain harus menunggu untuk
mengakses obyek B tersebut. Thread lain tersebut masuk ke dalam status BLOCKED in
objects lock pool.
Ketika thread pemegang lock tersebut mengembalikan kunci kepada obyek B, maka thread
yang sedang menunggu di BLOCKED in objects lock pool mendapatkan kunci obyek B,
dan masuk ke dalam status Runnable. Seperti pada Model I, thread pemegang kunci obyek
B tersebut dipilih oleh scheduler untuk masuk ke status Running.
Singkatnya:
Ketika sebuah method / blok dari sebuah obyek yang menggunakan kata kunci
synchronized diakses oleh sebuah thread, thread lain tidak dapat mengakses methodmethod tersinkronisasi milik obyek tersebut.
14
Ketika sebuah method / blok dari sebuah obyek yang menggunakan kata kunci
synchronized diakses oleh sebuah thread, thread lain masih dapat mengakses methodmethod yang tidak tersinkronisasi milik obyek tersebut.
Sinkronisasi Pada Method
-
Sinkronisasi pada method berarti sinkronisasi dilakukan untuk keseluruhan isi method.
Akibatnya, ketika method tersebut diakses oleh sebuah thread, maka thread lain harus
menunggu sampai method tersebut selesai dieksekusi.
Untuk mendefinisikan sebuah method tersinkronisasi pada kelas, sintaknya adalah sebagai
berikut :
15
class DemoSinkronisasiMethod {
public static void main(String[] args)
throws InterruptedException {
TestKelas tk = new TestKelas();
MyThread t1 = new MyThread(tk, "Contoh");
MyThread t2 = new MyThread(tk, "Sinkronisasi");
MyThread t3 = new MyThread(tk, "Method");
}
}
Output program di atas adalah
Terkadang tidak semua baris pada method perlu disinkronisasi. Mungkin hanya satu atau
dua baris pada method yang dibutuhkan untuk sinkronisasi. Agar bagian dari method saja
yang disinkronisasi, maka sintaknya adalah sebagai berikut :
[modifiers] data_type identifier(arguments) {
//code block 1
synchronized(Object obj){
//code block 2
}
//code block 3
}
public synchronized void batal(String nama){
if(persediaan<MAX){
synchronized(this){
this.persediaan++;
updateOK=true;
}
}
// baris program selanjutnya
}
16
MODUL II
KELAS-KELAS DASAR DI JAVA
Tujuan
-
2.1. Input-output
-
Java menyediakan dukungan terhadap proses Input/Output (I/O) dalam package java.io.
Di dalam package tersebut tersimpan banyak interface dan kelas yang akan memudahkan
programmer melakukan pengambilan dan penyimpanan informasi ke media lain (misalnya
ke suatu file)
2.1.1
Stream
Stream adalah sebuah abstraksi yang dapat memberikan atau mendapatkan informasi.
Stream dapat dihubungkan dengan peralatan fisik yang terdapat dalam sistem I/O, seperti
keyboard, file, layar console, dll.
Cara kerja stream selalu sama, meskipun peralatan yang terhubung dengannya berbeda.
Kode program yang kita tulis akan sama untuk masing-masing peralatan fisik yang
terhubung dengan stream yang bersangkutan
Contohnya, programmer dapat menggunakan method dan kelas yang sama untuk
melakukan penulisan teks, baik ke console maupun ke dalam file
Tipe-tipe Stream:
-
Byte Stream
memberikan atau menyimpan informasi data dalam bentuk byte, misalnya untuk menulis
dan membaca file biner.
Character Stream
digunakan untuk melakukan I/O yang melibatkan data dalam bentuk karakter, misalnya
proses baca/tulis ke file berisi teks.
Kelas-kelas Stream:
-
Stream
didefinisikan
dengan
empat
buah
kelas
abstrak:
InputStream,
Kelas InputStream dan OutputStream adalah kelas abstrak yang merupakan kelas
induk dari kelas-kelas yang termasuk dalam kategori byte stream
Kelas Reader dan Writer adalah kelas abstrak yang merupakan kelas induk dari kelaskelas yang termasuk dalam kategori character stream
17
-
Semua kelas turunan dari InputStream maupun Reader memiliki method read()
untuk membaca data
Semua kelas turunan dari OutputStream maupun Writer memiliki method write()
untuk menulis data
Byte Stream
-
Urutan paling atas dari hirarki tersebut adalah kelas InputStream dan OutputStream
Tabel berikut memperlihatkan beberapa daftar kelas turunan dari kelas InputStream
dan OutputStream
Nama Kelas
Keterangan
BufferedInputStream
BufferedOutputStream
ByteArrayInputStream
DataOutputStream
FileInputStream
FileOutputStream
PipedInputStream
Penyalur input
PipedOutputStream
Penyalur output
PrintStream
Character Stream
-
Urutan paling atas dari hirarki tersebut adalah kelas Reader dan Writer
Tabel berikut memperlihatkan beberapa daftar kelas turunan dari kelas Reader dan Writer
18
Nama Kelas
Keterangan
BufferedReader
BufferedWriter
CharArrayReader
CharArrayWriter
InputStreamReader
OtuputStreamWriter
FileReader
FileWriter
PipedWriter
Penyalur input
PipedReader
Penyalur output
PrintWriter
StringReader
StringWriter
Semua program Java otomatis mengimport package java.lang. Di dalam package ini
didefinisikan sebuah kelas bernama System. Kelas ini mendefinisikan beberapa aspek yang
berkaitan dengan runtime.
Kelas System mendefinisikan tiga variabel stream: in, out, err. Ketiga variabel ini
didefinisikan sebagai public dan static
Dalam Java, input console dilakukan dengan pembacaan terhadap stream System.in
19
-
Hal ini dilakukan untuk membentuk character stream, karena sebenarnya System.in
adalah byte stream
inputReader adalah stream yang akan dihubungkan dengan objek dari kelas
BufferedReader yang dibuat.
Karena Reader adalah kelas abstrak, kita perlu menggunakan kelas turunannya yang
berupa kelas konkrit. Salah satunya adalah InputStreamReader yang dapat
mengonversi byte ke character
Pada konstruktor di atas, is dapat diisi dengan System.in, sehingga untuk membuat objek
BufferedReader yang terhubung dengan keyboard dapat menggunakan kode:
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
Untuk membaca input berupa karakter, gunakan method read() yang terdapat dalam
kelas BufferedReader.
20
-
21
import java.io.*;
class DemoInputNumerik2 {
public static void main(String[] args) throws IOException
{ System.out.print("Masukkan sebuah bilangan riil: ");
String temp;
double bilangan = 0;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
// input data dianggap sebagai string
temp = br.readLine();
try {
// konversi dari string ke floating-point
bilangan = Double.parseDouble(temp);
} catch (NumberFormatException nfe)
{ System.out.println("Data yang dimasukkan bukan
bilangan"); System.exit(1);
}
System.out.println("Bilangan yang dimasukkan " +
"adalah " + bilangan);
}
}
2.1.3.
-
Proses Output
Sejauh ini, untuk menampilkan output ke console, kita menggunakan method print()
dan println()
Untuk menuliskan output ke media lainnya, misalkan file, gunakan method write()
22
PrintWriter mendukung method print() dan println() untuk semua tipe data
Cara pembentukan objek PrintWriter yang dapat digunakan untuk pembentukkan output
adalah:
PrintWriter pw = new PrintWriter(System.out, true)
2.1.4.
-
bertipe
bertipe
bertipe
bertipe
bertipe
double
int
byte
char
string
:
:
:
:
:
"
"
"
"
"
+
+
+
+
+
d);
i);
b);
c);
s);
Pada contoh program berikut ditunjukkan cara untuk membaca data dari sebuah file dan
kemudian menampilkan isi file tersebut ke layar monitor.
import java.io.*;
class DemoBacaFile {
public static void main(String[] args)
{ FileInputStream finput = null;
int data;
// membuka file
23
try {
finput = new FileInputStream("d:/INPUT.TXT");
} catch (FileNotFoundException fnfe)
{ System.out.println("File tidak
ditemukan."); return; // keluar dari method
}
// membaca data dari dalam file
// dan menampilkan hasilnya ke layar console
try {
while ((data = finput.read()) != -1) {
// ketika ditampilkan, data dikonversi ke tipe
char
System.out.print((char) data);
}
} catch (IOException ioe)
{ System.out.println(ioe.getMessage()
); return;
}
// menutup file
try {
finput.close();
} catch (IOException ioe) {}
}
}
-
nBaris
kedua
// membuka file
try {
foutput = new FileOutputStream("d:/OUTPUT.TXT");
} catch (FileNotFoundException fnfe)
{ System.out.println("File tidak dapat
terbentuk."); return; // keluar dari method
}
// menulis data ke dalam file
try {
for (int i=0; i<data.length(); i++) {
// data akan dikonversi per karakter
foutput.write((int) data.charAt(i));
}
} catch (IOException ioe)
{ System.out.println(ioe.getMessage()
); return;
}
// menutup file
nBaris
24
try {
foutput.close();
} catch (IOException ioe) {}
}
}
-
import java.io.*;
class DemoSalinFile {
public static void main(String[] args) {
FileInputStream finput = null;
FileOutputStream foutput = null;
int data;
// membuka file input
try {
finput = new FileInputStream("d:/FILE1.TXT");
} catch (FileNotFoundException fnfe)
{ System.out.println("File input tidak
ditemukan"); return; // keluar dari method
}
// membuka file output
try {
foutput = new FileOutputStream("d:/FILE2.TXT");
} catch (FileNotFoundException fnfe)
{ System.out.println("File output
tidak
terbentuk");
return; // keluar dari method
}
// membaca data dari file input
// dan memasukkannya ke dalam file output
try {
while ((data = finput.read()) != -1) {
foutput.write(data);
}
} catch (IOException ioe) {
System.out.println(ioe.getMessage());
return;
}
try
{ finput.close()
;
foutput.close();
} catch (IOException ioe) {}
}
}
dapat
file lainnya.
25
File myFile;
myFile = new File(myfile.txt);
myFile = new File(MyDocs, myfile.txt);
atau
File myDir = new File(MyDocs);
myFile = new File(myDir, myfile.txt);
Bentuk konstruktor yang digunakan tergantung obyek File lainnya yang akan diakses. Sebagai
contoh, jika hanya menggunakan satu file, maka gunakan bentuk konstruktor yang pertama.
Tetapi, jika menggunakan beberapa file sekaligus dari sebuah direktori, maka akan lebih mudah
jika menggunakan bentuk yang kedua.
Berikut ini method-method untuk pengujian dan pengecekkan kelas File :
1. boolean exists()
Method ini mengembalikan nilai boolean true jika file atau direktori yang dirujuk oleh
obyek File tersedia.
2. boolean isDirectory()
Method ini mengembalikan nilai boolean true jika obyek File merujuk ke sebuah direktori
dan false jika sebaliknya.
3. boolean isFile()
Method ini mengembalikan nilai boolean true jika obyek File merujuk ke sebuah file dan
false jika sebaliknya;
4. boolean canRead()
Method ini mengembalikan nilai boolean true jika proses pembacaan file yang dirujuk oleh
obyek File diizinkan dan false jika sebaliknya. Method ini dapat melemparkan exception
SecurityException jika akses untuk membaca file tidak diizinkan.
5. boolean canWrite()
Method ini mengembalikan nilai boolean true jika proses penulisan file yang dirujuk oleh
obyek File diizinkan dan false jika sebaliknya. Method ini dapat melemparkan exception
SecurityException jika akses untuk menulis ke file tidak diizinkan.
Berikut ini Method untuk mengakses obyek File
1. String getName()
Mengembalikan obyek String yang berisikan nama file tanpa path nya. Untuk sebuah
obyek File yang merepresentasikan sebuah
direktorinya saja.
26
2. String getPath()
Mengembalikan obyek String yang berisikan path ke file tersebut termasuk nama file atau
direktorinya.
3. String getAbsolutePath()
Mengembalikan obyek String yang berisikan absolute path dari file atau direktori yang
dirujuk oleh obyek File.
4. String getParent()
Mengembalikan obyek String yang berisikan nama direktori induk (parent directory) dari
file atau direktori yang di-refer oleh obyek File.
5. String length()
Mengembalikan nilai (dalam bentuk long) berupa panjang byte dari obyek File yang
bersangkutan.
Berikut ini Method untuk memodfikasi obyek File :
1. boolean renameTo(File newName)
Method ini digunakan untuk mengubah nama obyek File menjadi newName.
2. boolean mkdir()
Method ini membuat sebuah direktori yang direpresentasikan oleh obyek File.
3. boolean delete()
menghapus file atau direktori yang dirujuk oleh obyek File. Jika proses penghapusan
berhasil, method ini akan mengembalikan nila true.
Kode program berikut ini membaca file teks dan mencetak setiap baris ke output standar:
Contoh
import java.io.*;
public class ReadFile {
public static void main(String[] args) {
File file = new File("D:/work/ngaco.txt");
try {
//buat sebuah buffered reader untuk baca tiap baris file
BufferedReader in =
new BufferedReader(new FileReader(file));
String s = in.readLine();
while(s != null)
{ System.out.println("read: " +
s); s = in.readLine();
}
in.close();
} catch(FileNotFoundException e1) {
//if this file doesn't exist
System.err.println("file not found: " + file);
} catch(IOException e2) {
//catch any other IO exception
e2.printStackTrace();
}
}
}
27
Pada baris ke-4, dibuat sebuah obyek File dengan menggunakan input dari argumen command
line program. Pada baris ke-9, dibuat sebuah buffered reader yang membungkus sebuah
FileReader. Kode pada baris ini (konstruktor FileReader) akan melemparkan exception
FileNotFoundException jika file
tidak berhasil ditemukan. Blok pada
pengulangan while
membaca setiap baris teks dalam BufferedReader dan mencetaknya ke output
standar. Selanjutnya, BufferedReader ditutup, yang juga akan menutup FileReader.
Kode penanganan exception akan menangkap exception FileNotFoundException
yang dilempar oleh konstruktor FileReader. Beberapa exception I/O lainnya ditulis
untuk menangani exception yang mungkin saja dilempar oleh method readLine dan
close.
Contoh program berikut akan membaca input dari keyboard dan memasukkannya ke
dalam file.
Contoh
import java.io.*;
public class WriteFile{
public static void main(String[] args) {
File file = new File("D:/work/ngaco.txt");
try {
BufferedReader in =
new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new FileWriter(file));
String s;
System.out.print("Masukkan teks di sini");
System.out.println("type ctrl-d
(or
ctrl-z)
to stop.");
Seperti halnya pada contoh sebelumnya, pada Contoh ini dibuat sebuah obyek File berdasarkan argumen
command line. Selanjutnya, dibuat sebuah BufferedReader untuk input standar. Program juga membuat
sebuah PrintWriter yang membungkus sebuah FileWriter untuk menuliskan teks ke suatu file.
Selanjutnya, Penggalan kode di atas memberikan pesan kepada pengguna untuk memasukkan teks dan
mengetikkan Ctrl-D untuk mengakhiri program. Selanjutnya, program menuliskan teks input ke dalam
file. Akhirnya, input dan output stream ditutup.
28
Kode di atas akan membuat sebuah obyek StringBuffer yang memiliki kapasitas 50 karakter.
Kode di atas akan membuat referensi obyek bertipe StringBuffer sb3 dan menginisialisasinya
dengan string hello world.
Berikut ini merupakan method-method yang digunakan untuk memodifikasi obyek StringBuffer.
29
Kelas Wrapper
30
Data Primitif dan Kelas Wrapper yang Sejenis Beserta Konstruktornya
TIPE DATA
PRIMITIF
KELAS
WRAPPER
ARGUMEN KONSTRUKTOR
boolean
Boolean
byte
Byte
char
Character
char
short
Short
int
Integer
long
Long
float
Float
double
Double
Obyek wrapper bersifat immutable, yang berarti bahwa sekali diberikan nilai pada sebuah obyek
wrapper, nilainya tidak dapat diubah.
Semua kelas wrapper, (kecuali Character), menyediakan dua buah konstruktor: satu konstruktor
menggunakan nilai primitif yang bersesuaian, dan konstruktor yang lain menggunakan String yang
merupakan representasi dari data primitif yang akan dibungkus di dalam kelas wrapper.
atau
Method statik valueOf() yang disediakan di sebagian besar kelas wrapper (kecuali kelas wrapper
Character) memberikan cara lain untuk membuat obyek wrapper. Method ini menggunakan
String yang merepresentasikan data primitif yang bersesuaian sebagai argumen pertama, dan
argumen kedua (jika ada) sebagai basis dari nilai pada argumen pertama. Sebagai contoh:
31
Integer i2 = Integer.valueOf(100);
Integer i3 = Integer.valueOf(101011, 2);
atau
Float f2 = Float.valueOf(3.14f);
Berikut ini method yang biasa digunakan dalam kelas wrapper untuk mengkonversi suatu nilai.
xxxValue()
Ketika ingin mengubah obyek wrapper ke dalam data primitif, dapat digunakan salah satu dari method
xxxValue() ini. Semua method ini tidak menggunakan argumen.
Tabel 16.3
Tabel Method dalam Kelas Wrapper
Method
s = static
Boolean
n = NFE exception
byteValue
doubleValue
floatValue
intValue
longValue
shortValue
parseXxx s,n
parseXxx s,n
(with radix)
Byte
Double
Float
Integer
Long
Float
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
valueOf s,n
valueOf s,n
(with radix)
x
x
toString
toString s
(primitive)
toString s
(primitive, radix)
x
x
Character
Sebagai contoh :
32
atau
toString()
Setiap kelas wrapper memiliki method toString() yang tidak memiliki argumen dan tidak statik.
Method ini mengembalikan nilai berupa obyek String yang merepresentasikan nilai primitif yang
dibungkus oleh kelas wrapper-nya. Sebagai contoh :
Selain itu, semua kelas wrapper yang bertipe numerik mempunyai versi overloaded dari method
toString() ini. Masing-masing method tersebut mengambil argumen berupa tipe numerik yang
bersesuaian (Double.toString() mengambill nilai double, Long.toString() mengambil
nilai long, dan sebagainya). Sebagai contoh :
33
Kelas wrapper Integer dan Long memiliki bentuk ketiga dari method toString(). Method ini
bertipe statik, argumen pertamanya adalah nilai primitif yang bersesuaian, dan argumen keduanya
merupakan basis. Method ini mengembalikan nilai berupa String yang merepresentasikan nilai
primitif dalam bentuk basis yang sesuai dengan argumen kedua nya. Sebagai contoh :
2.5
Kelas Koleksi
Koleksi merupakan obyek yang merepresentasikan sekumpulan obyek. Obyek yang berada di dalam
sebuah koleksi disebut elemen. Koleksi biasanya berkaitan dengan beragam tipe obyek yang
kesemuanya merupakan turunan dari tipe obyek tertentu.
Collection merupakan sekumpulan obyek yang disebut sebagai elemen. Implementasi
dari Collection ini akan menentukan apakah ada aturan mengenai ordering tertentu dan
apakah duplikasi elemen diperbolehkan di dalamnya.
Set merupakan sebuah koleksi yang tidak memiliki aturan unordered di mana di dalamnya
tidak boleh ada duplikasi elemen.
List merupakan sebuah koleksi yang memiliki aturan ordered
duplikasi elemen diperbolehkan.
di mana di dalamnya
Semua jenis koleksi memiliki referensi ke obyek-obyek dengan tipe Object. Hal ini memungkinkan
semua jenis obyek untuk disimpan di dalam koleksi. Implikasi dari elemen dalam koleksi yang bertipe
Object adalah harus digunakan proses casting yang benar ketika mengambil sebuah elemen dari
dalam koleksi.
<<interface>>
Collection
+
+
+
+
+
+
<<interface>>
List
<<interface>>
Set
HashSet
+
+
+
+
+
+
ArrayList
LinkedList
Kelas HashSet menyediakan implementasi dari interface Set sementara kelas ArrayList dan
LinkedList menyediakan implementasi bagi interface List.
34
2.5.1 Set
Dalam contoh kode berikut ini, dideklarasikan sebuah variabel (set) dengan tipe Set. Lalu diinisialisasi
variabel ini dengan sebuah obyek HashSet. Selanjutnya ditambahkan beberapa elemen ke dalamnya
dan mencetak isi dari variabel set ke output standar.
Contoh 16.9
import java.util.*;
2.5.2 List
Dalam contoh kode berikut ini, dideklarasikan sebuah variabel (list) dengan tipe List. Selanjutnya,
variabel ini diinisialisasi dengan sebuah obyek ArrayList. Selanjutnya ditambahkan beberapa
elemen ke dalamnya dan mencetak isi dari variabel list ke output standar. Berbeda dengan contoh
sebelumnya, pada contoh ini berhasil dilakukan penambahan elemen yang terduplikasi.
Contoh 16.10
import java.util.*;
public class ListExample {
public static void main(String[] args)
{ List list = new ArrayList();
list.add("one");
list.add("second");
list.add("3rd");
list.add(new Integer(4));
35
list.add(new Float(5.0F));
list.add("second");
//duplikasi ditambahkan
list.add(new Integer(4));
//duplikasi ditambahkan
System.out.println(list);
}
}
2.5.3 Iterator
Sebuah koleksi dapat diiterasi dengan menggunakan iterator. Interface Iterator memungkinkan
untuk melakukan iterasi secara forward. Pada kasus iterasi di dalam sebuah obyek Set, langkah
iterasinya tidak dapat ditentukan sementara langkah iterasi pada sebuah list adalah bergerak maju.
Sebuah obyek List juga mendukung penggunaan ListIterator yang memungkinkan proses iterasi
secara backward. Kode program di bawah ini menggambarkan penggunaan iterator:
<<interface>>
Iterator
+
+
hasNext() :
boolean
next() :
Object
+
remove()
<<interface>>
ListIterator
+
+
+
+
hasPrevious() : boolean
previous() : Object
add(element : Object)
set(element : Object)
Method remove digunakan untuk menghapus item di dalam sebuah iterasi. Jika salah satu koleksi tidak
mendukung proses penghapusan ini, maka exception UnsupportedOperationException akan
dilemparkan.
36
ListIterator bergerak satu arah, yaitu begerak maju dengan menggunakan method next() atau
mundur dengan menggunakan method previous(). Jika menggunakan method previous()
setelah menggunakan method next() akan diperoleh elemen sebelum memanggil method next().
Begitu juga sebaliknya.
Method set mengubah elemen yang ditunjuk oleh kursor iterator. Method add menambah elemen
baru ke dalam koleksi pada posisi sebelum kursor iterator. Dengan demikian, jika memanggil method
previous seteleh pemanggilan method add, akan diperoleh elemen yang baru dimasukkan ke dalam
koleksi tersebut. Jika proses penyetingan dan penambahan elemen tidak didukung oleh koleksi yang
bersangkutan, maka UnsupportedOperationException akan dilemparkan.
37
MODUL III
GRAPHICAL USER INTERFACE
Tujuan
-
6.1
antarmuka. Pada modul kali ini kita akan mempelajari antarmuka grafis yang dikenal dengan
nama Graphical User Interface (GUI). GUI merupakan antar muka grafis yang memfasilitasi
interaksi antara pengguna dengan program aplikasi. Berikut adalah contoh GUI.
Salah satu komponen dalam bahasa pemrograman Java untuk membangun GUI adalah
Swing. Komponen ini didefinisikan di dalam paket javax.swing. Swing diturunkan dari
Abstract Windowing Toolkit dalam paket java.awt. Hirarki dari komponen Swing adalah
sebagai berikut
java.lang.Object
java.awt.Component
java.awt.Container
java.swing.JComponent
38
JComponent adalah superclass dari semua komponen Swing. Sebagian besar fungsionalitas
komponen diturunkan dari superclass ini.
Beberapa komponen utama dalam GUI adalah:
1.
2. Canvas.: merupakan komponen GUI yang berfungsi untuk menampilkan gambar atau
untuk membuat program grafis. Dengan canvas, kita bisa menggambar berbagai bentuk
seperti lingkaran, segitiga, dll.
3. User Interface (UI) components: contohnya adalah buttons, list, simple popup menus,
check boxes, text fields, dan elemen lain
4. Komponen pembentuk window: seperti frames, menu bars, windows, dan dialog boxes.
6.2 Komponen-komponen Dasar User Interface dengan Swing
Berikut adalah beberapa komponen dasar antarmuka pengguna (user interface) yang
disediakan oleh Swing:
1. Top level containers: adalah container dasar untuk meletakkan komponen-komponen lain.
Contohnya adalah JFrame, JDialog, dll.
2. Intermediate level containers: merupakan container perantara. Umumnya digunakan hanya
untuk meletakkan atau mengelompokkan komponen-komponen yang digunakan, baik itu
container atau berupa atomic component. Contoh dari Intermediate level container adalah
JPanel (panel).
3. Atomic component: merupakan komponen yang memiliki fungsi khusus. Umumnya
pengguna langsusng berinteraksi dengan komponen ini. Contohnya adalah JButton
(tombol), JLabel (label), JTextField, JTextArea (area untuk menulis teks), dll.
Sekarang kita akan berkenalan dengan Top Level Container, yaitu JFrame. Cobalah
jalankan kode program di bawah:
import javax.swing.*;
public class FrameSederhana{
public static void main(String[]
args){ JFrame f1;
f1 = new JFrame("Ini Frame lho...");
f1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
; f1.setSize(500,500);
f1.setVisible(true);
}
39
Keluaran kode program di atas adalah frame berikut:
atau
JFrame(String
kelas
JFrame
NamaFrame).
Salah
satu
method
yang
sering
digunakan
di
adalah
40
41
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class DemoBorderLayout extends JFrame implements ActionListener{
private JButton tombol[];
private String names[]={"Hilangkan North","Hilangkan South",
"Hilangkan East","Hilangkan West",
"Hilangkan Center"};
private BorderLayout lout;
public DemoBorderLayout(){
super ("Ini Adalah Contoh Border Layout");
Container c = getContentPane();
lout = new BorderLayout (10,10);
c.setLayout(lout);
tombol = new JButton[names.length];
for (int i=0 ; i < names.length;
i++){ tombol[i] = new
JButton(names[i]);
tombol[i].addActionListener(this);
}
c.add(tombol[0], BorderLayout.NORTH);
c.add(tombol[1], BorderLayout.SOUTH);
c.add(tombol[2], BorderLayout.EAST);
c.add(tombol[3], BorderLayout.WEST);
c.add(tombol[4], BorderLayout.CENTER);
setSize (500,300);
}
public void actionPerformed(ActionEvent e){
for(int i=0; i<button.length;i++){
if(e.getSource()==button[i])
button[i].setVisible(false); else
button[i].setVisible(true);
layout.layoutContainer(getContentPane())
;
}
}
public static void main(String[] args)
{ DemoBorderLayout dbl = new DemoBorderLayout();
dbl.setVisible(true);
dbl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
;
}
}
42
a. setAlignment(position_CONSTANT): adalah method untuk menentukan posisi
layout.
Nilai
positition_CONSTANT
dapat
berupa
FlowLayout.LEFT,
43
6.3.3 Box Layout
Layout jenis ini meletakkan komponen-komponen dalam satu baris atau satu kolom
saja.
Pelajari contoh berikut.
import javax.swing.*;
import java.awt.*;
public class ContohBoxLayout extends JFrame{
public ContohBoxLayout(){
super("Contoh Box Layout Dalam Satu Baris");
Container c = getContentPane();
Box box = new Box(BoxLayout.X_AXIS);
JTextArea t1 = new JTextArea("Praktikum java",10,15);
JButton b1 = new JButton("Tombol 1");
JButton b2 = new JButton("Tombol 2");
JTextArea t2 = new JTextArea("Ilmu komputasi",10,15);
box.add(new JScrollPane(t1));
box.add(b1);
box.add(b2);
box.add(new JScrollPane(t2));
c.add(box);
}
public static void main(String[]
args){ ContohBoxLayout cbl = new
ContohBoxLayout(); cbl.setSize(300, 300);
cbl.setVisible(true);
cbl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Keluarannya adalah
44
6.3.4 Card Layout
Card Layout menampilkan container-container/panel-panel seperti tumpukan kartu.
Hanya satu container yang akan tampil untuk satu waktu. Pelajari kode berikut:
import javax.swing.*;
import java.awt.*;
public class TestCardLayout extends
JFrame{ JPanel p1;
JPanel p2;
JRadioButton pil1, pil2, pil3;
ButtonGroup radioGroup;
JTextArea g;
public TestCardLayout(){
super("Uji Coba Card Layout");
p1 = new JPanel();
p2 = new JPanel();
pil1 = new JRadioButton("Pilihan 1",true);
pil2 = new JRadioButton("Pilihan 2",false);
pil3 = new JRadioButton("Pilihan 3",false);
p1.add(pil1);
p1.add(pil2);
p1.add(pil3);
radioGroup = new ButtonGroup();
radioGroup.add(pil1);
radioGroup.add(pil2);
radioGroup.add(pil3);
g = new JTextArea("text area");
p2.add(g);
JTabbedPane tab = new JTabbedPane();
tab.add(p1,"Tab dengan Radio Button");
tab.add(p2,"Tab dengan Text Area");
Container c = getContentPane();
c.add(tab, BorderLayout.NORTH);
}
public static void main (String[] args){ TestCardLayout
tcl = new TestCardLayout();
tcl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
; tcl.setSize(500,100);
tcl.setVisible(true);
}
}
45
6.3.5 Grid Layout
Grid layout merupakan layout manager berbentuk grid. Semua komponen dalam layout
ini memiliki ukuran yang sama. Konstruktor GridLayout adalah sebagai berikut.
a. GridLayout(rows, columns, hGap, vGap). Konstruktor ini mendefinisikan
jumlah baris, kolom, dan ukuran gap horisontal/vertikal antar elemen dalam pixel.
b. GridLayout(rows, columns). Sama halnya dengan konstruktor pertama, namun
dengan nilai default hGap dan vGap sama dengan 0.
Pelajari kode program berikut:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class GridLayoutTest extends JFrame{
private JButton tombol[];
private String m[] = {"Satu","Dua","Tiga","Empat","Lima","Enam"};
private Container c;
private GridLayout g;
public
GridLayoutTest(){ super("Demonst
rasi GridLayout"); g = new
GridLayout(2,3,5,5);
c = getContentPane();
c.setLayout(g);
tombol = new JButton[names.length];
for(int i = 0; i<names.length;i++){
tombol[i] = new JButton(m[i]);
c.add(button[i]);
}
setSize(300,300);
show();
}
public static void main(String[] args)
{ GridLayoutTest glt = new
GridLayoutTest(); glt.addWindowListener(
new WindowAdapter(){
public void windowsClosing(WindowEvent
e){ System.exit(0);
}
});
}
}
46
Output program tersebut adalah tampilan berikut
47
7. Definisikan Instance variable anchor ke NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH,
SOUTHWEST, WEST, NORTHWEST, atau CENTER (nilai default).
8. Masukkan komponen dan GridBagConstraints ke method setConstraints milik
kelas GridBagLayout.
gbLayout.setConstraints(c, gbConstraints);
9. Setelah constraints ditentukan, tambahkan komponen ke ContentPane.
container.add(c);
Untuk lebih memahami penggunaan GridBagLayout, pelajari contoh kode program berikut
ini.
import javax.swing.*;
import java.awt.*;
public class UjiGbl{ JFrame
f; GridBagLayout gbl;
GridBagConstraints c;
public UjiGbl(){
f = new JFrame("Contoh GridBagLayout");
gbl = new GridBagLayout();
c = new GridBagConstraints();
f.getContentPane().setLayout(gbl);
c.fill =
GridBagConstraints.HORIZONTAL;
JButton j1 = new JButton(" 1 ");
c.weightx = 2;//ukuran ruang horizontal
c.gridx = 0; // menempati kolom 0
c.gridy = 0; // menempati baris 0
gbl.setConstraints(j1,c);
f.getContentPane().add(j1);
JButton j2 = new JButton(" 2 ");
c.gridx = 1; // menempati kolom 1
c.gridy = 0; // menempati baris 0
gbl.setConstraints(j2,c);
f.getContentPane().add(j2);
JButton j3 = new JButton(" 3 ");
c.ipady = 30;//tingginya ditambah
c.gridwidth = 2;// tombol menempati dua kolom
c.gridx = 0; // menempati kolom 0
c.gridy = 1; // menempati baris 1
gbl.setConstraints(j3,c);
f.getContentPane().add(j3);
JButton j4 = new JButton(" 4 ");
c.ipady = 50;//tingginya ditambah
c.gridwidth = 1;// tombol menempati satu kolom
c.gridx = 0; // menempati kolom 0
c.gridy = 2; // menempati baris 2
gbl.setConstraints(j4,c);
f.getContentPane().add(j4);
JButton j5 = new JButton(" 5 ");
c.ipady = 0;//tingginya normal
c.gridwidth = 1;// tombol menempati satu kolom
c.gridx = 1; // menempati kolom 1
c.gridy = 2; // menempati baris 2
c.anchor = GridBagConstraints.SOUTH;
48
gbl.setConstraints(j5,c);
f.getContentPane().add(j5);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
public static void main(String[]
args){ UjiGbl ugbl = new
UjiGbl();
}
}
49
50
2. InputEvent: turunan dari kelas ComponentEvent dan Abstract root class Event
untuk semua komponen input.
3. KeyEvent: turunan dari kelas InputEvent, dijalankan saat sebuah key pada keyboard
ditekan, dilepas, atau diketikkan.
4. ItemEvent: turunan dari kelas AWTEvent, dijalankan ketika sebuah item dipilih seperti
pada combo box dan list.
5. ActionEvent: turunan dari kelas AWTEvent, dijalankan ketika sebuah tombol ditekan,
melakukan double click pada daftar item, atau memilih menu.
6. MouseEvent: turunan dari kelas InputEvent, dijalankan ketika pengguna melakukan
sesuatu terhadap mouse, seperti, ditekan, dilepas, diklik, masuk atau keluar window, di
drag, dll.
7. TextEvent: turunan dari kelas AWTEvent, dijalankan ketika sebuah nilai text berubah
8. WindowEvent: turunan dari kelas ComponentEvent, dijalankan ketika pengguna
melakukan sesuatu terhadap window, seperti dibuka, ditutup, diaktifkan, atau dinonaktifkan.
Event Listener adalah kelas yang mengimplemetasi interface Listener. Beberapa event
listener yang sering digunakan adalah:
1. ActionListener : listener yang bereaksi jika terjadi event pada mouse atau keyboard.
2. MouseListener: listener yang bereaksi atas event yang terjadi pada mouse.
3. MouseMotionListener: menyediakan beberapa method untuk memantau perubahan
mouse seperti drag atau perpindahan mouse.
4. WindowListener: listener yang bereaksi atas event yang terjadi pada window.
Untuk lebih jelasnya, pelajari dan jalankan kode program berikut:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class EventHandling{ private
JButton b1, b2; private
JTextField t1, t2; private
JPanel panel1,panel2; private
JLabel l1, l2;
private JFrame f;
private double a, b, c;
private String konv1 = "Suhu dalam Celcius adalah...";
private String konv2 = "Suhu dalam Fahrenheit adalah...";
public EventHandling(){
f = new JFrame("Konversi Suhu");
b1 = new JButton("Konversi ke Fahrenheit");
b2 = new JButton("Konversi ke Celcius");
51
l1
l2
t1
t2
=
=
=
=
new
new
new
new
}
public void
hitungSuhu(){ panel1 =
new JPanel(); panel2 =
new JPanel();
b1.addActionListener(new FahrenheitHandler());
b2.addActionListener(new CelciusHandler());
panel1.add(l1);
panel1.add(t1);
panel1.add(b1);
panel2.add(l2);
panel2.add(t2);
panel2.add(b2);
JTabbedPane tab = new JTabbedPane();
tab.add(panel1,"Celcius ke Fahrenheit");
tab.add(panel2,"Fahrenheit ke Celcius");
f.getContentPane().add(tab, BorderLayout.NORTH);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
; f.setSize(600,100);
f.setVisible(true);
}
private class FahrenheitHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
try{
a = Double.parseDouble(t1.getText()); b = a*1.8+32;
JOptionPane.showConfirmDialog(null,konv2+b,"Hasil",
JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)
;
}catch(Exception j){
JOptionPane.showConfirmDialog(null,"Masukkan Angka!","Error",
JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)
;
}
}
}
private class CelciusHandler implements ActionListener{
public void actionPerformed(ActionEvent e){
try{
a = Double.parseDouble(t2.getText());
b = (a-32)/1.8;
JOptionPane.showConfirmDialog(null,konv1+b,"Hasil",
JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)
;
}catch(Exception
j){ JOptionPane.showConfirmDialog(null,"Masukkan
Angka!","Error",
JOptionPane.OK_CANCEL_OPTION,JOptionPane.INFORMATION_MESSAGE)
;
}
}
}
public static void main(String[] args){
EventHandling eh = new EventHandling();
eh.hitungSuhu();
}
}
52
Hasil dari kode di atas adalah program untuk mengkonversi suhu dengan tampilan berikut:
Latihan
Buatlah program berbasis GUI yang menerima inputan dua buah bilangan dan dapat melakukan
operasi penjumlahan, pengurangan, perkalian, dan pembagian dua bilangan tersebut, lalu
menampilkan hasilnya!
53
MODUL IV
NETBEANS DAN JAVA DATABASE CONNECTION
Tujuan
-
Memahami konsep Java Database Connection dan Java Applet, dan mampu
mengimplementasikannya
7.1
Netbeans
Netbeans adalah suatu perangkat lunak yang mempunyai fungsi sebagai platform
framework Java untuk aplikasi desktop dan sebagai integrated development environment (IDE)
untuk membangun aplikasi yang menggunakan java, javaScript, PHP, C, C++, dan lain-lain.
Netbeans dapat diunduh secara gratis dari website www.netbeans.org. Pada praktikum kali ini
digunakan Netbeans IDE 6.9.1 dan JDK 1.6.0_22.
Dalam netbeans, semua perancangan dan pemrograman dibuat dalam kerangka Project.
Project merupakan sekumpulan file yang dikelompokkan di dalam suatu kesatuan. Untuk
mennguanakan Netbeans dalam pemrograman Java kita buat dulu project. Langkah-langkahnya
adalah:
1. Buka netbeans
2. Lalu klik menu file > new project
3. Setelah kotak dialog new project terbuka, pada kolom categories pilih Java, lalu pada
kolom projects pilih Java Application. Kemudian klik next.
54
Project otomatis
telah memiliki main
class dengan nama
yang sama dengan
55
5. Setelah klik Finish, akan tampil tampilan berikut
Jendela kiri atas adalah project view, jendela kiri bawah adalah members view, jendela
kanan atas adalah work area yaitu tempat kita mengetikkan kode program Java, dan jendela
kanan bawah adalah description
running program.
6. Jika kita ingin membuat kelas caranya adalah klik kanan pada package aplikasijava, lalu
pilih new, kemudian pilih java class, seperti pada gambar berikut
7. Setelah itu akan muncul jendela seperti dibawah. Ubah class name sesuai nama kelas yang
anda inginkan. Pada contoh di bawah, nama kelasnya adalah Mahasiswa.
56
: Ali Kobra
NIM
: 1500661
Fakultas
: Sains
57
7.1.1
Langkah pertama, pada jendela project view, klik kanan pada project AplikasiJava, lalu pilih
menu > Java Package. Perhatikan gambar di bawah
Buat Package baru dengan nama AplikasiGUI. Setelah package terbentuk, klik kanan pada
nama package, lalu pilih new > JFrameForm seperti pada gambar berikut
Buat kelas GUI yang bernama FormIsian. Tampilan di Netbeans akan menjadi seperti
gambar berikut
58
Untuk memulai membuat interface, drag komponen Label dari Swing Containers ke dalam
work area. Lalu drag komponen-komponen lain seperti Text Field, Button, dan Text Area
sehingga terbentuk GUI seperti gambar di bawah
Setelah membuat kelas GUI, kita akan membuat action dari tombol masukkan. Untuk
menyisispkan action, klik kanan pada tombol masukkan, lalu pilih Events > Action >
actionPerformed. Maka akan muncul jendela berikut
59
Di jendela inilah kita akan menuliskan kode program action dari tombol Masukkan. Di dalam
blok method jButton1ActionPerformed(), tuliskan kode berikut:
Compile dan run kelas FormIsian.java, maka akan keluar tampilan GUI berikut:
60
7.2
Connectivity (JDBC)
dalam
java yang
menghubungkan aplikasi yang dibangun dengan menggunakan bahasa Java dengan database.
JDBC adalah versi ODBC yang dibuat oleh Sun Microsystem. JDBC dibangun dengan Java
API dapat digunakan untuk lintas platform dan didasarkan pada X/Open SQL Level Interface.
Dengan menggunakan JDBC API, database dari vendor-vendor ternama seperti Oracle,
Sysbase, dan lain-lain dapat diakses. Kita dapat melakukan pengiriman perintah-perintah SQL
RDBMS. Kelas-kelas serta interface-interface JDBC API dapat diakses dalam package java.sql
(core API) atau javax.sql(standard extension API).
Untuk dapat mengakses database di server kita membutuhkan driver. Setiap server dari
vendor yang berbeda mempunyai driver yang berbeda-beda. Driver dapat diunduh di alamat
http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
Pada Netbeans 6.9.1 sudah terdapat beberapa driver yang dapat digunakan langsung. Di
antaranya ialah Java DB, MySQL, dan PostgreSQL. Untuk menggunakannya, tinggal klik
kanan pada folder library pada project yang dibuat, lulu pilih driver yang akan kita pakai.
Nama driver berbeda-beda untuk setiap database yang digunakan. Berikut adalah namanama driver untuk database:
-
Sintaks yang digunakan untuk koneksi ke data base menggunakan URL adalah
Connection koneksi = DriverManager.getConnection(nama_URL,userID,password)
7.2.1
Menggunakan Database
Kelas pada Java yang digunakan untuk mengeksekusi suatu query adalah Statement.
Kelas ini digunakan setelah menginisialisasi variabel koneksi pada Connection. Misalkan
variabel koneksinya adalah koneksi, maka
Statement stm = koneksi.createStatement();
Suatu query diakhiri dengan cara menutup variabel statement yang sudah diinisialisasi.
Misalkan variabel statementnya adalah stm, maka sintaks untuk menutup variabel statement
tersebiut adalah stm.close().
61
Setelah variabel statement selesai diinisialisasi, selanjutnya kita inisialisasi variabel
ResultSet yang akan digunakan untuk menyimpan suatu baris record pada database.
Artinya, variabel ini adalah pointer yang akan menunjuk suatu baris pada table. Sintaksnya
adalah
ResultSet variabelSet;
Untuk mengakhiri koneksi ke database gunakan sintaks berikut (misalkan nama
variabel koneksinya adalah koneksi)
Koneksi.close()
7.2.2
Contoh kasus
Mari kita lihat contoh kasus penggunaan database. Database yang akan digunakan pada
praktikum kali ini adalah Oracle Database 10g Express Edition yang bisa diunduh di alamat:
http://www.oracle.com/technetwork/database/express-edition/downloads/102xewinsoft090667.html
Ada tiga versi untuk oracle express edition, untuk Windows formatnya EXE, untuk
Linux turunan Debian Formatnya DEB, untuk Linux turunan Redhat formatnya RPM. Di
praktikum ini akan digunakan untuk versi Windows.
Berikut langkah-langkah untuk menginstal Oracle Database 10g Express Edition. Buka
file installernya, setelah itu tunggu sampai proses selesai :
62
Setelah persiapan instalalsi selesai, maka akan keluar dialog ini :
63
Setelah itu tentukan lokasi untuk tempat file instalasi Oracle XE tersebut, setelah itu klik next :
Ketikkan password yang anda inginkan sebagai password untuk user, setelah itu klik next :
Gambar di atas adalah tampilan hasil instalasi, dan jangan lupa dicatat untuk portnya, setelah
itu klik INSTALL :
64
Setelah selesai ceklis Launch the database homepage dan klik finish, maka akan keluar
browser yang membuat homepage database oracle express edition :
Setelah itu login menggunakan user SYSTEM dan password yang tadi dimasukkan saat proses
instalasi. Selesai.
65
Sekarang login ke Oracle XE lewat menu :
Setelah browsernya tampil, masukkan username SYSTEM dan password sesuai dengan
password yang anda buat pada saat instalasi :
Setelah itu masuk ke bagian ADMINISTRATOR > DATABASE USERS > CREATE
USER :
Setelah itu buat user baru, otomatis pula akan terbuat schema baru :
66
Setelah selesai, tekan tombol CREATE , dan sekarang kita sudah berhasil membuat user
sekaligus schema baru di Oracle XE dengan nama schema belajar. Sekarang anda bisa login
pada awal halaman website Oracle XE tadi dengan user belajar dan password yang anda
masukkan.
Setelah itu anda log out, lalu coba login lagi dengan username belajar dan password
yang anda buat tadi.
67
Setelah masuk, pilih object browser.
68
Lalu pilih Table
Kemudian pada menu Columns. Beri nama tabel database yang akan kita buat. Misalkan nama
database-nya adalah MAHASISWA. Maka ketikkan MAHASISWA pada kolom Table Name.
Selanjutnya beri nama kolom pada Column Name. Isikan nama kolomnya yaitu nama,
Nim, dan fakultas. Tipe data diatur pada menu type. Masukkan VARCHAR2 sebagai tipe
datanya. Lalu pada Scale kita bisa mengatur panjang maksimum kolom yang kita buat.
Misalkan untuk kolom nama panjang maksimumnya 25, kolom Nim panjang
maksimumnya 15, dan kolom fakultas panjang maksimumnya 25.
69
Selanjutnya pada menu Primary key kita pilih Nim sebagai primary key. Ini akan
mengakibatkan Nim tertentu hanya bisa dimiliki oleh satu orang (unik).
Selanjutnya menu Foreign Key bisa dilewati. Menu constraints juga bisa dilewati, karena
dengan memilih primary key otomatis akan terbentuk constraints. Lalu masuk ke menu
confirm. Akan tampil tampilan berikut
Setelah itu, klik tombol Create. Maka akan muncul tampilan yang memperlihatkan tabel
database MAHASISWA
70
Sekarang kita lakukan setting Oracle di Netbeans. Tapi sebelumnya anda harus punya
driver oraclenya terlebih dahulu. Tapi tak perlu khawatir karena waktu anda menginstall oracle
xe,
otomatis
driver
nya
ikut
terinstal.
Coba
lihat
di
folder
Setelah itu klik kanan treeitem Drivers lalu pilih New Driver :
71
Setelah keluar dialog New JDBC Driver, tinggal klik tombol Add, lalu masukkan file
ojdbc14.jar tadi, lalu ubah Driver Classnya jadi oracle.jdbc.driver.OracleDriver, kalau
nama kelasnya terserah :
Setelah selesai klik tombol OK, dan sekarang driver Oracle sudah terinstall di Netbeans ,
tinggal kita buat koneksi ke schema BELAJAR yang sebelumnya kita buat :
Caranya klik kanan nama driver oraclenya, misalkan namanya Oracle OCI. Setelah itu itu klik
Connect Using :
72
Setelah itu isi atributnya seperti dibawah ini :
Untuk host nya gunakan localhost, dan untuk SID kita pakai XE karena Kita memakai Oracle
Express Edition, sedangkan portnya 1521, soalnya pada saat proses instalasi Oracle XE
menggunakan port ini, untuk username dan password kita gunakan username dan password
yang telah kita buat sebelumnya.
Setelah itu klik tombol OK :
Pilih schema BELAJAR, karena kita menggunakan user BELAJAR,setelah itu klik OK :
73
Selesai.
Selanjutnya klik kanan pada folder Tables lalu pilih create tables
Akan muncul tampilan berikut. Isi Table Name dengan nama tabel yaitu MAHASISWA. Lalu
klik Add Column.
74
75
Selanjutnya pada project AplikasiJava yang sudah kita buat sebelumnya, lakukan
perubahan pada kelas FormIsian yaitu menambahkan tombol Tampilkan, menghapus
textArea dari panel, dan menambahkan komponen JTable dengan nama jTable1. Buat
desainnya seperti gambar di bawah ini:
Setelah itu tambahkan driver Oracle Database 10g Express Edition dengan cara klik kanan pada
folder Libraries, lalu pilih add Library, maka akan muncul tampilan berikut
76
77
Setelah muncul jendela Browse JAR/Folder, cari tempat di mana driver-nya disimpan, misalkan
disimpan di
C:oraclexeapporacleproduct10.2.0serverjdbclibojdbc14.jar.
78
Setelah itu klik tombol Add JAR/Folder. Kemudian klik OK.
Selanjutnya buat package baru dan diberi nama Data dan buat kelas baru dalam
package tersebut dan diberi nama DataBase.java. Tuliskan kode berikut dalam kelas
tersebut:
package Data;
import javax.swing.JOptionPane;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Connection;
public class DataBase {
driver disimpan
private String dbuser = Tempat
"belajar";
private String dbpaswd = "belajar123";
private Statement stm = null;
private Connection con = null;
private String err = "Komunikasi Error";
private ResultSet rss = null;
public DataBase(){
// load driver Oracle
try{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch(Exception e){
JOptionPane.showMessageDialog(null,""+e.getMessage(),"Driver
Error",JOptionPane.WARNING_MESSAGE);
}
try{
con =
DriverManager.getConnection("jdbc:oracle:oci8:@localhost:1521:XE",dbuser,
dbpaswd);
}catch(Exception e){
JOptionPane.showMessageDialog(null,"Error:"+e.getMessage(),err,
JOptionPane.WARNING_MESSAGE);
}
}
public ResultSet getData(String SQLString){
try{
stm = con.createStatement();
rss = stm.executeQuery(SQLString);
}catch(Exception
e){ JOptionPane.showMessageDialog(null,"Err
or :"
+e.getMessage(),err,JOptionPane.WARNING_MESSAGE);
}
return rss;
}
public int query(String SQLString){
int i = 0;
try{
stm = con.createStatement();
stm.executeUpdate(SQLString);
i = 1;
}catch(Exception
e){ JOptionPane.showMessageDialog(null,"err
or: "
+e.getMessage(),err,JOptionPane.WARNING_MESSAGE);
}
return i;
}
}
79
Setelah itu, perlu ditambahkan action listener pada button di kelas FormIsian.java untuk
menangkap event yang terjadi pada tombol Masukkan dan Tampilkan. Sintaks kode action
listener untuk tombol Masukkan adalah:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{ Mahasiswa m = new Mahasiswa(jTextField1.getText(),
Integer.parseInt(jTextField2.getText()),jTextField3.getText());
m.saveMahasiswa();
jTextField1.setText("");
jTextField2.setText("");
jTextField3.setText("");
}
80
Selanjutnya lakukan deploy aplikasi ini dengan mengklik Run > Clean and Build Project atau
tekan Shift + F121. Berikut output dari program tersebut:
Memasukkan data
Menampilkan data:
81
Latihan
1. Buatlah sebuah kelas yang dinamakan CalculatorGUI yang mengimplementasikan disain
GUI seperti di bawah ini :
Terdapat text field pada bagian atas frame (diguanakan untuk menampilkan hasil
perhitungan) dan sebuah kumpulan tombol yang berukuran 4 x 4 (16 buah). sebuah label
82
MODUL 4
GUI dan Database My-SQL
1. Sebelumnya kita install dulu netbeans dengan jdk 1.5.0_7 atau versi diatasnya.
2. lalu kalau sudah terinstall, pilih File->New Project.
Disini kita akan bikin project dan otomatis akan terbentuk Main.java
3. klo sudah kita pilih File ->New File ada banyak tipe java disitu,kita pilih
Java GUI Form -> sesuai anak panah.
4. lalu isi nama Classnya dan pilih packagenya sesuai anak panah.
5. kalau sudah pilih Finish.kita akan mulai membuat Form seperti pada tampilan di
bawah ini
83
84
-Pilih
Inspector lalu
-pilih
JScrollpane1
- pilih JTable.
Utk
Pengeditan
Tablenya
85
3. kita buat kolom dengan klik Model lalu isi nama kolom kolomnya seperti gambar
dibawah ini sesuai anak panah :
86
87
88
Dengan coding diatas maka secara otomatis jika kita klik 2x baris dalam JTable maka
data dalam baris terpilih akan muncul dalam Form kemudian bisa kita edit dan delete.
9. Cara Mengedit Data Dalam JTable
Setelah data muncul dalam Form untuk mengeditnya ikuti coding dibawah ini :
89
Untuk belajar SQL bisa menggunakan MysQL Server di Dos untuk menjalankan Querynya atau
dengan editor dari suatu MySQL yaitu MySQL Front,SQL Yog, dll.
nm_blkg
Listio
Puspita
Dahlia
Alamat
JL.Bungur 10
Jl.Merdeka IX
Jl.Sabar 19
Kota
Ulujami
Pesanggrahan
Pesanggrahan
Pada contoh di atas diperlihatkan satu buah table yang berisi tiga buah record dimana satu
record memiliki empat buah kolom yang nantinya kita sebut sebagai Field yaitu : nm_dpn,
nm_blkg, alamat dan kota.
4
Pembahasan SQL terdiri dari 2 bagian yaitu DML dan DDL.akan lebih dijelaskan dibawah ini
90
91
CREATE TABLE
MAHASISWA( Nim
varchar(10), Nama
varchar(60), Jenkel
varchar(20), Jurusan
varchar(30),
PRIMARY KEY(NIM)
);
8
nama
Pradana
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Perintah SQL :
INSERT INTO mahasiswa VALUES (0411500349, Pradana, Laki-Laki, Tekhnik Informatika)
Contoh Input Data ke kolom spesifik
Tabel Peserta
nim
0411500349
nama
Pradana
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Perintah SQL
INSERT INTO mahasiswa (nim,Jurusan) VALUES (0411500258, Sistem Informasi)
Hasil :
nim
0411500349
0411500258
9
nama
Pradana
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Sistem Informasi
92
nama
Pradana
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Sistem Informasi
nama
Parto
B.
nama
Pradana
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Sistem Informasi
C.
93
nama
Pradana
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Sistem Informasi
nama
Jenkel
Jurusan
Sistem Informasi
SQL menggunakan tanda kutip tunggal untuk data bertipe teks (namun adakalanya
database lain memperbolehkan menggunakan tanda kutip ganda). Sedangkan pada data
bertipe numerik tidak diperbolehkan menggunakan tanda kutip.
Contoh :
SELECT * FROM Mahasiswa where nsms=Pradana
SELECT * FROM Mahasiswa where nsms=Pradana
kutip tunggal)
SELECT * FROM Persons WHERE Year>1965
SELECT * FROM Persons WHERE Year>1965
D.
Kondisi LIKE
LIKE digunakan untuk memilih data dengan kondisi yang spesifik untuk pencarian dalam
sebuah kolom pada tabel.
Syntax :
SELECT column FROM table WHERE column LIKE pattern
Symbol % yang digunakan untuk persyaratan yang akan dicari di awal ataudiakhir dari
yang dicari.
Penggunaan klausa LIKE
Perintah berikut akan menghasilkan data peserta dengan nama depan yang diawali
dengan M :
SELECT * From Mahasiswa WHERE nama LIKE P%
Perintah berikut akan menghasilkan Peserta dengan nama yang diakhiri dengan a :
SELECT * From Mahasiswa WHERE nama LIKE %a
Perintah berikut akan menghasilkan Peserta dengan nama yang memiliki huruf la :
SELECT * From Mahasiswa WHERE nama LIKE %la%
10
Perintah UPDATE
Perintah UPDATE digunakan untuk mengubah data dalam suatu tabel.
Syntax :
UPDATE table_name SET column_name = new_value
WHERE column_name=some value
Tabel Peserta :
Update field untuk sebuah record
Contoh :
UPDATE Mahasiswa SET nama=Joko, Jenkel=Laki-Laki WHERE nim= 0411500258
94
Hasil :
nim
0411500349
0411500258
11
nama
Pradana
Joko
Jenkel
Laki-Laki
Laki-Laki
Jurusan
Tekhnik Informatika
Sistem Informasi
Perintah DELETE
Perintah delete digunakan untuk menghapus baris dari suatu tabel.
Syntax :
DELETE FROM table_name WHERE column_name=some value
Tabel Peserta :
nim
0411500349
0411500258
nama
Pradana
Joko
Jenkel
Laki-Laki
Jurusan
Tekhnik Informatika
Sistem Informasi
nama
Joko
Jenkel
Laki-Laki
Jurusan
Sistem Informasi
95
2. Lalu kita buat file Database.java untuk melakukan relasi dengan file Database.ini yang
isinya sbb:
96
3. Kita tinggal memanggil class Database.java(gb diatas) jika kita ingin melakukan
pemrosesan data yang berhubungan ke database. Untuk mengambil data dari file
database.ini kita akan memodifikasi program seperti dibawah ini pada sebelum dan
dalam Konstruktor :
97
98
5. Setelah coding diatas selesai. Maka data dari mysql akan tertampil pada table di Form
javanya seperti gambar dibawah ini:
99
10
0
2. Menu Cari
Untuk pembuatan menu cari . klik kanan tabel di Netbeans lalu pilih
Event ->Mouse->Mouse Click.
Kita menggunakan metode klik,jika tablenya diklik maka data dari table akan tertampil
di Formnya.Lalu tambahkan coding dalam Fungsi tabelMouseClicked seperti coding
dibawah ini :
3. Menu Edit
Untuk pembuatan menu edit . klik kanan tombol ubah di Netbeans lalu pilih
Event ->Action->ActionPerformed.
Data setelah tertampil di Form maka baru kita edit :
Untuk lebih jelasnya lihat coding sbb:
10
1
4. Menu Delete
Untuk pembuatan menu Hapus . klik kanan tombol Hapus di Netbeans lalu pilih
Event ->Action->ActionPerformed.
Setelah data dicari, Menu yang terakhir adalah delete (untuk menghapus data):
10
2