Level III Java - Poltek Telkom
Level III Java - Poltek Telkom
POLITEKNIK TELKOM
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 based multitasking adalah aktifitas-aktifitas yang dijalankan bersamaan yang berbasis pada thread
1.2. Pengertian Thread 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 Sebuah program java dapat memiliki lebih dari satu thread 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 Deklarasi method ini adalah static Thread currentThread() Method currentThread() mengembalikan referensi ke thread yang sedang aktif Perhatikan contoh program berikut
// 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); } } } // membuat delay selama 5 detik
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.
4 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.
1.4. Membuat Thread Ada dua cara membuat Cara pertama, dengan mengimplementasi interface Runnable Interface Runnable terdapat dalam package java.lang, deklarasinya sebagai berikut public interface Runnable{ public void run(); } 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) Menjalankan thread dilakukan melalui pemanggilan method start() Method start() secara otomatis akan memanggil method run() yang terdapat dalam kelas yang mengimplementasi interface Runnable Perhatikan contoh berikut class MyRunnable implements Runnable { // mengimplementasikan method run() yang dideklarasikan // di dalam interface Runnable public void run() { System.out.println("Thread anak dieksekusi"); } }
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();
Cara kedua untuk membuat thread adalah dengan membuat kelas yang merupakan turunan kelas Thread.
Perhatikan contoh berikut class MyThread extends Thread { // melakukan override terhadap method run() public void run() { System.out.println("Thread baru dieksekusi"); } }
6 class DemoExtendsThread { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); System.out.println("Thread utama dieksekusi"); } }
1.5. Menghentikan Thread Thread yang telah dijalankan secara otomatis akan dihentikan ketika semua proses (kode dalam method run()) telah selesai dieksekusi Namun kita diijinkan untuk menghentikan thread secara manual 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"); }
1.6. Multithreading Dalam sebuah program Java, kita diijinkan untuk memiliki banyak thread Thread-thread tersebut dapat dijalankan secara simultan Perhatikan contoh berikut class MyThread1 extends Thread { public void run() { try { for (int i=0; i<10; i++) { System.out.println("Thread pertama: detik ke+(i+1)); if (i != 9) { sleep(1000); } else { System.out.println("Thread pertama selesai...\n"); } } } catch (InterruptedException ie) { System.out.println(ie.getMessage()); } } }
class MyThread2 extends Thread { public void run() { try { for (int i=0; i<5; i++) { System.out.println("Thread kedua: detik ke-" + (i+1)); if (i != 4) { System.out.println();
class DemoMultipleThread { public static void main(String[] args) { MyThread1 t1 = new MyThread1(); t1.start(); MyThread2 t2 = new MyThread2(); t2.start(); } }
1.7. Siklus Hidup Thread Berikut adalah siklus hidup suatu thread
1.8. Menentukan Prioritas Thread 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 prioritas thread, gunakan method setPriority(), yang deklarasinya adalah final void setPriority(int level) Untuk memperoleh informasi tentang prioritas suatu thread, gunakan method getPriority(), yang deklarasinya adalah final int getPriority() Perhatikan contoh berikut class MyThread implements Runnable { private Thread t; private long n; // jumlah pengulangan yang dihasilkan private boolean selesai = false; MyThread(String nama, int prioritas) { t = new Thread(this, nama); t.setPriority(prioritas); n = 0; } public void run() { while (!selesai) { n++; } } public void start() { t.start(); } public void stop() { selesai = true; } public long getN() { return n; } public Thread getThread() { return t; } }
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() } } pengulangan pada " + + ": " + t1.getN()); pengulangan pada " + + ": " + t2.getN());
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 dijalankan\n"); 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 akan digunakan oleh satu buah thread pada satu waktu tertentu
Cara yang digunakan ini disebut sinkronisasi Untuk dapat melakukan sinkronisasi thread, teknologi Java memperkenalkan terminologi lock pada obyek.
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 : [modifiers] synchronized data_type identifier(arguments) { //code block } Perhatikan contoh berikut class TestKelas { public synchronized void test(String s) { System.out.print("[" + s); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("]"); } }
class MyThread implements Runnable { private TestKelas obj; private Thread t; private String msg; MyThread(TestKelas obj, String msg) { t = new Thread(this); this.obj = obj; this.msg = msg; t.start(); } public void run() { obj.test(msg); } }
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
Sinkronisasi Pada Baris Program Tertentu 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 }
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,
OutputStream, Reader, Writer 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 Kedua method tersebut adalah method abstrak
Byte Stream Byte stream didefinisikan dengan menggunakan dua buah hirarki kelas 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 BufferedInputStream BufferedOutputStream ByteArrayInputStream Keterangan Input stream yang telah ter-buffer Output Stream yang telah ter-buffer Input stream yang membaca dari array byte
ByteArrayOutputStream Output stream yang menulis ke array byte DataInputStream Input stream yang meiliki method-method untuk membaca tipe data standar yang terdapat dalam java DataOutputStream Out stream yang meiliki method-method untuk menulis tipe data standar yang terdapat dalam java FileInputStream FileOutputStream PipedInputStream PipedOutputStream PrintStream Input stream yang membaca data dari sebuah file Output stream yang menulis data ke sebuah file Penyalur input Penyalur output Output stream yang berisi method println() dan print()
Character Stream Character stream didefinisikan dengan menggunakan dua buah hirarki kelas 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 BufferedReader BufferedWriter CharArrayReader CharArrayWriter InputStreamReader Keterangan Character stream input yang telah ter-buffer Character Stream output yang telah ter-buffer membaca dari array character menulis ke array character Input stream yang menerjemahkan byte ke character
OtuputStreamWriter
membaca data dari sebuah file menulis data ke sebuah file Penyalur input Penyalur output Output stream yang berisi method println() dan print() Input stream yang membaca dari sebuah String Output stream yang menulis ke sebuah String
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
System.out mengacu kepada output stream standar, yang berupa console System.in mengacu kepada input stream standar yang berupa keyboard System.err mengacu pada stream error standar yang berupa console
2.1.2. -
Proses Input
Dalam Java, input console dilakukan dengan pembacaan terhadap stream System.in
19 Untuk mendapatkan karakter-karakter yang dimasukkan melalui keyboard ke layar console, System.in perlu dibungkus didalam objek BufferedReader. Hal ini dilakukan untuk membentuk character stream, karena sebenarnya System.in adalah byte stream Bentuk konstruktor dari BufferedReader adalah BufferedReader(Reader inputReader) 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 Agar objek dari InputStreamReader dapat dihubungkan dengan System.in, perlu digunakan konstruktor dengan bentuk: InputStreamReader(InputStream is) 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. Deklarasi method read() adalah sebagai berikut: int read() throws IOException Berikut adalah contoh membaca input data karakter import java.io.*; class DemoInputKarakter { public static void main(String[] args) throws IOException { System.out.print("Masukkan sembarang karakter: "); char ch; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); ch = (char) br.read();12 System.out.println("Karakter yang dimasukkan adalah \'" + ch + "\'"); } } Untuk melakukan input berupa String, gunakan method readLine()
20 Deklarasi method tersebut adalah String readLine() throws IOException Contoh input data String import java.io.*; class DemoInputString { public static void main(String[] args) throws IOException { System.out.print("Masukkan nama Anda: "); String nama; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); nama = br.readLine(); System.out.println("Halo " + nama + ", sudahkah Anda mengerti Java?"); }
Contoh input data numeric import java.io.*; class DemoInputNumerik1 { public static void main(String[] args) throws IOException { System.out.print("Masukkan sebuah bilangan bulat: "); String temp; int 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 integer bilangan = Integer.parseInt(temp); } catch (NumberFormatException nfe) { System.out.println("Data yang dimasukkan +"bukan bilangan bulat"); System.exit(1); } System.out.println("Bilangan yang dimasukkan " + "adalah " + bilangan); } }
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() System.out adalah objek dari tipe PrintStream. Sedangkan PrintStream adalah turunan dari OutputStream, maka System.out dapat menggunakan method write() yang didefinisikan pada kelas OutputStream.
Contoh penggunaan write() class DemoWrite { public static void main(String[] args) { int i = 'A'; byte b = 65; char c = 'B'; System.out.write(i); System.out.write(b); System.out.write(c); } }
22
Selain menggunakan System.out, kita juga dapat menggunakan kelas PrintWriter untuk menuliskan data ke layar console.
Terdapat beberapa bentuk konstruktor dari PrintWriter, di antaranya ialah PrintWriter(OutputStream os, boolean flushOnNewLine) os adalah objek dari OutputStream, sedangkan flushOnNewLine adalah parameter bertipe boolean yang menyatakan apakah stream output akan dibuang atau tidak setiap kali method println() dipanggil.
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)
Berikut contoh penggunaan PrintWriter import java.io.PrintWriter; class DemoPrintWriter { public static void main(String[] args) { // membuat objek PrintWriter PrintWriter pw = new PrintWriter(System.out, true); double d = 3.1416; int i = 123; byte b = 65; char c = 'A'; String s = "Ini adalah string"; pw.println("Data pw.println("Data pw.println("Data pw.println("Data pw.println("Data } } bertipe bertipe bertipe bertipe bertipe double int byte char string : : : : : " " " " " + + + + + d); i); b); c); s);
2.1.4. -
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 char System.out.print((char) data); } } catch (IOException ioe) { System.out.println(ioe.getMessage()); return; } // menutup file try { finput.close(); } catch (IOException ioe) {} } } Berikut contoh menuliskan data ke file import java.io.*; class DemoTulisFile { public static void main(String[] args) { FileOutputStream foutput = null; String data = "Baris pertama ketiga";
tipe
\nBaris
kedua
\nBaris
// 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
24 try { foutput.close(); } catch (IOException ioe) {} } } Berikut demo menyalin isi suatu file ke dalam file lain
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 dapat 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) {} } }
2.2 Kelas File Kelas File menyediakan beragam fasilitas yang berhubungan dengan file dan informasinya. Dalam teknologi Java, sebuah direktori adalah salah satu contoh bentuk file. Sebuah obyek File dapat dibuat untuk merepresentasikan sebuah direktori dan menggunakannya untuk mengidentifikasi file lainnya. Berikut ini cara membuat obyek File.
25
File myFile; myFile = new File(myfile.txt); myFile = new File(MyDocs, 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 direktori, yang dikembalikan adalah nama 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
2.3 Kelas StringBuffer Obyek StringBuffer merupakan urutan karakter Unicode yang dapat diubah (mutable). Dianjurkan untuk menggunakan StringBuffer ketika membuat banyak modifikasi terhadap suatu String. Berikut ini merupakan bentuk-bentuk konstruktor yang ada di dalam kelas StringBuffer : public StringBuffer() Konstruktor ini membuat sebuah obyek StringBuffer yang kosong. Sebagai contoh :
public StringBuffer(int capacity) Konstruktor ini membuat sebuah obyek StringBuffer kosong dengan kapasitas sebesar int. Sebagai contoh :
Kode di atas akan membuat sebuah obyek StringBuffer yang memiliki kapasitas 50 karakter.
public StringBuffer(String string) Konstruktor ini membuat sebuah obyek StringBuffer yang berisikan String tertentu. Sebagai contoh :
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.
public synchronizedStringBuffer append(String s) Method ini akan memodifikasi StringBuffer dengan menambahkan String s di ujung buffer. Kelas StringBuffer juga memiliki bentuk overloaded method untuk tipe parameter boolean, char, char[], double, float, long, dan Object. Berikut ini merupakan contoh dari penggunaan StringBuffer.
29
public synchronized StringBuffer insert(int offset,String s) Method ini memodifikasi StringBuffer dengan menambahkan String s pada lokasi offset tertentu. Kelas StringBuffer juga memiliki bentuk overloaded method untuk tipe parameter: boolean, char, char[], double, float, long, dan Object. Sebagai contoh :
public synchronized StringBuffer reverse() Method ini akan membalikkan urutan karakter dari obyek StringBuffer. Sebagai contoh:
Kelas Wrapper memiliki dua fungsi utama, yaitu : a. menyediakan mekanisme untuk membungkus data primitif ke dalam obyek sehingga data primitif ini dapat menggunakan operasi-operasi yang khusus diperuntukkan untuk obyek, seperti penambahan ke dalam koleksi atau pengembalian dari sebuah method yang mengembalikan sebuah obyek; menyediakan satu set fungsi utility untuk data primitif. Sebagian besar dari fungsi-fungsi ini berhubungan dengan konversi data primitif dari satu bentuk ke bentuk yang lainnya, sebagai contoh, mengubah data primitif ke dalam bentuk String dan sebaliknya, mengubah data primitif ke dalam bentuk basis yang berbeda-beda (binary, octal, dan decimal).
b.
Setiap data primitif dalam Java memiliki kelas wrapper yang bersesuaian. Sebagai contoh, kelas wrapper untuk int adalah Integer, untuk float adalah Float, dan sebagainya. Yang patut diingat adalah nama dari kelas wrapper suatu data primitif adalah sama dengan tipe data primitif yang bersesuaian dengan huruf pertamanya dalam bentuk huruf besar, kecuali untuk tipe data char dengan kelas wrapper Character, dan int dengan kelas wrapper Integer. Tabel di bawah ini menunjukkan tipe data primitif dan kelas wrapper yang bersesuaian :
30
Data Primitif dan Kelas Wrapper yang Sejenis Beserta Konstruktornya TIPE DATA PRIMITIF boolean byte char short int long float double KELAS WRAPPER Boolean Byte Character Short Integer Long Float Double ARGUMEN KONSTRUKTOR
boolean atau String byte atau String char short atau String int atau String long atau String float atau String double atau String
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
Float f1 = new Float(3.14); Float f2 = new Float(3.14); Untuk kelas wrapper Character, ia hanya menyediakan satu buah konstruktor, yang mengambil nilai char sebagai argumen. Sebagai contoh :
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
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.
x x
x x
x x
x x
x x
x x
x x
x x x
x x x
x x
Sebagai contoh :
32
atau
parseXxx () dan valueOf() Enam buah method parseXxx() (satu untuk setiap tipe wrapper numerik) berhubungan erat dengan method valueOf() yang ada di semua kelas wrapper bertipe numerik (termasuk kelas wrapper Boolean). Baik method parseXxx() maupun valueOf() menggunakan String sebagai argumennya, melemparkan exception NumberFormatException jika bentuk String-nya tidak benar, dan dapat mengubah obyek String dari basis yang berbeda-beda jika tipe data primitif yang dirujuknya merupakan satu dari empat bentuk integer (byte, short, int, dan long). Perbedaan dari kedua method ini adalah sebagai berikut : a. b. parseXxx() mengembalikan nilai primitif yang sesuai dengan kelas wrapper-nya; valueOf() mengembalikan sebuah obyek wrapper yang tipenya sama dengan kelas wrapper yang memanggil method tersebut. double d4 = Double.parseDouble("3.14"); System.out.println("d4 = " + d4); Double d5 = Double.valueOf("3.14");
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 di mana di dalamnya duplikasi elemen diperbolehkan. 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 + + + + + + add(element : Object) : boolean remove(element : Object) : boolean size() : int isEmpty() : boolean contains(element : Object) : boolean iterator() : Iterator
<<interface>> Set
<<interface>> List + + + + + + add(index : int, element : Object) remove(index : int) : Object get(index : int) : Object set(index : int) : Object indexOf(element : Object) : int listIterator() : ListIterator
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.*;
public class SetExample { public static void main(String[] args) { Set set = new HashSet(); set.add("one"); set.add("second"); set.add(new Integer(4)); set.add("second"); //duplikasi, tidak ditambahkan
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"); list.add(new Integer(4)); System.out.println(list); } } //duplikasi ditambahkan //duplikasi ditambahkan
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:
List list = new ArrayList(); Iterator elements = new Iterator(); while(elements.hasNext()) { System.out.println(elements.next()); }
<<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 Memahami dan menguasai pembuatan dan pengaplikasian Graphical User Interface
6.1
Pemahaman Dasar Graphical User Interface Pada modul-modul sebelumnya, program yang kita buat menggunakan console sebagai
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. Containers: merupakan wadah yang berfungsi untuk menempatkan komponen-komponen lain di dalamnya. 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); }
Konstruktor untuk membentuk JFrame adalah JFrame() NamaFrame). Salah satu method yang sering digunakan di
atau
JFrame(String
kelas
JFrame
adalah
setDefaultCloseOperation(int ops). Method ini berfungsi untuk mengatur apa yang akan dilakukan oleh program ketika tombil close di klik. Parameter method tersebut di antaranya adalah: 1. JFrame.DO_NOTHING_ON_CLOSE: tidak ada satu aktivitas pun yang dilakukan secara otomatis apabila frame ditutup. 2. JFrame.HIDE_ON_CLOSE: frame hanya disembunyikan, namun secara fisik frame masih ada di memori sehingga dapat dimunculkan kembali. Merupakan aktivitas default. 3. JFrame.DISPOSE_ON_CLOSE: mengilangkan tampilan frame dari layar,
menghilangkannya dari memori, dan membebaskan resource yang dipakai. 4. JFrame.EXIT_ON_CLOSE: menghentikan eksekusi program. Selain JFrame, top level container yang lain adalah JDialog. Berbeda dengan JFrame, JDialog tidak dibuat berdiri sendiri, melainkan dibuat bersama-sama dengan frame sebagai parent-nya. Jika frame parent-nya ditutup, maka dialog akan dihapus dari memori. Kemunculan dialog akan membuat semua input terhadap frame parent-nya akan terblokir sampai dialog tersebut ditutup. Berikut contoh JDialog.
40
6.3 Layout Manager (Pengaturan Tata Letak) Layout manager berfungsi untuk menyusun komponen-komponen GUI di atas container. Penggunaan layout manager memudahkan programer untuk menyusun komponenkomponen GUI dibandingkan dengan menentukan ukuran eksak dan posisi setiap komponen, sehingga para programmer akan lebih berkonsentrasi terhadap urusan "look and feel" saja. 6.3.1 Border Layout BorderLayout merupakan default manager untuk ContentPane. Layout ini menempatkan komponen dengan pendekatan arah mata angin. Komponen-komponen pada layout ini ditempatkan pada posisi north, south, west, center, east. Coba ketik dan jalankan kode program berikut, yang akan menampilkan tampilan border layout berikut:
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); } }
6.3.2 Flow Layout FlowLayout adalah layout yang menyusun komponen dari kiri ke kanan, selanjutnya ke baris berikutnya. Jika ukuran windows diperbesar ukuran komponen pada FlowLayout tidak berubah. Method-method penting dari FlowLayout adalah sebagai berikut :
42 a. setAlignment(position_CONSTANT): adalah method untuk menentukan posisi layout. Nilai positition_CONSTANT dapat berupa FlowLayout.LEFT,
FlowLayout.CENTER, atau FlowLayout.RIGHT, yang masing-masing mengatur posisi rata kiri, rata tengah, atau rata kanan.
b.
layoutContainer(container): method untuk melakukan update container. Coba pelajari kode program berikut:
import javax.swing.*; import java.awt.*; import java.awt.event.*; public class FlowLayoutTest extends JFrame { public FlowLayoutTest(){ super("Contoh Flow Layout"); FlowLayout lay = new FlowLayout(); lay.setAlignment(FlowLayout.RIGHT); lay.setVgap(25);//mengatur jarak vertikal antar komponen lay.setHgap(25);//mengatur jarak horisontal antar komponen Container c = getContentPane(); c.setLayout(lay); JButton t1 = new JButton("Tombol 1"); JButton t2 = new JButton("Tombol 2"); JButton t3 = new JButton("Tombol 3"); JButton t4 = new JButton("Tombol terpanjang no 4"); JButton t5 = new JButton("Tombol 5"); JButton t6 = new JButton("Tombol 6"); c.add(t1); c.add(t2); c.add(t3); c.add(t4); c.add(t5); c.add(t6); } public static void main(String[] args){ FlowLayoutTest flt = new FlowLayoutTest(); flt.setSize(500, 200); flt.setVisible(true); flt.addWindowListener(new WindowAdapter(){ public void windowsClosing(WindowEvent e){ System.exit(0); } }); } }
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("Demonstrasi 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); } }); } }
6.3.6 Grid Bag Layout Grid bag layout adalah pengaturan layout yang dapat digunakan untuk meletakkan komponen secara bebas. Setiap komponen dapat menempati ukuran yang berbeda dengan komnponen lainnya. Setiap komponen dapat menempati lebih dari satu grid. Berikut ini langkah-langkah untuk menggunakan GridBagLayout : 1. Gambarkan terlebih dahulu desain GUI di kertas. 2. Bagi GUI tersebut ke dalam beberapa grid mulai dari baris dan kolom 0. Hal ini dilakukan untuk menempatkan komponen di posisi yang benar. 3. Buat sebuah objek GridBagConstraints, untuk menentukan bagaimana komponenkomponen ditempatkan. 4. Kemudian, definisikan variabel instance seperti berikut : - gridx - kolom. - gridy - baris. - gridwidth - jumlah kolom yang dialokasikan. - gridheight - jumlah baris yang dialokasikan. - weightx - ukuran ruang horisontal. - weighty - ukuran ruang vertikal. 5. Inisialisasi nilai weight ke nilai positif (nilai default adalah 0). 6. Definisikan instance variable fill dari GridBagConstraints ke NONE (default), VERTICAL, HORIZONTAL, atau BOTH.
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(); } }
6.3.7 Spring Layout Ini adalah pengaturan tata letak yang sangat fleksibel, dan dapat meniru fitur-fitur layout manager yang lain. Pada layout ini, ukuran komponen dapat berubah-ubah secara ototmatis jika ukuran window diubah. Pelajari contoh kode program berikut:
import javax.swing.JTextField; import javax.swing.JLabel; importjavax.swing.SpringLayout; java.awt.Container; import import javax.swing.JFrame; public class ContohSpring{ JFrame f; Container c; SpringLayout l; JLabel label; JTextField t; public ContohSpring(){ f = new JFrame("Demo SpringLayout"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); c = f.getContentPane(); l = new SpringLayout(); c.setLayout(l); label = new JLabel("Ini label"); t = new JTextField("Tuliskan Teks", 20); c.add(label); c.add(t);
49
//mengatur batasan (constraint) untuk label sehingga berada //di posisi (20,10) l.putConstraint(SpringLayout.WEST,label,20,SpringLayout.WEST, c); l.putConstraint(SpringLayout.NORTH,label,10,SpringLayout.NORTH, c); //mengatur batasan untuk text field supaya posisinya di //(sisi_kanan_label+10,10) l.putConstraint(SpringLayout.WEST,t,10,SpringLayout.EAST, label); l.putConstraint(SpringLayout.NORTH,t,10,SpringLayout.NORTH, c); //mengatur posisi content pane: sisi kanannya 5 pixel di luar sisi //kanan textField dan sisi kirinya 5 pixel di bawah sisi bawah //komponen terpanjang l.putConstraint(SpringLayout.EAST,c,5,SpringLayout.EAST, t); l.putConstraint(SpringLayout.SOUTH,c,5,SpringLayout.SOUTH, t); f.pack(); f.show(); } public static void main(String[] args){ ContohSpring cs = new ContohSpring(); } }
6.4 Event Handler Event adalah peristiwa atau kejadian yang dibangkitkan atau distimulasi oleh pengguna terhadap GUI. Untuk mendeteksi dan menangani apa yang dilakukan oleh pengguna terhadap GUI, diperlukan suatu mekanisme yang disebut Event Handling. Mekanisme event handling pada bahasa Java ditangani oleh event handling component, yang terbagi menjadi dua bagian, yaitu event listener dan event handler. Ilustrasi dari mekanisme event handling adalah sebagai berikut. Misalkan suatu button di tekan. Maka terciptalah suatu objek event, yaitu kejadian ditekannya button. Kejadian atau event itu ditangkap oleh event listener. Selanjutnya event tersebut harus ditangani oleh program dengan memanggil method event handler. Method tersebut berisi blok kode program yang melakukan suatu proses sebagai respon atas terjadinya event tersebut. Sebuah objek event mempunyai sebuah kelas event sebagai acuan bagi tipe datanya. Kelas event memiliki akar hirarki yaitu kelas EventObject. Kelas ini berada di package java.util. Kelas AWTEvent merupakan turunan dari kelas EventObject. Kelas AWTEvent didefinisikan dalam package java.awt. Berikut ini adalah daftar kelas yang merupakan turunan dari kelas AWTEvent. 1. ComponentEvent: turunan dari AWTEvent, dijalankan ketika sebuah komponen dijalankan, di resize, dibuat terlihat, atau disembunyikan.
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 } 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(); } } = = = = new new new new JLabel("Suhu dalam Celcius"); JLabel("Suhu dalam Fahrenheit"); JTextField(10); JTextField(10);
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!
Tujuan Mengetahui kegunaan dan mampu menggunakan netbeans 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 nama project
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 yaitu jendela untuk melihat hasil compile dan hasil
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
Lalu klik Finish. Latihan 1. Coba ketik kode berikut di kelas Mahasiswa. Setelah itu tekan F9 untuk meng-compile
2. Pada kelas main.java buatlah kode program untuk menampilkan tulisan Nama Mahasiswa NIM Fakultas : Ali Kobra : 1500661 : Sains
57 7.1.1 Membuat GUI dengan Netbeans Sekarang mari kita pelajari cara membuat GUI dengan menggunakan Netbeans. 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 Java Database Connectivity (JDBC) Java Database Connectivity (JDBC) adalah suatu fungsi 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: sun.jdbc.odbc.jdbcOdbcDriver (untuk MS Access) oracle.jdbc.driver.OracleDriver (untuk Oracle) org.gjt.mm.mysql.Driver (untuk MySQL)
Sintaks yang digunakan untuk menginisialisasi driver adalah Class.forName(nama driver); Setiap database mempunyai nama URL, di antaranya: jdbc:odbc:nama_database (untuk MS Access) jdbc:oracle:thin:localhost:1521:ORCL (untuk Oracle) jdbc:mysql://localhost/nama_database (untuk MySQL)
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 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 w.oracle.com/technetwork/database/express-edition/downloads/102xewinsoft edition/downloads/102xewinsoft090667.html si untuk oracle express edition, untuk Windows formatnya EXE, untuk Ada tiga versi Linux turunan Debian Formatnya F DEB, untuk Linux turunan Redhat edhat formatnya RPM. RPM Di praktikum m ini akan digunakan untuk versi Windows. Berikut langkah-langkah langkah untuk menginstal Oracle Database 10g Express Edition. Buka B file installernya, setelah itu tunggu sampai proses selesai :
62 Setelah persiapan instalalsi selesai, 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 ingin sebagai password untuk user, setelah itu klik next :
Gambar di atas adalah tampilan hasil instalasi, dan jangan lupa dicatat dicat t untuk portnya, setelah itu klik INSTALL :
64
Setelah etelah selesai ceklis Launch the database database homepage dan klik finish, maka akan keluar browser yang membuat t homepage database oracle express edition :
Setelah itu login menggunakan user SYSTEM dan password yang tadi dimasukkan d saat proses instalasi. Selesai.
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 :
etelah itu buat user baru, otomatis pula akan terbuat schema baru : Setelah
66
Setelah etelah selesai, tekan tombol CREATE , dan sekarang kita sudah dah berhasil membuat user sekaligus schema baru di Oracle XE dengan nama schema belajar. Sekarang ekarang anda bisa login pada awal halaman website Oracle XE tadi dengan user belajar r dan password yang anda masukkan. Setelah itu anda log out, lalu coba login lagi dengan username belajar dan password yang anda buat tadi.
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 api sebelumnya anda harus punya driver oraclenya terlebih dahulu. Tapi tak perlu khawatir karena waktu anda menginstall oracle xe, otomatis driver river nya ikut terinstal. Coba lihat di folder
C:\oraclexe\app\oracle\ \product\10.2.0\server\jdbc\lib, lib, disana ada file ojdbc14.jar yang digunakan sebagai drivernya. Sekarang jalankan Netbeans, lalu masuk ke bagian SERVICE :
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 esai klik tombol OK, dan sekarang driver Oracle sudah dah terinstall di Netbeans , tinggal kita buat koneksi ke schema BELAJAR yang sebelumnya kita buat :
Caranya aranya klik kanan nama driver oraclenya, misalkan namanya nya Oracle OCI. Setelah itu itu klik Connect Using :
Untuk host nya gunakan localhost, dan untuk SID kita pakai XE karena Kita memakai Oracle Express Edition, sedangkan portnya 1521, soalnya nya pada saat proses instalasi Oracle XE menggunakan port ini, i, untuk username dan password kita gunakan username dan password yang telah kita buat sebelumnya. Setelah etelah itu klik tombol OK :
Pilih ilih 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.
kolom nama, Nim, dan fakultas seperti gambar berikut: Buat kolom-kolom
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
Isikan nama library, misalkan namanya JDBC-Oracle. Klik OK. Setelah muncul tampilan berikut, klik Add JAR/Folder
77
Setelah muncul jendela Browse JAR/Folder, cari tempat di mana driver-nya disimpan, misalkan disimpan di
C:\oraclexe\app\oracle\product\10.2.0\server\jdbc\lib\ojdbc14.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,"Error :" +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,"error: " +e.getMessage(),err,JOptionPane.WARNING_MESSAGE); } return i; } }
79
Setelah membuat kelas DataBase.java, selanjutnya modifikasi kelas Mahasiswa.java dengan menambahkan dua method saveMahasiswa dan getMahasiswa (tambahkan import java.sql.ResultSet dan import Data.DataBase). Berikut sintaks untuk kedua method tambahan tersebut
public void saveMahasiswa(){ DataBase d1 = new DataBase(); int i; String s = "INSERT INTO MAHASISWA VALUES('"+this.nama+"','"+this.Nim+"', '"+this.fakultas+"')"; i = d1.query(s); if(i==1){ javax.swing.JOptionPane.showMessageDialog(null,"insert berhasil"); } else{javax.swing.JOptionPane.showMessageDialog(null,"insert gagal");} } public ResultSet getMahasiswa(){ ResultSet rs = null; DataBase db1 = new DataBase(); String str ="Select * From MAHASISWA"; rs = db1.getData(str); return rs; }
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 DAFTAR PUSTAKA
1. Gary Cornell, Cay S. Horstmann, Core Java (Edisi Indonesia), Penerbit Andi, 1997 2. Seno Adi Putra, Memahami Pemrograman Berorientasi Objek dengan Java, Institut Teknologi Telkom, 2010 3. Tim Asisten, Modul Praktikum Pemrograman Berorientasi Objek, Common Laboratory ITTelkom, 2009.