0% menganggap dokumen ini bermanfaat (0 suara)
696 tayangan96 halaman

Modul Pelatihan Java Rev 2.0

Bab 1 menjelaskan tentang sejarah dan karakteristik bahasa pemrograman Java, termasuk konsep virtual machine dan write once run anywhere. Java dikembangkan untuk perangkat consumer dengan kode yang kecil dan portabel."

Diunggah oleh

Eka Handayani
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
696 tayangan96 halaman

Modul Pelatihan Java Rev 2.0

Bab 1 menjelaskan tentang sejarah dan karakteristik bahasa pemrograman Java, termasuk konsep virtual machine dan write once run anywhere. Java dikembangkan untuk perangkat consumer dengan kode yang kecil dan portabel."

Diunggah oleh

Eka Handayani
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Kami menangani hak cipta konten dengan serius. Jika Anda merasa konten ini milik Anda, ajukan klaim di sini.
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 96

1 Pengenalan Java

Overview Bab ini akan menjelaskan tentang dasar-dasar pemrograman menggunakan bahasa Java. Penjelasan tentang karakteristik bahasa Java, identifier, tipe data, dan operator pada Java. Tujuan 1. Mengaplikasikan dasar-dasar pemrograman menggunakan Java 2. Menggunakan identifier dan tipe data pada Java 1.1 Sejarah Java

Pada tahun 1991, Sun dipimpin Patric Naughton dan James Gosling ingin merancang bahasa computer untuk perangkat consumer seperti cable TV Box. Karena perangkat itu tidak mempunyai banyak memori, bahasa harus berukuran kecil dan menghasilkan kode program yang liat. Juga karena manufaktur-manufaktur berbeda memilih pemroses-pemroses yang berbeda, maka bahasa harus bebas dari arsitektur manapun. Proyek ini diberi nama kode Green. Kebutuhan untuk kecil, liat dan kode netral terhadap platform mengatur tim mempelajari implementasi pascal yang pernah dicoba. Niklaus Wirth, pencipta bahasa Pascal telah merancang bahasa portable yang menghasilkan kode intermediate untuk mesin hipotetis. Mesin ini sering disebut Virtual machine. Kode antara ini kemudian dapat digunakan disembarang mesin yang memiliki interpreter. Proyek Green menggunakan virtual machine untuk mengatasi isu utama netral terhadap arsitektur mesin. Karena orang-orang di proyek Green berbasis C++ bukan Pascal maka kebanyakan Sintaks diambil dari C++, serta mengadopsi orientasi obyek bukan procedural. Mulanya bahasa yang diciptakan diberi nama Oak kemudian diganti Java karena telah ada bahasa pemrograman bernama Oak Produk pertama proyek Green adalah *7, sebuah kendali jauh yang sangat cerdas. Karena pasar masih belum tertarik dengan produk consumer cerdas maka proyek Green harus menemukan pasar lain dari teknologi yang diciptakan. Kemudian, penerapan mengarah menjadi teknologi yang berperan di web. Pada 1995, Netscape memutuskan membuat browser yang dilengkapi dengan Java. Setelah itu diikuti oleh IBM, Symantec, Inprise, bahkan Microsoft. Setelah itu Java mulai didengar. Dengan strategi terbukanya, banyak industri yang meliriknya. Bersamaan itu disusul berbagai universitas Amerika, Jepang, dan Eropa yang mengubah pengenalan bahasa pemrograman komputer menjadi Java, meninggalkan C++. Java lebih sederhana dan telah mengakomodasikan hampir seluruh fitur penting bahasa-bahasa pemrograman yang ada semenjak perkembangan komputasi modern. Java pertama kali diluncurkan sebagai bahasa pemrograman umum (general purpose programming language) dengan kelebihan dia bisa dijalankan di web browser sebagai applet. Sejak awal, para pembuat Java telah menanamkan visi mereka ke dalam Java untuk small embedded customer device)seperti TV, telepon, radio, dan sebagainya supaya dapat berkomunikasi satu sama lain. Langkah pertama yang diambil oleh Sun Microsistem adalah dengan membuat JVM (Java Virtual machine) yang kemudian diimplementasikan dalam bentuk JRE (Java Runtime Environment). JVM adalah lingkungan tempat eksekusi program Java berlangsung di mana para obyek saling berinteraksi satu dengan yang lainnya. Virtual machine inilah yang menyebabkan Java mempunyai kemampuan penanganan memori yang lebih baik, keamanan yang lebih tinggi serta portabilitas yang besar. Apabila kita hanya ingin menjalankan program Java, maka kita cukup memiliki JRE saja. Tapi seandainya kita 1

ingin mengembangkan perangkat lunak sendiri, JRE saja tidak cukup. Untuk lebih meningkatkan produktivitas pengembang perangkat lunak, Sun juga meluncurkan SDK (Standard Development Kit) yang berisi kakas dan API untuk membuat program aplikasi berbasis Java. Pada tahun 1999 Sun meluncurkan J2EE (Java 2 Enterprise Edition) sebagai framework untuk membuat aplikasi enterprise berskala besar. Pada tahun 2001, Sun meluncurkan J2ME yang kelak menjadi salah satu standar pemrograman di dalam PDA maupun handphone. 1.2 Karakteristik Bahasa Java

1. Sederhana, semudah C dan seampuh C++: berlawanan dengan anggapan orang-orang bahwa bahasa Java sulit untuk dipelajari, Java gampang untuk dipelajari terutama untuk orang yang sudah mengenal pemrograman tapi belum terlalu terikat pada paradigma pemrograman prosedural. Tentu saja ini berarti bahwa kita harus siap mempelajari salah satu teknologi yang berkembang paling cepat di dunia dalam dua tahun terakhir ini dengan banyak membaca tentunya baik dari buku maupun melalui web. 2. Sangat berorientasi obyek (OOP) dengan implementasi yang sangat baik sehingga kita bukan hanya belajar bagaimana membuat program yang baik (reusable, scalable, dan maintanable) tetapi juga kita belajar bagaimana cara berfikir yang baik untuk mengenali struktur masalah yang sedang kita hadapi dan memecahkannya secara sistematis dengan pola-pola tertentu (patterns OpenPlatform, Write Once Run Anywhere (WORA), portable atau multiplatform, program yang kita buat dapat dijalankan di Windows, Linux/Unix, Solaris, dan Macintosh tanpa perlu diubah maupun di kompilasi ulang. Java adalah juga bahasa yang paling sesuai digunakan bersama dengan XML yang membuat data menjadi portable, ini karena kelahiran XML tidak terlepas dari dukungan parser-parser berbahasa Java. 3. Arsitekturnya yang kokoh dan pemrograman yang aman. Dalam Java program yang kita buat tidak mudah untuk hang karena konflik pada memori biasanya diselesaikan dengan mengumpulkan obyek-obyek yang sudah tak terpakai lagi secara otomatis oleh garbage collector. Penanganan kesalahan juga dipermudah dalam Java dengan konsep Exception. 4. Bukan sekedar bahasa tapi juga platform sekaligus arsitektur. Java mempunyai portabilitas yang sangat tinggi. Ia dapat berada pada smartcard, pager, POS (Point of Service), handphone, PDA, palm, TV, Embedded device (PLC, micro controller), laptop, pc, dan bahkan server). Menyadari akan hal ini Sun membagi arsitektur Java membagi tiga bagian, yaitu: a. Enterprise Java (J2EE) untuk aplikasi berbasis web, aplikasi sistem tersebar dengan beraneka ragam klien dengan kompleksitas yang tinggi. Merupakan superset dari Standar Java b. Standard Java (J2SE), ini adalah yang biasa kita kenal sebagai bahasa Java, dan merupakan fokus kita sekarang. c. Micro Java (J2ME) merupakan subset dari J2SE dan salah satu aplikasinya yang banyak dipakai adalah untuk wireless device/mobile device 5. Program Java dijalankan menggunakan interpreter melalui Java Virtual machine (JVM). Hal ini menyebabkan source code Java yang telah dikompilasi menjadi Java bytecodes dapat dijalankan pada platform yang berbeda-beda. 6. Fitur-fitur utama yang lain: a. Mendukung multithreading. b. Selalu memeriksa tipe obyek pada saat runtime. c. Mempunyai automatic garbage collection untuk membersihkan obyek yang tidak terpakai dari memori 2

d. Mendukung exception sebagai salah satu cara penanganan kesalahan 1.3 Bagaimana Java Bekerja?

Lingkungan pemrograman pada Java menggunakan compiler sekaligus interpreter agar dapat berjalan pada platform yang berbeda. Java compiler melakukan kompilasi pada source code (.java) menjadi Java bytecodes (.class) seperti ditunjukkan oleh Gambar 2.1 berikut.

Gambar 1.1 Mekanisme Kompilasi dan Eksekusi Program Java Java bytecodes merupakan instruksi mesin yang tidak spesifik terhadap processor. Oleh karena itu, program Java hasil kompilasi akan dapat dijalankan pada berbagai platform sistem komputer dengan menggunakan Java Virtual machine (JVM), "write once, run anywhere" (lihat Gambar 2.2). JVM disebut juga bytecodes interpreter atau Java runtime interpreter.

Gambar 1.2 Konsep Write Once, Run Anywhere pada Java 1.4 Platform Java

Platform dapat diartikan sebagai lingkungan perangkat keras atau perangkat lunak di mana program dijalankan. Umumnya platform dinyatakan berdasarkan nama sistem operasi yang digunakan, misalnya Windows 2000, Linux, Solaris, atau MacOS. Tidak seperti bahasa pemrograman lainnya, platform Java mempunyai dua komponen, yaitu: 1. Java Virtual machine (Java VM) Merupakan fondasi untuk platform Java yang dapat digunakan di berbagai platform perangkat keras. 2. Java Application Programming Interface (Java API) Kumpulan komponen-komponen perangkat lunak siap pakai (ready-made software components) untuk berbagai keperluan penulisan program, seperti graphical user interface (GUI). Gambar 2.3. berikut memperlihatkan gambaran program yang berjalan di atas di kedua 3

komponen platform Java.

Gambar 2.3 Platform Java 1.5 Aplikasi Java

Ada dua tipe aplikasi pada Java yang umumnya sering ditulis, yaitu aplikasi stand alone dan applets. Aplikasi stand alone merupakan aplikasi yang dijalankan langsung di atas platform Java. Sedangkan applets adalah aplikasi yang dijalankan melalui web browser ataupun applet viewer. Perbedaan applets dengan Java stand alone adalah: 1. 2. 3. 4. 1. 2. 3. 4. 5. 1.6 Applets melakukan extends dari class applets. Applets tidak mempunyai fungsi main(). Applets mempunyai beberapa batasan keamanan, seperti tidak diperbolehkan membaca atau menulis file pada sistem komputer. Applets tidak dapat menjalankan program lain pada komputer yang menjalankan applets. Aplikasi berbasis Windows, misalnya dengan menggunakan fasilitas Swing. Java Servlet, yaitu aplikasi seperti applets tetapi dijalankan di sisi server. Java Server Pages, yaitu aplikasi di sisi server yang ditulis dalam bahasa script yang melekat pada halaman HTML untuk memberikan efek tampilan pada web browser. Java Beans dan Enterprise Java Beans, yaitu aplikasi untuk program multitiers. Java Micro Edition, yaitu aplikasi yang diperuntukan bagi perangkat genggam (handheld devices), seperti telepon genggam. Identifier di Java

Selain kedua tipe aplikasi tersebut, ada beberapa tipe aplikasi Java yang lain yaitu:

Identifier adalah nama yang diberikan kepada variabel, method, kelas, paket, dan interface untuk unik mengidentifikasikan bagi kompilator dan memberikan nama yang berarti bagi pemrogram. Adapun tatacara penamaan identifier: 1. Case sensitive, huruf kapital dan kecil dibedakan 2. Identifier yang diberikan oleh pemrogram tidak boleh sama dengan keyword yang ada di Java 3. Dimulai dengan huruf atau underscore (garis bawah) atau tanda ($). Namun sebisa mungkin diawali dengan huruf karena mungkin identifier dengan awalan underscore dan ($) digunakan unruk pemrosesan internal dan file import 4. Karakter berikutnya dapat berupa huruf atau angka 0 sampai 9. Simbol-simbol seperti + dan spasi tidak dapat digunakan

1.7

Keyword di Java

Keyword adalah identifier yang digunakan Java untuk suatu tujuan khusus. Daftar keyword Java adalah sebagai berikut: Tabel 1.1 Keyword dalam Java abstract do implements import instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while

boolean double break byte case catch char class continue default else extends false final finally float for if

1.8 Tipe Data di Java Tipe data dalam Java dibagi dalam dua kategori: 1. Sederhana 2. Komposit 1.8.1 Tipe data sederhana Tipe data sederhana merupakan tipe inti. Tipe sederhana tidak diturunkan dari tipe lain. Tipe ini adalah tipe data primitif. Terdapat delapan tipe data primitif di Java: - Empat tipe adalah untuk bilangan bulat: byte, short, int, long - Dua untuk tipe angka pecahan (floating point): float, double - Satu untuk tipe karakter, yaitu char - Satu untuk tipe boolean yang berisi nilai logika: true/false Tipe data integer Tipe data integer memiliki jangkauan nilai sebagai berikut: Tabel 1.1 Jangkauan nilai integer Jangkauan Panjang Integer Tipe data Nilai 7 8 bit byte -2 to 27-1 16 bit short -215 to 215-1 5

32 bit 64 bit

int long

-231 to 231-1 -263 to 263-1

Pada kebanyakan situasi, tipe int paling banyak dipakai. Untuk data yang berukuran besar, digunakan tipe data long. Tipe short dan byte terutama digunakan untuk aplikasi khusus yang menangani file level rendah. Tipe data Floating Point Tipe data ini digunakan untuk perhitungan yang melibatkan bilangan pecahan, seperti perhitungan kosinus, akar persamaan, dan sebagainya. Java mengimplementasikan standar himpunan tipe dan operator titik mengambang IEEE-754. Keakuratan nilai untuk tipe data floating point adalah sebagai berikut: Tabel 1.2 Presisi nilai float Panjang Float Tipe data Nilai terbesar 32 bit Float 3.40282e+38 64 bit Double 1.79769e+308 Masing-masing tipe data floating point memiliki kebutuhan memori yang berbeda. Tipe data float memerlukan 32 bit sebagai single-precision, sedangkan tipe data double memerlukan 64 bit sebagai double precision. Nama double mengacu pada presisinya yang sebesar dua kali dibandingkan float. Presisi float kebanyakan tidak memadai untuk banyak aplikasi komputasi. Angka literal bertipe float berakhiran F, contoh 3.14F sedangkan kalau tidak diberi akhiran F akan dipandang sebagai bertipe double. Tipe data Char Tipe data char merupakan tipe data yang direpresentasikan dengan 16-bit Unicode character. Literal dari char harus berada di antara single quotes ( ) Contohnya : a huruf a \t karakter tab Unicode dirancang untuk menangani semua karakter di dunia dalam kode 2 byte. Kode 2 byte memungkinkan 65.536 karakter, dimulai dari nilai byte 0 sampai 65.535. Himpunan karakter ASCII dipandang sebagai bagian dari Unicode dan ditempatkan sebagai 256 karakter pertama dari Unicode. Terdapat pula beberapa barisan escape untuk karakter Unicode yang spesial, seperti berikut: Tabel 1.3 Karakter Unicode spesial Barisan Escape Nama Nilai Unicode \b Backspace \u008 \t Tab \u009 \n Linefeed \u00a \r Carriage return \u00d \ Petik ganda \u0022 \ Petik tunggal \u0027 \\ Backslash \u005c 6

Tipe data Boolean Tipe data boolean memiliki 2 literal yaitu : true dan false. Contoh, statement : boolean truth = true; mendeklarasikan variabel truth sebagai tipe data boolean dan memberikan nilai true 1.8.2 Tipe data komposit Tipe data komposit merupakan tipe data yang disusun dari tipe data sederhana atau tipe komposit lain yang sudah ada. Tipe ini dapat berupa array, string, kelas, dan interface. Khusus untuk String pada Java dikenali sebagai kelas, bukan sebagai array of character. String pada Java diapit oleh tanda petik ganda (.....), contoh: String s=Saya makan nasi; 1.9 Operator di Java Operator unary: Tabel 1.4 Operator unary Nama Operator Simbol Definisi Increment ++ Akan menambahkan nilai sejumlah satu Decrement -Akan mengurangi nilai sejumlah satu Contoh penggunaan: int x = 5; int y = x++; pada kasus di atas nilai y akan berisi 5 dan nilai x akan berisi 6 karena nilai y akan mengambil nilai x dahulu setelah itu baru nilai x ditambahkan satu, berbeda kasusnya pada contoh di bawah ini: int x = 5; int y = ++x; pada kasus di atas, nilai y akan berisi 6 dan x berisi 6 karena nilai x akan ditambahkan satu dahulu baru kemudian dimasukkan ke variabel y. Operator aritmatika: Nama Operator Penambahan Pengurangan Perkalian Pembagian Sisa bagi Tabel 1.5 Operator aritmatika Simbol Deskripsi + * / % Menambahkan dua buah nilai Pengurangan dua buah nilai Perkalian dua buah nilai Pembagian dua buah nilai Sisa pembagian dua buah nilai

Java memiliki beberapa jenis operator di antaranya:

Operator relasi: 7

Tabel 1.6 Operator relasi Simbol Deskripsi < Kurang dari > Lebih dari <= Kurang dari atau sama dengan >= Lebih dari atau sama dengan == Sama dengan != Tidak sama dengan Operator boolean: Tabel 1.7 Operator boolean Simbol Deskripsi && AND || OR ^ XOR ! NOT

2 Flow Control
Overview Bab ini akan menjelaskan tentang flow control pada Java. Flow control yang dasar pada pemrograman ada dua, yakni percabangan dan pengulangan. Tujuan 1. Mampu menggunakan flow control percabangan pada Java 2. Mampu menggunakan flow control pengulangan pada Java 2.1 Percabangan pada Java Percabangan merupakan sebuah alur pemilihan berdasarkan kondisi tertentu. Pada Java, terdapat beberapa jenis sintaks untuk alur percabangan. 1. Sintaks if Sintaks if digunakan untuk menyatakan alur percabangan dengan pengecekan kondisi. Jika suatu kondisi yang dicek terpenuhi, maka aksi tertentu akan dilakukan. Jika tidak terpenuhi, maka akan dilakukan pengecekan kondisi pada else if berikutnya. Jika tidak ada kondisi yang terpenuhi, maka akan dilakukan aksi pada else-nya. Sintaks if-else, sebagai berikut : if (boolean expression) { statement or block } else if (boolean expression) { statement or block } else { statement or block } Contohnya: public class CobaIf { public static void main(String[] args) { int i = 3; if (i%2==0){ System.out.println(Bilangan genap): } else { System.out.println(Bilangan ganjil); } } } 2. Sintaks switch Sintaks switch digunakan untuk menyatakan alur percabangan dengan pengecekan pada sebuah nilai variabel. Variabel yang bisa dicek pada sintaks switch adalah variabel bertipe int, char dan boolean. Jika ditemukan nilai yang cocok dengan variabel yang dicek, maka dilakukan aksi yang pada case yang bersesuaian dengan nilai tersebut. Jika tidak ditemukan nilai yang cocok, akan dijalankan aksi pada default. Sintaks switch sebagai berikut : switch (expression) { case constant1 : statements; break; case constant2 : statements; break; default : statements; 9

break; } Contohnya public class CobaSwitch { public static void main(String[] args) { int x = 7; switch(x){ case 1: System.out.println(Januari);break; case 2: System.out.println(Februari);break; case 3: System.out.println(Maret);break; case 4: System.out.println(April);break; case 5: System.out.println(Mei);break; case 6: System.out.println(Juni);break; case 7: System.out.println(Juli);break; case 8: System.out.println(Agustus);break; case 9: System.out.println(September);break; case 10: System.out.println(Oktober);break; case 11: System.out.println(November);break; case 12: System.out.println(Desember);break; default: System.out.println(Salah input);break; } } } 2.2 Perulangan pada Java Perulangan adalah sebuah alur yang memungkinkan satu atau beberapa proses dilakukan beberapa kali. Beberapa sintaks perulangan yang ada di Java antara lain sebagai berikut. 1. Perulangan for Sintaks for digunakan untuk melakukan pengulangan sejumlah nilai tertentu. Perulangan akan dilakukan mulai dari nilai tertentu hingga nilai tertentu dicapai. Sintaks for sebagai berikut : for (init_expr;boolean testexpr;alter_expr) { statement or block } Contoh penggunaan sintaks for adalah sebagai berikut: public class ContohFor { public static void main(String[] args) { for (int i=0;i<10;i++) { System.out.println(i); } } } Pada kode di atas, program akan mengulang proses mencetak nilai variabel i di layar angka. Nilai variabel i mulai dari 1 kemudian setiap iterasi ditambahkan 1 (i++) hingga bernilai 10. 2. Perulangan while Sintaks while digunakan untuk melakukan pengulangan selama kondisi tertentu terpenuhi. Pengecekan kondisi dilakukan sebelum memasuki pengulangan, sehingga ada kemungkinan sebuah pengulangan tidak dilakukan sama sekali. Sintaks looping while sebagai berikut : while (boolean testexpr) { 10

statement or block } Contoh penggunaan sintaks while adalah sebagai berikut: public class ContohWhile { public static void main(String[] args) { int i = 0; while (i<10) { System.out.println(i); i++; } } } Pada kode di atas, program akan mengulang proses mencetak nilai variabel i di layar angka. Proses akan diulangi selama nilai i<10. 3. Perulangan do....while Sintaks do....while digunakan seperti pada sintaks while. Perbedaannya adalah pengecekan kondisi pada do....while adalah di akhir sehingga proses pengulangan pasti akan dilakukan minimal sekali. Sintaks do....while loop, sebagai berikut do { statement or block } while (boolean testexpr) Contoh penggunaan sintaks do....while adalah sebagai berikut: public class ContohDoWhile { public static void main(String[] args) { int i = 0; do { System.out.println(i); i++; } while (i<10); } }

11

3 Kelas dan Obyek


Overview Bab ini akan menjelaskan tentang dasar Pemrograman Berorientasi Obyek yaitu Kelas dan Obyek. Penjelasan tentang karakteristik kelas dan obyek, komponen kelas, serta cara pembuatan dan pendeklarasian kelas di dalam Java. Akan dijelaskan juga tentang cara pengaksesan komponen kelas. Tujuan 1. Mampu membuat kelas dan obyek 2. Mampu menggunakan array pada Java 3. Mampu membuat atribut bertipe obyek di Java 3.1 Kelas dan Obyek Obyek merupakan dasar dari struktur Pemograman Berorientasi Obyek (OOP). Fitur dari OOP adalah Abstraksi, Enkapsulasi, Pewarisan, dan Polymorphism. Fitur Abstraksi yaitu mengkarakteristikan obyek yaitu dengan pemberian atribut pada suatu obyek, hal ini akan diimplementasikan dengan pembuatan kelas (class). Kelas mempunyai 2 komponen yaitu Atribut dan Method. Sedangkan fitur Enkapsulasi digunakan untuk menyembunyikan informasi atau detil dari obyek yang tidak penting, hal ini diimplementasikan dengan access specifier. Access Specifiers di dalam Java terdiri dari : o public : kelas dapat diakses dari manapun termasuk dari kelas lain dan kelas-kelas yang berada dalam package yang berbeda o private : kelas dapat diakses oleh anggota kelas itu sendiri. o protected : kelas dapat diakses oleh kelas turunan o default : kelas dapat diakses dari manapun tetapi harus berada dalam package yang sama. Pembuatan kelas di dalam java : class <classname> { //declaration of data member //declaration of methods } Pembuatan kelas lengkap dengan access specifier class <classname> { <access specifier> <deklarasi atribut> <access specifier> <deklarasi method> } Karena dasar pemrograman OOP adalah obyek, sehingga class yang sudah dibuat akan dibuat obyeknya atau diinstansiasi, cara pembuatan obyek dari kelas adalah : <class name> <object name>; <object name> = new <class name>(); 12

Untuk menjalankan program dibutuhkan sebuah method main(). Method main() dapat dideklarasikan di kelas manapun tetapi nama kelas tempat method main() berada harus sama dengan nama file .java nya. Deklarasi method main : public static void main(String[] args) { //code for the main method } Berikut adalah contoh pembuatan kelas dan obyek secara lengkap, berikut dengan main method-nya class book { int price; int pages; public void set(int price,int pages) { this.price=price; this.pages=pages; } public void show() { System.out.println("Books Information"); System.out.println("Books Price : "+price); System.out.println("Number of pages : "+pages); } } public class MainBook { public static void main(String[] args) { book javabook=new book(); javabook.set(60000,100); javabook.show(); } } 3.2 Konstruktor Konstruktor merupakan method yang akan dieksekusi secara otomatis ketika sebuah obyek dibuat. Method ini mempunyai nama yang sama dengan nama kelas tempat konstruktor dideklarasikan. Konstruktor tidak mengembalikan nilai dan tidak dapat dideklarasikan sebagai static. Konstruktor biasanya digunakan untuk memberikan nilai pada atribut ketika obyek dibuat dari kelas. Sintaks konstruktor adalah : public class <class name> { <constructor name same with class name>(); } 13

Contoh dengan menggunakan konstruktor public class Employee { String EmpName; int EmpID; String EmpPosition; Employee (String name,int Id, String position) { EmpName = name; EmpID = Id; EmpPosition = position; } void Show() { System.out.println("Employee Information"); System.out.println("Name : "+EmpName); System.out.println("ID : "+EmpID); System.out.println("Position : "+EmpPosition); } public static void main(String args[]) { Employee Empobj; Emp_obj = new Employee("Mark",10010,"Manager"); Empobj.Show(); } 3.3 Package dan Import Package merupakan sebuah cara untuk menyatukan beberapa kelas yang memiliki fungsi yang berhubungan ke dalam sebuah paket. Deklarasi sebuah package diletakkan pada posisi paling atas dari sebuah kode program. Import merupakan cara sebuah kelas untuk menggunakan kelas dari package yang berbeda. Deklarasi import dituliskan di atas nama kelas dan di bawah nama package. Contoh penulisan lengkap deklarasi package, import dan nama kelas. package new; import java.util.*; class ex { ....... } Tanda bintang pada deklarasi import menyatakan bahwa semua kelas di dalam package yang bersangkutan ikut dipanggil oleh kelas tersebut. 3.4 Penggunaan modifier static Modifier static digunakan untuk memastikan bahwa sebuah atribut/method dialokasikan hanya sekali di memory tanpa mempedulikan jumlah obyek yang diinstansiasi dari kelas tersebut. Modifier static hanya digunakan pada atribut/method, tidak dapat digunakan pada kelas. class ex { static value; } public class Main { public static void main(String[] args) { 14

ex a = new ex(); ex b = new ex(); ex c = new ex(); a.value = 10; System.out.println(Nilai untuk a = +a.value); System.out.println(Nilai untuk b = +b.value); System.out.println(Nilai untuk c = +c.value); // Pemanggilan atribut static oleh kelasnya System.out.println(Nilai untuk kelas ex = +ex.value); } } Hasil dari program tersebut adalah sebagai berikut: Nilai untuk a = 10 Nilai untuk a = 10 Nilai untuk a = 10 Nilai untuk a = 10 Atribut/method non-static tidak dapat diakses oleh method static. Untuk mengakses atribut/method non-static pada method static, harus dibuat dulu obyek dari atribut/method kelas yang ingin diakses. 2.5 Array 3.5.1 Mendeklarasikan Array Array biasanya digunakan untuk mengelompokkan data atau obyek yang memiliki tipe yang sama. Array memungkinkan untuk mengacu ke sekumpulan obyek dengan nama yang sama. Array dapat dideklarasikan dengan tipe apa saja, baik itu yang bertipe data primitif maupun obyek. Berikut contoh deklarasi Array : char s[]; point p[]; // point adalah sebuah kelas Dalam bahasa pemrograman Java, Array merupakan sebuah obyek meskipun ia terdiri dari elemen yang bertipe data primitif. Seperti halnya kelas yang lain, ketika mendeklarasikan Array belum dibentuk sebuah obyek Array. Deklarasi Array hanya membuat sebuah referensi yang dapat digunakan untuk mengacu ke sebuah obyek Array. Besarnya memori yang digunakan oleh elemen-elemen Array akan dialokasikan secara dinamis dengan menggunakan pernyataan new atau dengan array initializer. Contoh deklarasi array di atas, dengan menggunakan kurung siku setelah nama variabel, merupakan standar penulisan array dalam C, C++ dan Java. Format demikian agak sulit untuk dibaca. Oleh karenanya, bahasa Java menggunakan bentuk deklarasi array alternatif dengan menggunakan kurung siku di sebelah kiri seperti dalam contoh berikut : char [] s; point [] p; // point adalah sebuah kelas Sebuah deklarasi array dapat ditulis sebagai pendeklarasian tipe array di bagian kiri dan nama variabel di bagian kanan. Kedua bentuk deklarasi array di atas dapat digunakan, tetapi sebaiknya konsisten dalam menggunakan satu bentuk saja. Dalam deklarasi array, tidak ditentukan ukuran aktual dari array. Ketika mendeklarasikan array dengan kurung siku yang berada di sebelah kiri nama variabel, kurung siku tersebut berlaku bagi semua variabel yang berada di sebelah kanannya. 3.5.2 Membuat Array Array dibuat dengan menggunakan keyword new. Contoh di bawah ini membuat sebuah Array dengan tipe primitif char: 15

s = new char[26]; Indeks array dimulai dengan angka 0. Batasan legal untuk nilai indeks ini adalah dari nol hingga jumlah elemen array 1. Apabila program berusaha mengakses array di luar batas yang legal, maka akan muncul runtime exception. Untuk membuat Array dengan elemen obyek, gunakan cara penulisan berikut p = new point[10]; Pernyataan tersebut tidak membuat 10 obyek Point. Untuk membuat obyek Point, gunakan pernyataan berikut : p[0] = new point(0, 1); p[1] = new point(1, 2); ... 3.5.3 Menginisialisasi Array Java memiliki cara singkat untuk membuat sebuah obyek Array dengan elemen-elemennya memiliki nilai awal : String names[] = {"Georgianna","Jen","Simon"}; Kode di atas adalah sama dengan kode berikut ini: String names[]; names[0] = "Georgianna"; names[1] = "Jen"; names[2] = "Simon"; Cara singkat ini dapat digunakan untuk Array dengan berbagai jenis tipe, seperti dalam contoh berikut : MyDate dates[] = { new MyDate(22, 7, 1964), new MyDate(1, 1, 2000), new MyDate(22, 12, 1964), }; 3.5.4 Array Multidimensi Dalam Java, dapat dibuat Array dari Array sehingga dinamai Array multidimensi. Contoh berikut ini memperlihatkan cara membuat Array dua dimensi : int twoDim [][] = new int[4][]; twoDim[0] = new int[5]; twoDim[1] = new int[5]; Array dari Array yang bersifat non-rectangular dapat dibuat seperti dalam contoh berikut : twoDim[0] = new int[2]; twoDim[1] = new int[4]; twoDim[2] = new int[6]; twoDim[3] = new int[8]; Untuk membuat Array dari Array yang rectangular dengan cara mudah, gunakan bentuk berikut ini : int twoDim[][] = new int[4][5]; 3.5.5 Batasan Array Dalam bahasa Java, indeks Array dimulai dengan angka nol. Jumlah elemen di dalam Array disimpan sebagai bagian dari obyek Array di dalam atribut length. Atribut ini dapat digunakan untuk melakukan proses iterasi pada Array seperti dalam contoh berikut : 16

int list[] = new int[10]; for(int i = 0; i < list.length; i++) { System.out.println(list[i]); } Dengan menggunakan atribut length, pemeliharaan kode program menjadi mudah karena program tidak perlu mengetahui jumlah eleman Array pada saat kompilasi. Setelah membuat obyek Array, ukuran Array tersebut tidak dapat diubah. namun demikian, dapat digunakan variabel referensi yang sama untuk menunjuk ke sebuah obyek Array baru seperti dalam contoh di bawah ini : int myArray[] = new int[6]; myArray = new int[10]; Dalam kode program ini, obyek Array yang pertama akan hilang kecuali ada variabel lain yang dibuat untuk merujuk ke obyek Array tersebut. 3.6 Atribut bertipe obyek Dalam Object Oriented Programming, kelas-kelas yang terbentuk dapat memiliki atribut dengan tipe obyek lainnya. Hal ini dapat dilihat pada contoh berikut: //mahasiswa.java public class mahasiswa { private String NIM, Nama; public mahasiswa(String no, String nm) { this.NIM = no; this.Nama = nm; } public String GetNIM() { return (NIM); } public String GetNama() { return (Nama); } } //jurusan.java public class Jurusan { private String KodeJurusan, NamaJurusan; private Mahasiswa[] Daftar=new Mahasiswa[10]; public Jurusan(String kode, String nama) { this.KodeJurusan = kode; this.NamaJurusan = nama; } private static int JmlMhs = 0; public void AddMahasiswa(Mahasiswa m) { if(this.JmlMhs<10){ this.Daftar[JmlMhs] = m; this.JmlMhs++; } } public void DisplayMahasiswa() { int i; System.out.println("Kode Jurusan : "+this.KodeJurusan); System.out.println("Nama Jurusan : "+this.NamaJurusan); System.out.println("Daftar Mahasiswa :"); 17

for (i=0;i<JmlMhs;i++) System.out.println(Daftar[i].GetNIM()+" "+Daftar[i].GetNama()); } } Pada kode program di atas dapat dilihat bahwa pada satu kelas jurusan terdapat atribut bernama Daftar yang bertipe array dari obyek Mahasiswa. Penggambaran kode program di atas pada diagram kelas adalah sebagai berikut:

Gambar 3.1 Diagram kelas Jurusan-Mahasiswa Dari gambar dapat dilihat bahwa satu kelas Jurusan dapat memiliki beberapa atribut bertipe kelas Mahasiswa.

18

4 Inheritance dan Polimorfisme


Overview Inheritance dan Polymorphism merupakan konsep OOP yang memberikan fleksibilitas kepada programmer dalam menulis program. Dengan mengaplikasikan konsep inheritance, sebuah kelas dapat menurunkan fungsi dan atribut yang dimilikinya kepada kelas yang menjadi turunannya. Dengan mengaplikasikan konsep polymorphism, programmer dapat memperlakukan seluruh object yang berasal dari superclass yang sama seakan-akan mereka adalah object dari superclass. Pada Java, konsep polymorphism diimplementasikan melalui beberapa cara yaitu overloading, overriding, abstract class dan melalui interface. Tujuan 1. Memahami dan menerapkan konsep pewarisan dalam OOP 2. Memahami penggunaan kelas abstrak dalam OOP 3. Memahami penggunaan interface dalam OOP 4. Memahami dan menerapkan konsep polimorfisme dalam OOP 4.1 Pewarisan di Java Pewarisan di Java hanya mengenal pewarisan tunggal, artinya sebuah kelas hanya mewarisi atribut dan method dari satu kelas induk. Untuk menggunakan pewarisan di Java digunakan keyword extends. Contoh pewarisan dapat dilihat pada diagram kelas berikut ini:
Employee +name : String = "" +salary : double +birthDate : Date +getDetails() : String

Manager +departement : String

Gambar 4.1 Contoh Pewarisan Kelas Implementasi dari diagram kelas di atas dalam Java adalah sebagai berikut: //Employee.java public class Employee { public String name; public Date birthDate; public double salary; public String getDetails() {...} } //Manager.java public class Manager extends Employee { public String department; } Atribut name, birthDate, dan salary serta method getDetails() diturunkan ke kelas Manager sehingga kelas Manager dapat menggunakan atribut dan method tersebut. Konstruktor dari kelas induk tidak dapat diturunkan kepada kelas turunannya. 19

Untuk menggunakan method dan konstruktor dari kelas induk pada kelas anak digunakan keyword super, contoh: //Employee.java public class Employee { private String name; private double gaji; public Employee (String s, double g) { name = s; gaji=g; } public double getgaji() { return gaji; } } //Manager.java public class Manager extends Employee { private String alamat; private double tunjangan; private double bonus; public Manager(String nama, String s) { super(nama); alamat = s; } Public double getgaji() { return (super.getgaji()+tunjangan+bonus); } } 4.1.1 Kelas Abstrak Kelas abstrak merupakan suatu bentuk khusus dari kelas di mana kelas tersebut tidak dapat diinstansiasi dan digunakan hanya untuk diturunkan ke dalam bentuk kelas konkret atau kelas abstrak berikutnya. Kelas abstrak dideklarasikan menggunakan keyword abstract. Di dalam kelas abstrak dapat dideklarasikan atribut dan method sama seperti kelas konkret, namun ada juga method abstrak, yaitu suatu method yang tidak mempunyai implementasi hanya memiliki deklarasi saja, contoh: public abstract class LivingThing { public void breath(){ System.out.println("Living Thing breathing..."); } public void eat(){ System.out.println("Living Thing eating..."); } public abstract void walk(); //merupakan method abstrak } Ketika sebuah kelas mewarisi sebuah kelas abstrak, kelas tersebut harus mendefinisikan implementasi dari method abstrak yang ada dalam kelas induknya. Jika tidak didefinisikan implementasinya, maka kelas tersebut akan menjadi kelas abstrak juga, contoh: public class Human extends LivingThing { 20

//implementasi dari method abstrak walk() public void walk(){ System.out.println("Human walks..."); } } 4.1.2 Interface Interface adalah prototype kelas yang berisi definisi konstanta dan deklarasi method (hanya nama method tanpa definisi kode programnya). Dalam sebuah interface: - Semua atribut adalah public, static dan final (semua atribut bertindak sebagai konstanta) secara default. Artinya, jika tidak dideklarasikan secara eksplisit, maka sebuah atribut memiliki sifatsifat tersebut secara otomatis. - Semua method adalah abstract dan public secara default. Artinya, jika tidak dideklarasikan secara eksplisit, maka sebuah method memiliki sifat-sifat tersebut secara otomatis. - Tidak boleh ada deklarasi konstruktor. - Interface dapat meng-extend satu atau beberapa interface lainnya. Dengan adanya interface, Java menyediakan sebuah fitur untuk keperluan pewarisan jamak (multiple inheritance). Contoh interface dan kegunaannya:

Gambar 4.2 Contoh Interface Untuk membuat interface di Java digunakan keyword interface. Source code untuk diagram kelas di atas dalam Java adalah sebagai berikut: //Relation.java public interface Relation { public boolean isGreater( Object a, Object b); public boolean isLess( Object a, Object b); public boolean isEqual( Object a, Object b); } //Line.java public class Line implements Relation { private double x1; private double x2; private double y1; private double y2; public Line(double x1, double x2, double y1, double y2){ this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; } 21

public double return } public double double return } public double double return } public double double return } }

double getLength(){ length = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)* (y2-y1)); length; boolean isGreater( Object a, Object b){ aLen = ((Line)a).getLength(); bLen = ((Line)b).getLength(); (aLen > bLen); boolean isLess( Object a, Object b){ aLen = ((Line)a).getLength(); bLen = ((Line)b).getLength(); (aLen < bLen); boolean isEqual( Object a, Object b){ aLen = ((Line)a).getLength(); bLen = ((Line)b).getLength(); (aLen == bLen);

4.1.3 Beberapa Catatan tentang Pewarisan 1. Sebuah kelas dengan akses public bersifat visible oleh semua kelas dari semua package. Visibilitas kelas berarti sebuah kelas dapat: a. Membuat instance dari kelas lain yang visible b. Meng-extend sebuah kelas lain yang visible c. Mengakses method dan atribut dari kelas lain yang visible 2. Kelas dapat diberi modifier final atau abstract. a. Sebuah kelas tidak dapat final dan abstract sekaligus. b. Sebuah kelas yang final tidak dapat diturunkan. c. Sebuah kelas yang abstract tidak dapat diinstansiasi. d. Sebuah method abstract di dalam sebuah kelas berarti kelas tersebut adalah abstract. e. Sebuah kelas abstract dapat memiliki beberapa abstract dan juga beberapa concrete method. Concrete method ditandai dengan: i. Tidak diberi modifier abstract. ii. Memiliki kurung kurawal dan penutup pada deklarasi method-nya. f. Sebuah kelas concrete yang meng-extend sebuah kelas abstract harus mengimplementasikan seluruh method abstract pada superclass-nya. 4.2 Konsep Poliformisme Memahami proses terjadinya Virtual Method Invocation Tulislah listing program berikut ini dan amati yang terjadi pada saat terjadinya Virtual Method Invocation.

22

Gambar 4.3 Virtual Method Invocation Ketika program tersebut dijalankan, akan tampak hasil seperti di bawah ini : Nilai x = 5 Ini class Child Mengimplementasikan UML class diagram dalam program Suatu program terdiri dari class Pegawai sebagai parent class, dan class Manajer dan class Kurir sebagai subclass. Buatlah suatu program yang menerapkan konsep polymorphic argument sebagaimana yang telah disinggung dalam pembahasan sebelumnya.

Gambar 4.4 Contoh Class diagram 23

Transformasikan class diagram di atas ke dalam bentuk program?. Tulislah listing program berikut ini sebagai pengetesan.

Gambar 4.5 Implementasi class diagram Lakukan kompilasi pada program di atas dan jalankan. Bayaran untuk Manajer : 850 Bayaran untuk Programmer : 630 4.2.1 Overloading Mengimplementasikan UML class diagram dalam program untuk class Kalender

Gambar 4.6 Kelas Kalender Dari class diagram di atas, desainlah suatu class yang memenuhi konsep enkapsulasi. Untuk nilai inisialisasi, dipakai 1-1-2000. Pakailah kata kunci this untuk mempersingkat pengkodean. Tulislah listing program berikut ini sebagai pengetesan.

24

Gambar 4.7 Penggunaan kelas Kalender Lakukan kompilasi pada program di atas dan jalankan. Waktu awal : 8-1-2000 1 hari setelah waktu awal : 9-1-2000 Waktu berubah : 1-6-2003 1 bulan setelah itu : 1-7-2003 Waktu berubah : 20-10-2004 1. tahun setelah itu : 20-10-2005 4.2.2 Overriding Overriding adalah suatu keadaan di mana method pada subclass menolak method pada parent class-nya. Overriding mempunyai ciri-ciri sebagai berikut : 1. Nama method harus sama 2. Daftar parameter harus sama 3. Return type harus sama atau bertipe turunan dari return type parent class Berikut ini contoh terjadinya overriding di mana method Info() pada class Child mengoverride method Info() pada class parent:

25

Gambar 4.8 Contoh overloading Method yang terkena override (overridden method) diharuskan tidak boleh mempunyai modifier yang lebih luas aksesnya dari method yang meng-override (overriding method). 4.2.3 Beberapa Catatan Penting tentang Polimorfisme 1. Sebuah reference variable tidak dapat berubah tipe, tapi dapat merujuk ke obyek yang bertipe subclass variabel tersebut. 2. Sebuah obyek dapat diacu oleh beberapa reference variable selama memiliki tipe yang sama atau merupakan tipe superclass obyek tersebut. 3. Method yang dapat dipanggil ditentukan oleh tipe reference variable, bukan tipe obyeknya. 4. Method yang di-override yang digunakan ditentukan oleh tipe obyek, bukan tipe reference variable. 5. Terdapat dua jenis reference variable casting: ii. Downcasting: Sebuah reference variable merujuk kepada obyek bertipe subclass dapat diassign ke reference variable bertipe subclass dengan melakukan casting secara explisit. Reference variable bertipe subclass tersebut dapat mengakses properti dari kelas tipenya. class parent { } class child extends parent { } public class Main { public static void main(String[] args) { parent a = new child(); child b = (child) a; } } iii. Upcasting: Sebuah reference variable dapat di-assign ke reference variable bertipe superclassnya secara implisit. class parent { } class child extends parent { } public class Main { public static void main(String[] args) { child a = new child(); parent b = a; 26

} } 6. Hanya method yang diturunkan yang dapat di-override. Method yang bersifat private tidak diturunkan. Sebuah subclass menggunakan super.overridden_Method_Name() untuk memanggil versi superclass dari overridden method. 7. Sebuah method yang di-overload: a. Harus memiliki daftar argumen yang berbeda b. Boleh memiliki return type berbeda c. Boleh memiliki access specifier yang berbeda d. Method dari superclass dapat di-overload oleh subclass

27

5 Exception Handling
Overview Bab ini akan menjelaskan tentang Exception di Java, apa yang dimaksud dengan Exception, bagaimana menangkap Exception. Serta akan dijelaskan throwing exception dan membuat user define exception. Tujuan 1. 2. 3. 4. 5. Mengetahui tentang Exception di Java. Mengetahui kelas-kelas exception di Java Mengetahui bagaimana Exception muncul dan cara menangkap Exception Mengetahui cara melempar Exception Mengetahui tentang User Define Exception

Ketika sebuah exception muncul selama eksekusi program, dikatakan bahwa exception telah dilempar (exception is thrown). Ketika hal ini terjadi program diberhentikan dan program bisa rusak. Bagaimanapun, kegagalan program dapat dihindari jika exception yang dilempar dapat ditangkap dan dikelola sebagaimana mestinya. Sebuah exception dapat dilempar di suatu bagian program dan dapat ditangkap di bagian lain dari program tersebut. Exception yang tidak ditangkap akan membuat program gagal. Contoh : Jika terjadi pembagian dengan nol atau membuka file yang tidak ada, maka exception akan muncul. Ketika sebuah exception dilempar, hal yang sebenarnya dilempar adalah sebuah obyek. Obyek ini membawa informasi dari tempat di mana exception di tangkap dan dikelola. Biasanya sebuah obyek exception mengandung pesan error yang mendeskripsikan apa yang terjadi sehingga menyebabkan exception dan dapat berisi data lain. Semua obyek exception merupakan subclass dari kelas standar java.lang.Throwable, dan subclass ini diatur dalam hirarki kelas yang kompleks. Class Throwable mempunyai turunan Class yaitu class Error dan Exception. Kedua kelas ini nanti yang akan mempunyai beberapa turunan. Subclass yang ada di bawah Error merupakan kelas yang merepresentasikan error serius di dalam Java Vitual Machine yang membuat program di terminasi karena terdapat masalah. Umumnya, sebaiknya tidak dilakukan try catch pada error. Subclass Exception merepresentasikan exception yang biasanya disebut error tetapi error ini merupakan error yang dapat di atasi dengan cara tertentu. Kelas Exception mempunyai beberapa subclass seperti RunTimeException, InterruptedException, dan IOException. Exception RunTimeException mengelola exception yang muncul di dalam program ketika runtime. Untuk lebih lengkapnya, dapat dibaca di javadoc manual. Berikut beberapa penyebab exception muncul : Exception IllegalArgumentException Tabel 5.1 Contoh Exception Penyebab Muncul ketika memberikan argumen yang tidak sesuai dengan tipe data pada suatu method

ArrayIndexOutOfBoundsException Muncul ketika mengakses elemen array yang tidak terdapat pada array tersebut (melampui batas indeks) NumberFormatException Muncul ketika ingin mengubah sebuah string ke format numerik 28

ArithmeticException NullPointerException ClassCastException

Muncul ketika membuat sebuah error aritmatika seperti pembagian dengan nol

dalam

Muncul ketika suatu aplikasi berusaha menggunakan obyek tanpa mengalokasikan memori Muncul ketika terjadi kesalahan melakukan casting sebuah obyek

Exception secara umum dibagi dua: 1. Checked exception, yakni exception yang akan dicek pada saat dilakukan kompilasi. Exception ini terdiri dari seluruh turunan kelas Exception kecuali RunTimeException. Exception ini harus ditangani secara explisit menggunakan mekanisme exception handling. 2. Unchecked exception, yakni exception yang tidak dicek pada saat dilakukan kompilasi. Exception ini terdiri dari turunan kelas Error dan RunTimeException beserta seluruh turunannya. 5.1 Mengimplementasikan Exception Handling Ketika sebuah error muncul di dalam method, Java membuat sebuah obyek Exception. Setelah membuat obyek exception, Java mengirimkannya ke program dengan melemparkan exception (throwing exception). Exception yang dlempar perlu ditangani menggunakan exception handler dan diproses. Untuk mengimplementasikan Exception handling digunakan keyword berikut : o Try o Catch o Finally o Throw o Throws 5.1.1 Statement Try dan Catch Untuk menangkap exception di dalam program java, diperlukan Statement try. Blok Statement try membingkai kode yang kemungkinan akan memunculkan exception dan mendefinisikan exception handler yang dapat menanganinya. Blok catch digunakan sebagai exception handler. Blok try harus mempunyai minimal satu buah blok catch yang mengikutinya. Klausa catch menspesifikasikan tipe exception yang akan ditangani. Lingkup dari blok catch dibatasi oleh Statement yang ada di dalam blok try. Statement untuk mendeklarasikan blok try catch : try { //Statements that cause an exception } catch(<exception name> <object name>){ //error handling code } Komputer akan mengeksekusi statement yang ada di dalam blok try. Jika tidak ada exception yang muncul ketika dieksekusi maka Statement catch tidak akan di jalankan. Jika sebuah exception muncul maka blok catch akan langsung dijalankan. Contoh : public class ArithmeticException{ public static void main (String[] args){ int num1=5, num2=0; int num3=num1/num2; 29

System.out.println(The num3 = +num3); } } Jika program di atas di compile maka tidak ada error, tetapi setelah di eksekusi, handler pada Java runtime sistem akan melempar sebuah exception ketika terjadi pembagian dengan nol sehingga akan dibuat sebuah obyek dari kelas exception yang dilempar yaitu ArithmeticException. Jika sebuah exception muncul di dalam blok try maka exception handler yang berkaitan akan menangani exception tersebut, pada contoh di atas karena muncul exception ArithmeticException maka akan dibuat exception handler untuk ArithmeticException public class ArithmeticException{ public static void main (String[] args){ int num1=5, num2=0; try{ int num3=num1/num2; System.out.println(The num3 = +num3); } catch(ArithmeticException obj){ System.out.println(Division by zero); } } } Dengan menangani exception maka program terhindar dari kerusakan. Sebelum isi dari catch dieksekusi, obyek yang merepresentasikan exception diletakkan ke dalam variabel obj, yang berisi data tentang exception. 5.1.2 Multiple Catch Sebuah blok try dapat diikuti oleh banyak blok catch. Hal ini penting ketika sebuah blok try mempunyai Statement yang mungkin akan memunculkan berbagai tipe exception. Contoh : public class MultipleCatch{ public static void main (String[] args){ int num1=5, num2=0; int arrNum[]= {1,2,3 }; try{ int num3=num1/num2; System.out.println(The num3 = +num3); System.out.println(The 3 elemen is +ArrNum[3]); } catch(ArithmeticException obj){ System.out.println(Division by zero); } catch(ArrayIndexOutOfBondException obj){ System.out.println(ErrorOut Of Bounds); } 30

catch(Exception obj){ System.out.println(Other error); } } } Pada kode di atas terdapat tiga catch untuk menangani exception yaitu ArithmeticException, ArrayIndexOutOfBoundException, dan Exception. Blok catch yang pertama akan dieksekusi jika di dalam blok try melempar ArithmeticException, blok catch yang kedua akan dieksekusi jika di dalam blok try melempar ArrayIndexOutOfBoundException, dan blok catch yang terakhir akan menangkap exception yang lain. Ketika program mengeksekusi int num3=num1/num2;, maka ArithmeticException akan muncul dan akan ditangkap oleh blok catch yang pertama (ArithmeticException obj). Kelas Exception merupakan superclass dari semua tipe kelas exception. Jika blok catch yang pertama berisi obyek dari kelas Exception maka blok catch berikutnya tidak akan dieksekusi, hal ini disebut unreachable code. Untuk menghindari error unreachable code, maka catch yang di dalamnya mengandung kelas Exception diletakkan pada urutan blok catch yang terakhir. 5.1.3 Statement Finally Statement yang berada di dalam blok finally akan dieksekusi paling akhir ketika sedang mengeksekusi blok try, meskipun tidak ada exception yang muncul atau ada exception yang muncul. Statement finally digunakan untuk melakukan sesuatu yang penting ketika terdapat exception atau tidak. Sintaks try-catch-finaly : try{ //block of code } catch (<exception name> <object name>){ //block of exception code } finally{ //block of code that is always executed } Jika sebuah exception dilempar atau tidak dilempar, blok finally akan dieksekusi meskipun tidak ada Statement catch yang cocok dengan exception yang muncul. Untuk menghindari duplikasi kode maka dapat diletakkan di dalam blok finally. Blok finally merupakan pilihan, boleh ada atau tidak di dalam try catch blok, tetapi hanya satu blok finally saja yang dapat dibuat dalam satu buah blok try. 5.1.4 Throwing Exception Suatu saat dibutuhkan untuk melempar exception pada program yang dibuat. Hal ini terjadi jika di dalam program ditemukan beberapa exceptional atau kondisi error tetapi tidak ada alasan untuk menangani error tersebut di mana permasalahan ditemukan. Program dapat melempar sebuah exception dengan harapan dapat ditangkap dan ditangani oleh blok catch. Hal ini dapat dilakukan dengan melempar exception secara eksplisit dengan menggunakan Statement throw. Contoh: dibutuhkan untuk melempar exception ketika user salah memasukkan nilai. Statement throw akan menyebabkan terminasi dari aliran control program Java dan menghentikan eksekusi ketika Statement tersebut dieksekusi. Exception yang dilempar oleh Statement throw akan ditangkap oleh blok catah yang ada, jika tidak ada blok catch yang sesuai dengan exception yang dilempar maka program akan diterminasi. Contoh pengggunaan Statement throw: public class ThrowingStatement{ 31

static double root(double A,double B, double C){ double disc=0; try { if(A==0){ throw new IllegalArgumentException("A can't be zero"); } else{ disc = (B*B)-(4*A*C); if (disc<0) throw new IllegalArgumentException("Discriminant< 0"); } } //endtry catch(IllegalArgumentException obj){ System.out.println("Illegal Argument in : "+obj); } return ((-B + Math.sqrt(disc))/(2*A)); } public static void main(String[] args){ double Ans = root(0,2,4); } } Program di atas mempunyai kondisi A!= 0dan B*B-4*A*C>=0. Method akan melempar sebuah exception IllegalArgumentException jika kondisi tersebut tidak terpenuhi. Ketika sebuah kondisi illegal ditemukan dalam method, melempar sebuah exception merupakan cara yang masuk akal. Jika program yang memanggil method mengetahui cara menangani error, maka dapat menangkap exception, jika tidak maka program akan rusak dan harus diperbaiki. Statement Throws digunakan oleh method untuk menspesifikasikan tipe-tipe exception yang akan dilempar di dalam method. Jika method yang melempar exception tidak dapat menanganinya maka exception harus ditangani oleh bagian yang memanggil method tersebut. Hal ini dilakukan dengan Statement throws. Statement throws digunakan untuk menuliskan tipe-tipe exception yang terdapat di dalam method. Contoh : class ThrowingStatement{ static double root(double IllegalArgumentException{ double disc=0; if(A==0){ throw new IllegalArgumentException("A can't be zero"); } 32 A,double B, double C) throws

else{ disc = (B*B)-(4*A*C); if (disc<0) throw new IllegalArgumentException("Discriminant< 0"); } return ((-B + Math.sqrt(disc))/(2*A)); } public static void main (String[] args){ double Ans; try{ Ans = root(0,2,4); } catch(IllegalArgumentException obj){ System.out.println("Illegal Argument in : "+obj); } } } 5.2 User defined Exception User defined exception merupakan exception yang dibuat oleh programmer sesuai dengan permintaan pada aplikasi. Tiap aplikasi yang dibuat kemungkinan mempunyai batasan yang spesifik. Statement throw, throws, try, catch, dan finally digunakan dalam mengimplementasikan user define exception. Kelas Exception menuruni semua method yang ada di dalam kelas Throwable. User defined exception juga menuruni semua method yang didefinisikan di dalam kelas Throwable. Contoh : class MyException extends Exception{ public String toString(){ return "MyException caught : The Input value cannot less than 0"; } } public class UserException { static int TestUAQ, TestUTQ; static void setValue(int UAQ,int UTQ) throws MyException{ if ((UAQ<0)||(UTQ<0)) throw new MyException(); TestUAQ=UAQ; TestUTQ=UTQ; System.out.println("The value UAQ : "+TestUAQ+", UTQ : "+TestUTQ); 33

} public static void main (String[] args){ try{ setValue(80,90); setValue(-70,60); } catch(MyException obj){ System.out.println("The Exception raised : "+obj); } } } 5.3 Beberapa Catatan tentang Exception 1. 2. 3. 4. 5. 6. Pada multiple catch exception, exception yang merupakan superclass harus berada di bawah exception subclass-nya. Kode program pada klausa finally akan selalu dieksekusi, meskipun terjadi exception atau tidak, meskipun exception yang ada berhasil ditangani atau tidak. Sebuah method yang meng-override tidak dapat mendeklarasikan checked exception baru yang tidak dideklarasikan oleh method yang di-override. Sebuah method yang meng-override tidak dapat mendeklarasikan checked exception yang merupakan superclass dari exception yang dideklarasikan pada method yang di-override. Sebuah method yang meng-override dapat mendeklarasikan checked exception yang merupakan turunan dari exception yang dideklarasikan pada method yang di-override. Sebuah method yang meng-override dapat mendeklarasikan segala jenis unchecked exception tanpa peduli apakah exception tersebut dideklarasikan oleh method yang di-override.

34

6 Input/Output
Overview Dalam bab ini akan dibahas tentang bagaimana cara melakukan pengaksesan data kedalam file, baik melakukan proses pembacaan ataupun penulisan. Akan dibahas tentang pengaksesan data menggunakan stream dan random access file. Tujuan 1. Penggunaan file menggunakan kelas File. 2. Penggunaan byte stream. 3. Penggunaan character stream. 4. Pengaksesan dengan random-access file 6.1 Implementasi Kelas File Kelas file dalam package java.io menyediakan berbagai macam method untuk mengakses atributatribut dari file dan direktori, seperti hak akses dari, tanggal pembuatan dan akses, alamat dari direktori di mana file tersebut berada, dan lain-lain. Sebuah obyek yang dibuat dari kelas File yang akan merepresentasikan file atau direktori. Terdapat beberapa konstruktor yang bisa kita gunakan untuk membuat instance pada kelas File: 1. File(File obyekDirektori, String namaFile): Membuat sebuah instance pada kelas File di mana obyekDirektori adalah sebuah obyek dari kelas File yang menunjuk sebuah direktori, sedang namaFile adalah file yang akan diakses. 2. File (String alamatDirektori): Membuat sebuah obyek dari kelas File. alamatDirektori merupakan alamat di direktori mana file yang akan diakses berada. 3. File(String alamatDirektori, String namaFile): Membuat sebuah obyek dari kelas File. alamatDirektori menentukan alamat direktori dari file sedangkan nama file menentukan file mana yang akan diakses. Keterangan: Alamat disini bisa berupa alamat absolut atau alamat relatif. Terdapat beberapa method yang bisa digunakan di dalam sebuah obyek dari kelas File, antara lain: Tabel 6.1 Method dalam kelas File Method Keterangan

boolean canRead() Akan mengembalikan nilai true jika file yang sedang diakses saat ini dapat dibaca (readable). Jika tidak akan mengembalikan nilai false. boolean canWrite() boolean exists() Akan mengembalikan nilai true jika file bisa ditulis (writable). Jika tidak akan mengembalikan nilai false Akan mengembalikan nilai true jika argumen yang ditunjuk pada konstruktor instantiasi obyek merupakan sebuah file atau direktori. Jika bukan file atau direktori akan mengembalikan nilai false. Akan mengembalikan nilai true jika argumen yang ditulis dalam 35

boolean isFile()

konstruktor merupakan sebuah file. Selain itu akan bernilai false. boolean isDirectory() boolean isAbsolute() Akan mengembalikan nilai true jika argumen yang ditulis dalam konstruktor adalah sebuah direktori. Selain itu akan mengembalikan nilai false. Akan mengembalikan nilai true jika argument yang ditulis dalam konstruktor adalah sebuah alamat absolut dari file atau direktori. Selain itu akan mengembalikan nilai false.

Akan mengembalikan sebuah string alamat absolut dari sebuah file atau String getAbsolutePath() direktori. String getName() String getPath() String getParent() long length() long lastModified() String[] list() Akan mengembalikan sebuah string nama dari file atau direktori. Akan mengembalikan sebuah string alamat dari di mana file atau direktori tersebut. Akan mengembalikan sebuah string alamat induk dari file atau direktori tersebut. (direktori di mana file atau direktori tersebut disimpan) Mengembalikan panjang dari file, dalam ukuran byte. Jika berupa sebuah direktori akan mengembalikan nilai 0 (nol). Akan mengembalikan sebuah representasi waktu kapan terakhir kali file atau direktori tersebut dimodifikasi. Akan mengembalikan sebuah array berbentuk string yang akan menyimpan daftar isi (file dan direktori) dari sebuah direktori. Jika bukan sebuah direktori akan mengembalikan nilai null.

Berikut adalah contoh penggunaan kelas File. import java.io.File; import java.io.IOException; class AksesFile{ String daftar[] = new String[20]; public void displayData() { try { File obj1 = new File("D:\\IO","KelasFile.java"); File obj2 = new File("D:\\IO"); System.out.println("Sebuah obyek file"); System.out.println("Nama File System.out.println("getPath System.out.println("Lokasi System.out.println("Panjang : "+obj1.getName()); : "+obj1.getPath()); : "+obj1.getParent()); : "+obj1.length()); 36 System.out.println("getAbsolutPath : "+obj1.getAbsolutePath());

System.out.println("Last Modif System.out.println();

: "+obj1.lastModified());

System.out.println("Sebuah obyek Direktori"); System.out.println("Nama Direktori : "+obj2.getName()); System.out.println("getAbsolutPath : "+obj2.getAbsolutePath()); System.out.println("getPath System.out.println("Lokasi System.out.println("Panjang System.out.println("last Modif daftar = obj2.list(); System.out.println("Isi dari direktori : "); for (int i=0;i<daftar.length;i++) { System.out.println("\t"+daftar[i]); } } catch (Exception e) { System.out.println(e); } } } public class KelasFile { public static void main(String[] args){ AksesFile aksesFile = new AksesFile(); aksesFile.displayData(); } } Keluaran dari program di atas adalah: : "+obj2.getPath()); : "+obj2.getParent()); : "+obj2.length()); : "+obj2.lastModified());

37

Gambar 6.1 Contoh penggunaan File 6.2 Penggunaan Stream dalam Java Stream dalam sebuah program java digunakan untuk melakukan pembacaan atau penulisan kedalam sebuah asal (source) atau tujuan (destination). Operasi Input output (I/O) terdiri dari dua bagian, yaitu input yang berasal dari sebuah sumber (misal sebuah keyboard, jaringan komputer, file) kemudian data masukan tadi akan diproses dan akan dikeluarkan menuju sebuah tujuan (misal monitor, jaringan komputer, file). Di dalam Java, package java.io terdiri dari berbagai macam kelas dan interface stream I/O yang mendukung operasi I/O. Stream dibagi menjadi dua jenis, byte stream dengan unit dasar satu byte data dan character stream dengan dasar satu karakter Unicode. 6.2.1 Implementasi Byte Stream Byte stream menggunakan byte sebagai unit dasar operasi baca dan tulis terhadap streamnya. Terdapat dua Kelas byte stream yaitu InputStream dan OutputStream. 6.2.1.1 Ouput Stream Kelas OutputStream merupakan stream yang digunakan untuk menulis data dalam bentuk byte. Beberapa contohnya adalah digunakan untuk menulis kedalam layar monitor atau file. Beberapa method yang digunakan dalam kelas OutputStream Method write(byte b) write(byte b[]) write(byte b[], int offset, int length) close() flush() Tabel 6.2 Method pada kelas OutputStream Keterangan Menulis sekian b byte kedalam sebuah file. Menulis array berisi byte kedalam sebuah file. Menulis kedalam byte di mana datanya berasal dari sebuah array b, dimulai dari lokasi offset sebanyak sekian length byte. Menutup stream output. Menghapus buffer stream output.

Kelas System dalam package java.lang memiliki sebuah variabel statik yang digunakan untuk merepresentasikan sebuah layar monitor. Variabel tersebut adalah System.out, yang merupakan instance dari kelas PrintStream yang bisa menggunakan method write() untuk menulis kedalam layar monitor. Contoh penggunaannya sebagai berikut. import java.io.*; public class CobaSystemOut { public static void main(String[] args) { byte[] data = new byte[10]; int panjang=0; System.out.print("Masukkan data try { panjang=System.in.read(data); 38 : ");

System.out.print("Yang anda ketik System.out.write(data);

: ");

System.out.println("Panjang Karakter : "+panjang); System.out.print("index ke-1 sebnyk 3 : "); System.out.write(data,1,3); } catch (IOException e) { System.out.print("Terjadi Exception"); } } } Untuk melakukan operasi penulisan ke dalam sebuah file digunakan kelas FileOutputStream. Beberapa konstruktor yang bisa digunakan dalam kelas FileOutputStream adalah: 1. FileOutputStream(File objFile): Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. objFile merupakan sebuah file obyek yang merepresentasikan sebuah file. 2. FileOutputStream(String alamatFile): Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. String alamatFile merupakan alamat dari file yang akan dijadikan tujuan penulisan. 3. FileOutputStream(File objFile, boolean bool): Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. objFile merupakan sebuah file obyek yang merepresentasikan sebuah file, sedang boolean bool jika bernilai true menunjukkan bahwa penulisan file dilakukan dalam mode append (penambahan data di akhir file) 4. FileOutputStream(String s, boolean bool): Membuat sebuah obyek File stream yang menghubungkan dengan sebuah file. String alamatFile merupakan alamat dari file yang akan dijadikan tujuan penulisan, sedang boolean bool jika bernilai true menunjukkan bahwa penulisan file dilakukan dalam mode append (penambahan data di akhir file) Beberapa method untuk melakukan penulisan kedalam stream dengan kelas FileOutputStream Method write(byte b) write(byte b[], int offset, int length) Tabel 6.3 Method dalam kelas FileOutputStream Keterangan Menulis byte b kedalam file stream. Menulis sejumlah length byte dari posisi offset kedalam file stream, sebanyak length byte.

Berikut adalah contoh dari penggunaan FileOutputStream. import java.io.*; public class ContohFOS { public static void main(String args[]){ 39

byte buffer[]=new byte[100]; try{ System.out.println("Masukkan data:"); System.in.read(buffer, 0, 100); } catch(IOException e){ System.out.println(e); } try{ FileOutputStream objFOS; objFOS= new FileOutputStream("textFOS.txt"); objFOS.write(buffer); System.out.println("Data telah ditulis..."); } catch(FileNotFoundException f){ System.out.println(f); } catch(IOException i){ System.out.println(i); } } } Runtime dari kode di atas

Gambar 6.2 Contoh FOS Hasil penulisan dalam file textFOS.txt

40

Gambar 6.3 textFOS.txt 6.2.1.2 Input Stream Input stream adalah stream yang membaca data dalam bentuk byte. Java menyediakan kelas InputStream yang merupakan kelas abstrak untuk melakukan proses input untuk membaca data dari berbagai macam sumber (seperti file, keyboard dan jaringan) dan menampilkan datanya kedalam layar monitor. Beberapa method yang digunakan dalam kelas InputStream. Tabel 6.4 Method InputStream Method int read() int read(byte b[]) int read(byte b[], int offset, int length) Keterangan Membaca satu byte data dari input stream. Membaca beberapa byte dari input stream dan memasukkannya kedalam array b Membaca sebanyak length byte dari stream dan memasukkannya kedalam array b. Jika memasuki akhir dari stream akan mengembalikan nilai -1 available() long skip(long n) mark(int nbyte): reset(): void close() Mengembalikan jumlah byte yang bisa dibaca dari sebuah stream. Melewatkan sekian n byte dari input stream. Menandai posisi yang ada pada input stream saat ini. Mengembalikan posisi kepada lokasi yang telah ditandai dari method mark. Menutup input stream dan melepaskan sumber daya yang terikat pada stream tersebut.

Kelas System dalam package java.lang memiliki satu anggota static yang merupakan referensi dari sebuah keyboard. Variabel dengan nama System.in merupakan sebuah instance dari kelas InputStream yang dapat digunakan untuk membaca dari dari keyboard. Berikut adalah contoh penggunaan System.in yang akan digunakan untuk membaca inputan user dari keyboard. public class CobaSystemIn{ public static void main(String args[]){ byte buffer[]=new byte[80]; System.out.print("Ketik sesuatu, "); System.out.print("akhiri dengan "); System.out.println("menekan tombol enter"); try { System.in.read(buffer); } catch(Exception e) { 41

System.out.println(e); } System.out.println(); String str=new String(buffer); System.out.println("isi Teks:"); System.out.print(str); } } Berikut adalah hasil dari kode di atas:

Gambar 6.4 Obyek System.in Untuk melakukan operasi input pembacaan data dari dalam file digunakan kelas FileInputStream. Berikut adalah beberapa konstruktor yang bisa digunakan dalam kelas FileInputStream. 1. FileInputStream(File namaFile): Membuat sebuah obyek yang akan menggunakan file dengan nama namaFile sebagai sumber inputannya. 2. FileInputStream(String alamatFile): Membuat sebuah obyek yang akan menggunakan sebuah file dengan alamat alamatFile (berbentuk string) sebagai sumber inputannya. 3. FileInputStream(FileDescriptor obyekFile): Membuat sebuah obyek yang akan menggunakan sebuah obyekfile yang sudah ditentukan sebelumnya sebagai sumber inputannya. Beberapa method yang digunakan dalam kelas FileInputStream Tabel 6.5 Method dalam kelas FileInputStream Method read() read(byte b[], int offset, int length) long skip(long n) Keterangan Membaca satu byte data dari stream inputan. Membaca sekian length byte data dari stream input dan memasukkannya kedalam sebuah array b. Melewatkan sekian n byte data dari stream input.

Berikut adalah contoh penggunaan FileInputStream. 42

import java.io.*; public class ContohFIS{ public static void main(String args[]){ byte buffer[]=new byte[100]; try{ FileInputStream file=new FileInputStream("dokumen.txt"); file.read(buffer,0,50); } catch(Exception e){ System.out.println(e); } System.out.println("Isi file dokumen.txt adalah:"); String str=new String(buffer); System.out.println(str); } } Berikut adalah hasil dari kode di atas

Gambar 6.5 Contoh FIS 6.2.2 Implementasi Character Stream Kelas-kelas stream karakter menangani proses I/O dengan basis unit adalah sebuah karakter dengan menggunakan representasi Unicode yang disimbolkan dengan 16 bit. Stream karakter terdiri dari kelas-kelas Reader dan Writer dalam package java.io. 6.2.2.1 Kelas Reader Kelas java.io.Reader merupakan sebuah kelas abstrak yang menyediakan berbagai macam method untuk melakukan proses pembacaan dalam bentuk karakter Unicode dari berbagai sumber data seperti harddisk, keyboard atau memori. Karena merupakan sebuah kelas abstrak, maka kelas ini tidak bisa diinstantiasi, tetapi sub-kelasnya lah yang akan digunakan untuk proses pembacaan data. Terdapat berbagai macam method dalam kelas Reader, tetapi sebenarnya hanya method read() dan close() saja yang kita perlukan. Method int read() Tabel 6.6 Method dalam kelas Reader Keterangan Membaca satu karakter dan mengembalikan sebuah nilai 43

integer dari karakter yang dibaca. Jika yang dibaca adalah EOF maka akan dikembalikan nilai -1. int read(char buffer[]) Membaca karakter dan memasukkannya kedalam sebuah array buffer dan mengembalikan sebuah bilangan dari karakter yang dibaca. Jika EOF akan mengembalikan nilai -1 Menutup stream.

abstract void close() Kelas FileReader

Kelas FileReader digunakan untuk membaca karakter dari dalam file, tetapi kelas ini tidak memiliki method di dalamnya. Method-nya sendiri diturunkan dari kelas induknya yaitu Reader dan InputStreamReader. Terdapat beberapa konstruktor dala kelas FileReader ini. 1. FileReader(File objFile) Membuat sebuah kelas FileReader dengan inputan sebuah obyek objFile. 2. FileReader(String namaFile) Membuat sebuah kelas FileReader dengan inputan sebuah nama namaFile. Berikut adalah contoh penggunaan FileReader import java.io.*; public class contohFR{ public static void main(String args[]){ try{ File file=new File("cthFileReader.txt"); FileReader f=new FileReader(file); int ch; while((ch=f.read())!=-1){ System.out.print((char)ch); } } catch(FileNotFoundException fnf){ System.out.println(fnf); } catch(IOException io){ System.out.println(io); } } } File yang akan dibaca dari kode di atas berisi hal berikut.

44

Gambar 6.6 Contoh FileReader Berikut adalah hasil eksekusi dari kode di atas

Gambar 6.7 Hasil eksekusi FileReader Kelas BufferedReader Kelas BufferedReader membaca teks dalam bentuk stream karakter dan memasukkannya kedalam sebuah buffer di dalam stream input. Dengan menggunakan buffer, maka proses pembacaan bisa dilakukan lebih dari satu kali pada saat yang sama, sehingga bisa lebih meningkatkan performansi dari aplikasi. Contoh penggunaan dari kelas ini adalah untuk mendapatkan inputan dari user melalui konsole. Beberapa konstruktor dari kelas BufferedReader ini. 1. BufferedReader(Reader objStream) Membuat sebuah obyek BufferedReader dengan ukuran buffer default. 2. BufferedReader(Reader objStream, int ukuranBuffer) Membuat sebuah obyek BufferedReader dengan ukuran buffer sebesar ukuranBuffer. Berikut adalah contoh dari BufferedReader import java.io.*; public class contohBR{ public static void main(String args[]){ System.out.println("Ketik :"); BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); String str=new String(); try{ str=br.readLine(); } catch(IOException io){ 45

System.out.println(io); } System.out.println(); System.out.println("Isi ketikan: "); System.out.println(str); } } Hasil dari kode di atas adalah

Gambar 6.8 Contoh BufferedReader 6.2.2.2 Kelas Writer Kelas java.io.Writer merupakan sebuah kelas abstrak yang menyediakan berbagai macam method untuk melakukan proses penulisan dalam bentuk karakter Unicode ke berbagai tujuan data seperti harddisk dan monitor. Karena merupakan sebuah kelas abstrak, maka kelas ini tidak bisa diinstantiasi, tetapi sub-kelasnya lah yang akan digunakan untuk proses pembacaan data. Berikut adalah kelas-kelas turunan dari kelas Writer. Terdapat banyak method dalam kelas Writer, tetapi hanya method write(), flush() dan close() saja yang kita butuhkan. Method int write(int ch) int write(char buffer[]) abstract void close() Void flush() Kelas FileWriter Kelas FileWriter digunakan untuk menulis data kedalam sebuah file, tetapi kelas ini tidak memiliki method di dalamnya. Methodnya sendiri diturunkan dari kelas induknya yaitu Writer dan OutputStreamReader. Terdapat beberapa konstruktor dala kelas FileWriter ini. 1. FileWriter(String namaFile) Membuat sebuah obyek FileWriter dengan parameter inputan nama file yang akan ditulis. 2. FileWriter(String namaFile, boolean boolAppend) Membuat sebuah obyek FileWriter dengan parameter inputan nama file yang akan ditulis, sedangkan boolAppend digunakan untuk menentukan bahwa penulisan akan dilakukaan secara menambahkan data di bagian paling bawah jika boolAppend bernilai true. 46 Tabel 6.7 Method dalam kelas Writer Keterangan Menulis sebuah karakter kedalam stream output-karakter. Menulis sebuah array karakter kedalam stream outputkarakter. Menutup stream. Mem-flush buffer output

3. FileWriter(File objFile) Membuat sebuah obyek FileWriter dengan parameter inputan sebuah obyek dari kelas File. Berikut adalah contoh dari penggunaan kelas FileWriter. import java.io.*; public class ContohFW{ public static void main (String args[]){ String str="contoh dari"; String str2="penggunaan kelas FileWriter"; try{ FileWriter fout = new FileWriter("cthFileWriter.txt" ); fout.write(str, 0, str.length() ); fout.write(str2, 0, str2.length() ); System.out.println("Data sudah ditulis..."); fout.close(); } catch (IOException io){ System.out.println(io); } } } Hasil dari kode di atas

Gambar 6.9 Contoh FileWriter File cthFileWriter.txt akan berisi.

Gambar 6.10 Isi cthFileWriter.txt 47

Kelas PrintWriter Kelas PrintWriter merupakan turunan dari kelas Writer dan akan menuliskan karakter yang telah terformat kedalam stream karakter output. Di dalam kelas ini terdapat beberapa method yang akan digunakan yaitu print() dan println(). Terdapat beberapa konstruktor dalam kelas ini. 1. PrintWriter(OutputStream streamObj) Membuat sebuah obyek dari kelas PrintWriter dengan menggunakan obyek dari kelas OutputStream. 2. PrintWriter(OutputStream streamObj, boolean autoflush) Membuat sebuah obyek dari kelas PrintWriter dengan menggunakan obyek dari kelas OutputStream. Parameter autoflush menandakan bahwa method println() akan memflush kedalam buffer output. 3. PrintWriter(Writer outWriter, boolean autoflush) Membuat sebuah obyek dari kelas PrintWriter dengan menggunakan obyek dari karakter stream output. Parameter autoflush menandakan bahwa method println() akan memflush kedalam buffer output. Contoh penggunaan kelas PrintWriter. import java.io.*; public class contohPW{ public static void main(String args[]){ PrintWriter pw=null; try{ FileWriter file=new FileWriter("cthPrintWriter.txt"); pw=new PrintWriter(file); } catch(IOException io){ System.out.println(io); } pw.print("30108999:"); pw.print("Chairil Anwar:"); pw.print("Bandung"); pw.println(); pw.print("30208999:"); pw.print("Budiman:"); pw.print("Jakarta"); pw.println(); pw.print("30308999:"); pw.print("Agus Subagus:"); pw.print("Subang"); 48

pw.println(); System.out.println("Data Telah Ditulis..."); pw.close(); } } Eksekusi dari kode di atas

Gambar 6.11 Contoh PrintWriter Hasil penyimpanan data di atas pada file cthPrintWriter.txt

Gambar 6.12 Isi cthPrintWriter.txt 6.3 Implementasi RandomAccessFile

Random access file (pengaksesan file secara acak) memungkinkan kita untuk mengakses isi dari sebuah file secara tidak berurutan. Dengan cara ini kita bisa membaca dan menulis data teks dan byte pada lokasi manapun dalam sebuah file. Ambil sebuah kasus ketika yang kita inginkan tidak semua teks dari sebuah file kita butuhkan, tetapi hanya pada posisi tertentu saja, misal pada baris ke-sekian. Maka dengan menggunakan Random access file ini kita bisa langsung menuju ke posisi yang diinginkan dan mengambil teks yang kita butuhkan saja. Kelas java.io.RandomAccessFile mengimplementasikan sebuah interface DataInput dan DataOutput yang bisa digunakana untuk melakukan proses baca dan tulis kedalam file. Di dalam kelas ini, kita harus mendefinisikan proses apa yang akan kita lakukan, apakah membaca atau juga akan menulis kedalam file tersebut. Terdapat beberapa konstruktor yang bisa digunakan dalam kelas RandomAccessFile, antara lain: 1. RandomAccessFile(File obyekFile, String mode): Membuat sebuah obyek dari kelas RandomAccessFile, di mana argumen obyekFile adalah obyek yang menentukan file mana yang akan dibuka, sedangkan argumen mode menentukan jenis hak akses pembukaan file tersebut. 2. RandomAccessFile(String namaFile, String mode):

49

Membuat sebuah obyek dari kelas RandomAccessFile, di mana argumen namaFile adalah nama dari file yang akan dibuka, sedang argumen mode menentukan jenis hak akses pembukaan file tersebut. Terdapat beberapa jenis hak akses pembukaan file, antara lain: Nilai "r" Tabel 6.8 Jenis akses pembukaan file Keterangan Membuka file hanya untuk dilakukan proses pembacaan saja. Jika dilakukan proses penulisan pada obyek ini maka akan menghasilkan sebuah IOException Membuka sebuah file untuk dilakukan proses baca dan tulis. Jika file yang ditunjuk tidak ada, maka akan dibuat sebuah file baru. Membuka sebuah file untuk dilakukan proses baca dan tulis, sebagaimana mode rw, untuk mode s juga akan dilakukan proses update terhadap isi dan metadata dari file tersebut, yang akan dituliskan secara tersinkronisasi. Membuka sebuah file untuk dilakukan proses baca dan tulis, sebagaimana mode rw, untuk mode s juga akan dilakukan proses update terhadap isi dari file tersebut, yang akan dituliskan secara tersinkronisasi.

"rw" "rws"

"rwd"

Terdapat beberapa method yang bisa digunakan di dalam sebuah obyek dari kelas File, antara lain: Tabel 6.9 Method dalam kelas RandomAccessFile Method void close() Keterangan Menutup sebuah obyek RandomAccessFile dan melepas semua sumber daya yang digunakan, seperti stream dan pointer yang digunakan dalam file tersebut. Mendapatkan posisi pointer saat ini di dalam sebuah file. Mendapatkan panjang dari sebuah file. Menentukan posisi pointer kepada lokasi yang ditentukan (posisi sebelum lokasi tersebut). Akan melewati sekian n byte karakter dari posisi sekarang.

long getFilePointer() long length() void seek(long position) int skipBytes(int n)

Berikut adalah contoh penggunaan RandomAccessFile. import java.io.RandomAccessFile; import java.io.IOException; class RAC{ RandomAccessFile file=null; 50

public void aksesFile(){ try{ /* membuka file work.txt, dengan mode akses read dan write jika file tidak ditemukan, maka akan dibuat sebuah file baru */ file=new RandomAccessFile("work.txt","rw"); file.writeChar('A'); file.writeChar('K'); file.writeInt(4); file.writeInt(6); file.seek(0); System.out.println(file.readChar()); System.out.println(file.readChar()); System.out.println(file.readInt()); System.out.println(file.readInt()); file.close(); } catch(IOException e){ System.out.println("Exception: " +e); } } } class ContohRandomAccessFile{ public static void main(String[] args){ RAC obj = new RAC(); obj.aksesFile(); } } Ouput dari contoh di atas

51

Gambar 6.13 Contoh RandomAccessFile

7 Multithreading
Overview Sebuah program sekuensial berarti sebuah program yang hanya memiliki satu aliran eksekusi. Setiap eksekusi, ia memiliki sebuah titik awal eksekusi, kemudian sebuah sekuen eksekusi, dan kemudian berakhir. Selama runtime, pasti hanya satu proses yang telah dieksekusi. Bagaimanapun juga, di dunia nyata, pasti dibutuhkan sesuatu yang dapat mengatur proses yang terjadi dan berjalan bersamasama.Oleh karena itu, thread hadir untuk menjadi solusi dalam mengatasi permasalahan tersebut. Tujuan 1. Mampu mendefinisikan threads 2. Mengerti perbedaan state dalam threads 3. Mengerti konsep prioritas dalam threads 4. Mengetahui bagaimana menggunakan method di dalam class Thread 5. Membuat sendiri sebuah thread 6. Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling bergantung satu dengan yang lainya 7. Memungkinkan thread untuk dapat berkomunikasi dengan thread lain yang sedang berjalan 8. Mengerti dan menggunakan kemampuan concurency 7.1 Multithreading di Java Sebuah thread merupakan sebuah pengontrol aliran program. Untuk lebih mudahnya, bayangkanlah thread sebagai sebuah proses yang akan dieksekusi di dalam sebuah program tertentu. Java mendukung adanya Multithreading. Pada saat menjalankan Program, sebuah thread utama akan dibuat oleh Java untuk mengeksekusi Program tersebut, yang dimulai dengan memanggil method main(). Untuk membuat thread baru yang terpisah dari thread utama, terdapat dua cara yang dapat dilakukan yakni: Membuat class yang mengimplementasikan interface Runnable dan mengimplementasikan method run() Membuat class yang merupakan turunan dari class Thread dan meng-override method run(). Berikut terdapat sebuah contoh kelas yang tidak menggunakan Thread. class HelloRunner { int i; public void tampil() { i = 0; while (i<5) { System.out.println("Hello " + i++); } } } public class DemoThread1 { 52

public static void main(String args[]) { HelloRunner r1 = new HelloRunner(); HelloRunner r2 = new HelloRunner(); System.out.println("Jalankan Hello Runner 1"); r1.tampil(); System.out.println("Jalankan Hello Runner 2"); r2.tampil(); System.out.println("Selesai"); } } Berikut kode program untuk membuat Thread dengan mengimplementasikan interface Runnable. class HelloRunner implements Runnable{ int i; public void run() { Thread tr = Thread.currentThread(); i = 0; while (i<5) { System.out.println(tr.getName()+" : Hello " + i++); try { Thread.sleep(500); } catch (InterruptedException e) { System.out.println("Program di interrupt"); } } } } public class DemoThread3 { public static void main(String args[]) { HelloRunner r1 = new HelloRunner(); HelloRunner r2 = new HelloRunner(); Thread t1 = new Thread(r1); Thread t2 = new Thread(r2); t1.start(); t2.start(); } } Jika menggunakan turunan kelas Thread, maka kode programnya sebagai berikut. class HelloRunner extends Thread{ int i; @Override public void run() { Thread tr = Thread.currentThread(); i = 0; while (i<5) { System.out.println(tr.getName()+" : Hello " + i++); try { Thread.sleep(500); } catch (InterruptedException e) { System.out.println("Program di interrupt"); } 53

} } } public class DemoThread5 { public static void main(String args[]) { HelloRunner r1 = new HelloRunner(); HelloRunner r2 = new HelloRunner(); r1.start(); r2.start(); } } Lakukan eksekusi terhadap ketiga kode program di atas, maka terlihat proses yang mengalami Multithreading. Untuk kode kedua (mengimplementasikan interface Runnable) dan kode ketiga (menurunkan kelas Thread) memiliki kelebihan dan kekurangan masing-masing. Penggunaan interface Runnable mensyaratkan pembuatan obyek tambahan selain HelloRunner, yakni obyek Thread. Di lain sisi, penggunaan turunan kelas Thread akan membatasi jika programmer ingin Thread mewarisi sifat dari kelas lain dikarenakan Java tidak memperbolehkan adanya multiple inheritance. 7.2 Priority Thread Untuk menentukan thread mana yang akan menerima control dari CPU dan akan dieksekusi pertama kali, setiap thread akan diberikan sebuah prioritas. Sebuah prioritas adalah sebuah nilai integer dari angka 1 sampai dengan 10, di mana semakin tinggi prioritas dari sebuah thread, berarti semakin besar kesempatan dari thread tersebut untuk dieksekusi terlebih dahulu. Untuk memberikan nilai prioritas kepada Thread, digunakan method setPriority. 7.3 State dari Thread Sebuah thread memungkinkan untuk memiliki beberapa state: 1. Running: Sebuah thread yang pada saat ini sedang dieksekusi dan di dalam control dari CPU. 2. Ready to run: Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk melakukannya. 3. Resumed: Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap untuk dijalankan. 4. Suspended: Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja. 5. Blocked: Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan, karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi. 6. End

7.4 Sinkronisasi Thread Marilah kita perhatikan sebuah kode sederhana yang mencetak sebuah string dengan urutan tertentu. Berikut ini adalah listing program tersebut: class TwoStrings { static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { 54

} System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); } } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); } } Program ini diharapkan dapat mencetak dua argument object Runnable secara berurutan. Permasalahannya adalah, pendeklarasian method sleep akan menyebabkan thread yang lain akan dieksekusi walaupun thread yang pertama belum selesai dijalankan pada saat eksekusi method print dari class TwoStrings. Solusi dari masalah ini adalah dengan melakukan sinkronisasi terhadap method print, sehingga pada satu saat hanya boleh ada satu Thread yang menggunakan method print tersebut. Proses sinkronisasi juga dapat dilakukan kepada obyek. Berikut contoh proses sinkronisasi terhadap kasus di atas. class TwoStrings { synchronized static void print(String str1, String str2) { System.out.print(str1); try { Thread.sleep(500); } catch (InterruptedException ie) { } System.out.println(str2); } } class PrintStringsThread implements Runnable { Thread thread; String str1, str2; PrintStringsThread(String str1, String str2) { this.str1 = str1; this.str2 = str2; thread = new Thread(this); thread.start(); } public void run() { TwoStrings.print(str1, str2); 55

} } class TestThread { public static void main(String args[]) { new PrintStringsThread("Hello ", "there."); new PrintStringsThread("How are ", "you?"); new PrintStringsThread("Thank you ", "very much!"); } } 7.5 Komunikasi antar Thread Java juga menyediakan mekanisme untuk Thread saling berkomunikasi. Berikut contohnya. class SharedData { int data; synchronized void set(int value) { System.out.println("Generate " + value); data = value; } synchronized int get() { System.out.println("Get " + data); return data; } } class Producer implements Runnable { SharedData sd; Producer(SharedData sd) { this.sd = sd; new Thread(this, "Producer").start(); } public void run() { for (int i = 0; i < 5; i++) { sd.set((int)(Math.random()*100)); } } } class Consumer implements Runnable { SharedData sd; Consumer(SharedData sd) { this.sd = sd; new Thread(this, "Consumer").start(); } public void run() { for (int i = 0; i < 5 ; i++) { sd.get(); } } } class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData(); new Producer(sd); 56

new Consumer(sd); } } Di bawah ini adalah contoh dari keluaran program : Generate 8 Generate 45 Get 52 Generate 65 Get 65 Generate 23 Get 23 Generate 49 Get 49 Get 35 Hasil tersebut bukanlah yang diharapkan. Dari program di atas, diinginkan setiap kali producer melakukan generate sebuah nilai, maka consumer akan mendapatkan nilai tersebut. Untuk mengatasi problem di atas, dibuat sebuah mekanisme komunikasi antara producer dan consumer menggunakan method wait() dan notify(). Berikut solusinya. class SharedData { int data; boolean valueSet = false; synchronized void set(int value) { if (valueSet) { //baru saja membangkitkan sebuah nilai try { wait(); } catch (InterruptedException ie) { } } System.out.println("Generate " + value); data = value; valueSet = true; notify(); } synchronized int get() { if (!valueSet) { //produsen belum men-set sebuah nilai try { wait(); } catch (InterruptedException ie) { } } System.out.println("Get " + data); valueSet = false; notify(); return data; } } class Producer implements Runnable { SharedData sd; Producer(SharedData sd) { this.sd = sd; 57

new Thread(this, "Producer").start(); } public void run() { for (int i = 0; i < 5; i++) { sd.set((int)(Math.random()*100)); } } } class Consumer implements Runnable { SharedData sd; Consumer(SharedData sd) { this.sd = sd; new Thread(this, "Consumer").start(); } public void run() { for (int i = 0; i < 5 ; i++) { sd.get(); } } } class TestProducerConsumer { public static void main(String args[]) throws Exception { SharedData sd = new SharedData(); new Producer(sd); new Consumer(sd); } }

58

8 Collection
Overview Programmer yang perlu menggunakan list atau pohon biner, seharusnya tidak perlu lagi membuat data struktur ini dari awal. Struktur data ini sudah banyak dimengerti dan diprogram ribuan kali sebelumnya. Masalahnya adalah bagaimana agar struktur data yang tangguh tersedia dan siap digunakan oleh programmer. Di bagian ini kita akan melihat bagaimana Java menyelesaikan masalah ini. Tujuan 1. Memahami pemrograman generik pada Java 2. Mampu menggunakan List 3. Mampu menggunakan Set 4. Mampu menggunakan Map 8.1 Pemrograman Generik Pemrograman generik adalah penulisan kode yang bisa digunakan oleh berbagai macam tipe data. Kepada kita, Java telah menyajikan classes dan interfaces Collection yang lain, di mana semuanya dapat ditemukan di java.util package. Contoh dari classes Collection termasuk LinkedList, ArrayList, HashSet dan TreeSet. Class tersebut benar-benar implementasi dari collection interfaces yang berbeda. Induk hirarki dari collection interfaces adalah interfaces Collection itu sendiri. Sebuah collection hanyalah sebuah grup dari object yang diketahui sebagai elemennya sendiri. Collection memperbolehkan penggandaan/salinan dan tidak membutuhkan pemesanan elemen secara spesifik. Beberapa method yang ada di interface Collection. 1. public boolean add(Object o) Memasukkan Object o ke dalam collection ini. Mengembalikan nilai true jika o telah sukses ditambahkan ke dalam collection. 2. public void clear() Menghapus semua elemen dari collection ini. 3. public boolean remove(Object o) Menghapus single instance dari Object o pada collection ini, jika hal tersebut telah diinputkan. Mengembalikan nilai true jika o telah ditemukan dan dihapus dari collection. 4. public boolean contains(Object o) Mengembalikan nilai true jika collection ini berisi Object o. 5. public boolean isEmpty() Mengembalikan nilai true jika collection ini tidak berisi object atau elemen apapun. 6. public int size() Mengembalikan jumlah dari elemen pada collection ini. 7. public Iterator iterator() Mengembalikan sebuah iterator yang menunjukkan kita pada isi collection ini. 8. public boolean equals(Object o) Mengembalikan nilai true jika Object o sama dengan yang ada pada collection ini. 9. public int hashCode() Mengembalikan nilai hash code (yaitu ID) untuk collection ini. Objects atau collections yang sama memiliki nilai hash code atau ID yang sama. Beberapa implementasi dari interface Collection beserta karakteristiknya. 1. List, antara lain: a. ArrayList: Menyediakan iterasi yang cepat dan random access. b. Vector: ArrayList yang performa lebih lambat, namun menyediakan method yang tersinkronisasi. 59

c. LinkedList: Bagus untuk menambahkan elemen di ujung struktur data, contohnya Stack dan Queue. d. PriorityQueue: List yang diurutkan berdasarkan prioritas elemen. 2. Set, antara lain: a. HashSet: Akses cepat, menjamin tidak ada duplikasi, namun data tidak terurut. b. LinkedHashSet: Tidak ada duplikat, iterasi berdasarkan urutan input. c. TreeSet: Tidak ada duplikat, iterasi dilakukan terurut. Selain implementasi interface Collection, terdapat juga interface Map yang dapat digunakan seperti Collection, namun dengan menambahkan properti key sebagai unique atributte dari sebuah elemen. a. HashMap: Update data tercepat, menggunakan pasangan kunci dan nilai, membolehkan nilai null. b. Hashtable: HashMap yang lebih lambat karena ada method yang tersinkronisasi. Tidak membolehkan nilai null. c. LinkedHashMap: Iterasi lebih cepat, iterasi berdasarkan urutan input, membolehkan nilai null. d. TreeMap: Map yang terurut. Untuk melakukan iterasi terhadap sebuah Collection, digunakan kelas Iterator. Berikut contoh proses iterasi sebuah Collection. Iterator iter = kol.iterator(); while ( iter.hasNext() ) { Object item = iter.next(); System.out.println(item); } Mulai dari java versi 1.5, proses looping sudah menyediakan fitur untuk mengakses elemen Collection secara langsung. ..... ArrayList nameList = new ArrayList(); nameList.add("Mikalai"); nameList.add("Michael"); nameList.add("Craig"); for (Object name:nameList) { System.out.println(name); } ..... 8.2 Generic Generic adalah sebuah mekanisme yang digunakan mulai dari Java 1.5 untuk mendefinisikan elemen yang boleh ditampung ke dalam sebuah Collection. Contoh penggunaannya adalah sebagai berikut. ArrayList<String> genArrList = new ArrayList<String>(); genArrList.add("A generic string"); String myString = genArrList.get(0); JoptionPane.showMessageDialog(this, myString); Pada ArrayList di atas didefinisikan Generic untuk tipe String. Maka, ArrayList hanya akan dapat menampung elemen bertipe String atau turunan dari String.

60

9 Aplikasi Desktop GUI


Overview Tanpa mempelajari tentang grapichal user interface (GUI) API masih tetap bisa membuat suatu program. Tetapi, program akan kelihatan tidak menarik dan tidak nyaman digunakan bagi para user. Memiliki GUI yang baik dapat memberi efek pada penggunaan aplikasi. Java menyediakan banyak tool seperti Abstract Windowing Toolkit dan Swing untuk mengembangkan aplikasi GUI yang interaktif. Tujuan 1. Mendesain aplikasi GUI menggunakan Swing. 2. Menjelaskan tentang flow layout, border layout, dan grid layout dalam komponen GUI. 3. Membuat komponen Swing jButton, jTextField, jCheckBox, jRadioButton, jComboBox dalam GUI 4. Membuat tampilan yang komplek dalam mendesain aplikasi GUI. 9.1 Layout Manager Posisi dan ukuran suatu komponen ditentukan oleh layout manager. Layout manager mengatur tampilan dari komponen di dalam kontainer. Berikut ini beberapa layout manager yang terdapat di dalam Java. 1. FlowLayout 2. BorderLayout 3. GridLayout 4. GridBagLayout 5. CardLayout Layout manager dapat diatur menggunakan method setLayout dari class Container. Method ini dapat ditulis sebagai berikut. void setLayout(LayoutManager mgr) Jika Anda memilih untuk tidak menggunakan layout manager, Anda dapat mengisi null sebagai argumen untuk method ini. Tetapi selanjutnya, Anda akan mengatur posisi elemen secara manual dengan menggunakan method setBounds dari class Components. public void setBounds(int x, int y, int width, int height) Method ini mengatur posisi berdasarkan pada argumen x dan y, dan ukuran berdasarkan argumen width dan height. Hal ini akan cukup menyulitkan dan membosankan untuk aplikasi jika Anda memiliki beberapa obyek komponen di dalam object container. Anda akan memanggil method ini untuk setiap komponen. 9.1.1 FlowLayout Manager FlowLayout Manager adalah default manager untuk class Panel dan subclassnya, termasuk class applet. Cara meletakkan komponen dari FlowLayout Manager dimulai dari kiri ke kanan dan dari atas ke bawah, dimulai dari pojok kiri atas. Seperti pada saat Anda mengetik menggunakan editor kata pada umumnya. Berikut adalah bagaimana FlowLayout Manager bekerja, di mana memiliki tiga constructor seperti daftar di bawah ini. 1. FlowLayout() Membuat object baru FlowLayout dengan posisi di tengah dan lima unit horizontal dan vertikal gap dimasukkan pada komponen sebagai default. 2. FlowLayout(int align) Membuat object baru FlowLayout dengan posisi spesifik dan lima unit horizontal dan vertikal gap dimasukkan pada komponen sebagai default. 3. FlowLayout(int align, int hgap, int vgap) Membuat object baru FlowLayout dengan argumen pertama sebagai posisi pada komponen 61

dan hgap untuk horizontal dan vgap untuk vertikal pada komponen Gap dapat dikatakan sebagai jarak antara komponen dan biasanya diukur dengan satuan pixel. Posisi argumen mengikuti penulisan sebagai berikut: 1.FlowLayout.LEFT 2.FlowLayout.CENTER 3.FlowLayout.RIGHT Berikut contoh program menggunakan FlowLayout. import java.awt.*; class FlowLayoutDemo extends Frame { public static void main(String args[]) { FlowLayoutDemo fld = new FlowLayoutDemo(); fld.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10)); fld.add(new Button("ONE")); fld.add(new Button("TWO")); fld.add(new Button("THREE")); fld.setSize(100, 100); fld.setVisible(true); } }

Gambar 9.1 Contoh FlowLayout 9.1.2 BorderLayout Manager BorderLayout membagi kontainer menjadi lima bagian di antaranya utara, selatan, timur, barat, dan tengah. Setiap komponen dimasukkan ke dalam region yang spesifik. Region utara dan selatan membentuk jalur horizontal sedangkan region timur dan barat membentuk jalur vertikal. Dan region tengah berada pada perpotongan jalur horizontal dan vertikal. Tampilan ini adalah bersifat default untuk object Window, termasuk object dari subclass Window yaitu tipe Frame dan Dialog. Constructor BorderLayout antara lain: 1. BorderLayout() Membuat object BorderLayout baru tanpa spasi yang diaplikasikan di antara komponen yang berbeda. 2. BorderLayout(int hgap, int vgap) Membuat object BorderLayout baru dengan spasi unit hgap horizontal dan unit vgap vertikal yang diaplikasikan di antara komponen yang berbeda. Seperti pada FlowLayout Manager, parameter hgap dan vgap disini juga menjelaskan jarak antara komponen dengan kontainer. Untuk menambahkan komponen kedalam region yang spesifik, gunakan method menambahkan dan melewatkan dua argumen yaitu : komponen yang ingin dimasukkan ke dalam region dan region mana yang ingin dipakai untuk meletakkan komponen. Perlu diperhatikan bahwa hanya satu komponen yang dapat dimasukkan dalam satu region. Menambahkan lebih dari satu komponen pada kontainer yang bersangkutan, maka komponen yang terakhir ditambahkan yang akan ditampilkan. Berikut ini adalah daftar dari kelima region. 1. BorderLayout.NORTH 62

2. BorderLayout.SOUTH 3. BorderLayout.EAST 4. BorderLayout.WEST 5. BorderLayout.CENTER Berikut ini adalah contoh program yang menunjukkan bagaimana BorderLayout bekerja. import java.awt.*; class BorderLayoutDemo extends Frame { public static void main(String args[]) { BorderLayoutDemo bld = new BorderLayoutDemo(); bld.setLayout(new BorderLayout(10, 10)); bld.add(new Button("NORTH"), BorderLayout.NORTH); bld.add(new Button("SOUTH"), BorderLayout.SOUTH); bld.add(new Button("EAST"), BorderLayout.EAST); bld.add(new Button("WEST"), BorderLayout.WEST); bld.add(new Button("CENTER"), BorderLayout.CENTER); bld.setSize(200, 200); bld.setVisible(true); } } Berikut ini adalah hasil dari contoh program tersebut.

Gambar 9.2 Contoh BorderLayout 9.1.3 GridLayout Manager Dengan GridLayout manager, komponen juga diposisikan dari kiri ke kanan dan dari atas ke bawah seperti pada FlowLayout manager. GridLayout manager membagi kontainer menjadi baris dan kolom. Semua region memiliki ukuran yang sama. Hal tersebut tidak mempedulikan ukuran sebenarnya dari komponen. Berikut ini adalah daftar dari constructor untuk class GridLayout. 1. GridLayout() Membuat object GridLayout baru dengan satu baris dan satu kolom sebagai default 2. GridLayout(int rows, int cols) Membuat object GridLayout baru dengan jumlah baris dan kolom sesuai dengan keinginan 3. GridLayout(int rows, int cols, int hgap, int vgap) Membuat object GridLayout baru dengan jumlah baris dan kolom yang ditentukan. Unit spasi hgap horizontal dan vgap vertikal diaplikasikan ke dalam komponen. Berikut contoh GridLayout. import java.awt.*; class GridLayoutDemo extends Frame { public static void main(String args[]) { 63

GridLayoutDemo gld = new GridLayoutDemo(); gld.setLayout(new GridLayout(2, 3, 4, 4)); gld.add(new Button("ONE")); gld.add(new Button("TWO")); gld.add(new Button("THREE")); gld.add(new Button("FOUR")); gld.add(new Button("FIVE")); gld.setSize(200, 200); gld.setVisible(true); } } Berikut ini adalah output dari program.

Gambar 9.3 Contoh GridLayout Untuk membuat tampilan yang lebih lengkap, layout manager yang berbeda dapat digabungkan dengan menggunakan panel. Panel adalah kontainer dan komponen pada saat yang sama. Komponen dapat ditambahkan ke dalam panel. Perhatikan teknik yang digunakan pada contoh berikut. import java.awt.*; class ComplexLayout extends Frame { public static void main(String args[]) { ComplexLayout cl = new ComplexLayout(); Panel panelNorth = new Panel(); Panel panelCenter = new Panel(); Panel panelSouth = new Panel(); /* Panel utara */ // Panel menggunakan FlowLayout sebagai default panelNorth.add(new Button("ONE")); panelNorth.add(new Button("TWO")); panelNorth.add(new Button("THREE")); /* Panel tengah */ panelCenter.setLayout(new GridLayout(4,4)); panelCenter.add(new TextField("1st")); panelCenter.add(new TextField("2nd")); panelCenter.add(new TextField("3rd")); panelCenter.add(new TextField("4th")); /* Panel selatan */ panelSouth.setLayout(new BorderLayout()); panelSouth.add(new Checkbox("Choose me!"), BorderLayout.CENTER); panelSouth.add(new Checkbox("I'm here!"), BorderLayout.EAST); 64

panelSouth.add(new Checkbox("Pick me!"), BorderLayout.WEST); /* Menambahkan panel pada container Frame */ // Frame menggunakan BorderLayout sebagai default cl.add(panelNorth, BorderLayout.NORTH); cl.add(panelCenter, BorderLayout.CENTER); cl.add(panelSouth, BorderLayout.SOUTH); cl.setSize(300,300); cl.setVisible(true); } } Berikut ini adalah output dari program. 9.2 Komponen Swing Seperti pada package AWT, package dari Swing menyediakan banyak class untuk membuat aplikasi GUI. Package tersebut dapat ditemukan di javax.swing. Perbedaan utama antara keduanya adalah komponen Swing ditulis menyeluruh menggunakan Java. Kesimpulannya, program GUI ditulis menggunakan banyak class dari package Swing yang mempunyai tampilan look and feel yang sama meski dijalankan pada paltform yang berbeda. Lebih dari itu, Swing menyediakan komponen yang lebih menarik seperti color chooser dan option pane. Komponen Swing JComponent Tabel 9.1 Komponen Swing Penjelasan class induk untuk semua komponen Swing, tidak termasuk top-level kontainer JButton JCheckBox JFileChooser JTextField JFrame JPanel JOptionPane JDialog Tombol push Item yang dapat dipilih atau tidak oleh pengguna, pemilihan dapat lebih dari satu Form untuk memilih sebuah file Form text satu baris Frame tempat meletakkan komponen, diperlukan content pane sebelum menambah sebuah komponen Class Container sederhana tetapi bukan top-level Menampilkan popup kotak dialog Digunakan untuk menginformasikan sesuatu kepada pengguna atau prompt pengguna untuk input JColorChooser Memungkinkan pengguna untuk memilih warna yang diinginkan

65

9.3 Membuat Swing HelloWorld dengan Netbeans Netbeans dilengkapi dengan GUI builder yang dikenal dengan Matisse. Tools ini sangat powerful dan produktif dalam membuat komponen GUI. Berikut beberapa contoh cara membuat aplikasi dengan Netbeans GUI Builder menggunakan beberapa komponen Swing. 9.3.1 Contoh Penggunaan JButton dan JTextField Berikut contoh aplikasi penjumlahan menggunakan Netbeans

Gambar 9.4 Contoh aplikasi penjumlahan Untuk membuat aplikasi ini menggunakan Matisse, lakukan langkah-langkah berikut ini: 1. Buat project baru di Netbeans (kalau sudah membuat project, tidak perlu membuat lagi) dengan cara memilih menu: File > New Project Kemudian ikuti petunjuk yang diberikan dialog. 2. Buat class JFrame baru, caranya dengan memilih menu: File > New File Kemudian akan muncul dialog seperti di bawah ini :

Gambar 9.5 Jendela dialog new file 3. Pilih kategori: Java GUI Forms > JFrame Form Seperti terlihat di dialog New File dialog di atas, kemudian beri nama Penjumlahan.java 4. Buat tampilan form seperti gambar bawah ini, caranya dengan klik Jendela Pallete di sebalah kanan untuk memilih komponen apa yang akan dibuat, kemudian klik di jendela Design untuk menempatkan komponen yang sudah dipilih tadi ke dalam form. Hasilnya terlihat seperti pada gambar di bawah ini:

66

Gambar 9.6 Jendela design Netbens Matisse 5. Ganti nama setiap komponen agar mudah dikenali. Klik kanan di atas setiap komponen yang ada dalam Jendela Design di atas, kemudian pilih menu: Klik kanan > Change Variable Name ... Ganti nama komponen-komponen tersebut (sesuai urutan dari kiri ke kanan, atas ke bawah) menjadi : lblKeterangan, txtA, lblPlus, txtB, btnHitung, lblHasil. 6. Menambahkan variable untuk menampung nilai yang akan dijumlahkan. Klik tombol Source untuk membuka jendela yang menampilkan kode sumber dari program di atas kemudian tambahkan kode di bawah ini tepat di bawah definisi dari class Penjumlahan: private String str = "Hasilnya adalah : "; private int a, b; 7. Menangani penekanan tombol btnHitung. Klik kanan di atas komponen btnHitung kemudian pilih menu: Events > Action > actionPerformed Anda akan dibawa ke jendela Source, dan akan menemukan kode program seperti di bawah ini: private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: } JLabel dan JTextField mempunyai method getText dan setText untuk mengambil dan mengeset text yang ditampilkan. Ubah kode program di atas menjadi : private void btnHitungActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: a = Integer.parseInt(txtA.getText()); b = Integer.parseInt(txtB.getText()); int hasil = a + b; lblHasil.setText(str + hasil); } 8. Compile dan jalankan program. Tekan tombol SHIFT + F6, atau klik kanan file Penjumlahan.java kemudian pilih menu Run File.

67

9.3.2 Contoh Penggunaan JCheckBox dan JRadioButton Berikut contoh aplikasi menggunakan JCheckBox dan JRadioButton.

Gambar 9.7 Contoh check box dan radio button Untuk membuat program di atas ikuti langkah-langkah berikut ini: 1. Buat class baru bertipe JFrame Form, kemudian beri nama Pilihan.java 2. Buat tampilan di atas menggunakan Matisse. komponen yang harus dibuat adalah: dua object JradioButton (radioBerwarna dan radioTransparan) satu object ButtonGroup (groupTipeWarna) empat object JCheckBox (chkHijau, chkBiru, chkMerah, chkKuning) satu object JTextArea (txtWarna) satu object JScrollPane (scrollWarna) Untuk melihat semua komponen yang ada dalam Jendela Design, gunakan Jendela Inspector di sisi kiri bawah. 3. Masukkan object radioBerwarna dan radioTransparan ke dalam object groupTipeWarna. Caranya dengan: a. Memilih komponen radioBerwarna di Jendela Design b. Klik tab code di Jendela Properties c. Pilih properti : Post-Creation Code d. Masukkan kode berikut ini kedalam dialog yang muncul : groupTipeWarna.add(radioBerwarna); JRadioButton yang mempunyai group yang sama, harus dimasukkan dalam sebuah object ButtonGroup yang sama. Lakukan langkah yang sama terhadap object radioTransparan. 4. Menangani event ketika JRadioButton diklik. Caranya dengan: e. Memilih komponen radioBerwarna di Jendela Design f. Klik kanan komponen radioBerwarna, kemudian pilih menu: Event > Action > actionPerformed g. Anda akan dibawa ke dalam Jendela Code, dan menemukan kode berikut ini : private void radioBerwarnaActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: } Ubahlah kode di atas menjadi : private void radioBerwarnaActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: if(radioBerwarna.isSelected()){ lblTipeWarna.setText("Tipe warna : " + radioBerwarna.getText()); 68

} } Lakukan langkah yang sama terhadap radioTransparan. 5. Buat sebuah private method untuk menangani event pemilihan terhadap JCheckBox. Method tampilkanWarna ini nantinya akan dipanggil setiap kali salah satu dari JCheckBox dipilih. Yang dilakukan oleh metod tampilkanWarna adalah mengecek status setiap JCheckBox, apakah sedang dipilih atau tidak. Jika sedang dipilih maka text dari JCheckBox tersebut akan ditampilkan dalam txtWarna. Class StringBuffer digunakan untuk menampung nilai text dari JCheckBox yang statusnya terpilih. private void tampilkanWarna(){ StringBuffer warna = new StringBuffer(); if(chkBiru.isSelected()){ warna.append(chkBiru.getText() + " "); } if(chkHijau.isSelected()){ warna.append(chkHijau.getText() + " "); } if(chkKuning.isSelected()){ warna.append(chkKuning.getText() + " "); } if(chkMerah.isSelected()){ warna.append(chkMerah.getText() + " "); } txtWarna.setText(warna.toString()); } 6. Menangani event pemilihan JCheckBox. Caranya sebagai berikut: a. Pilih komponen chkHijau di Jendela Design. b. Klik kanan komponen chkHijau untuk memunculkan context (popup) menu. c. Pilih menu: Event > Action > actionPerformed d. Anda akan dibawa ke Jendela Code, kemudian dalam method chkHijauActionPerformed tersebut panggil method tampilkanWarna. seperti di bawah ini : private void chkHijauActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: tampilkanWarna(); } Lakukan hal ini untuk semua JCheckBox. 7. Compile dan jalankan program dengan menekan tombol SHIFT + F6. 9.3.3 Contoh Penggunaan JList dan JComboBox Berikut contoh program menggunakan JList dan JComboBox.

69

Gambar 9.8 Contoh JList dan JComboBox Ikuti langkah-langkah berikut ini untuk membuat program di atas: 1. Buatlah class JFrame Form baru dan beri nama ListAndCombo.java. 2. Buat tampilan program di atas menggunakan Matisse, kemudian tambahkan komponenkomponen: a. Empat buah JLabel : lblPekerjaan, lblPilihanPekerjaan, lblHobby, lblPilihanHobby. b. Satu buah JComboBox : cmbPekerjaan c. Satu buah JList : lstHobby d. Satu buah JtextArea : txtPilihanHobby 3. Untuk merubah isi dari JComboBox dan JList kita akan menggunakan Jendela Properties, Jendela ini letaknya di sebelah kanan bawah, di bawah Jendela Pallete dan akan muncul hanya jika jendela Design yang dipilih.

Gambar 9.9 Jendela Properties Pilih komponen JComboBox di Jendela Design, Jendela Properties akan menampilkan properties dari JComboBox. Pada bagian model di dalam Jendela Properties masukkan item Pelajar, Mahasiswa, Programmer, Technical Writer dan Tester dipisahkan dengan koma. 4. Pilih JList di Jendela Design maka Jendela Properties untuk JList akan muncul. Di bagian model isikan item : Membaca, Olahraga, Trekking, Coding, Menonton Film, Bersepeda dan Mengajar. Setiap item dipisahkan dengan koma. 5. Menangani pemilihan JComboBox. Klik kanan JComboBox di Jendela Design, kemudian pilih menu: Events > Action > actionPerformed Jendela Code akan terbuka, tambahkan code seperti di bawah ini: 70

private void cmbPekerjaanActionPerformed( java.awt.event.ActionEvent evt) { // TODO add your handling code here: lblPilihanPekerjaan.setText("Pekerjaan: "+cmbPekerjaan.getSelectedItem()); } Method getSelectedItem dari JComboBox digunakan untuk memperoleh item yang sedang di pilih dalam JComboBox. 6. Untuk menangani pemilihan item dari JList berbeda dengan JComboBox. JList akan mengaktifkan ListSelection event ketika user memilih item dalam JList. Untuk menangani event ini, lakukan langkah-langkah berikut : a. Klik kanan pada JList di dalam Jendela Design, kemudian pilih menu: Events > ListSelection > valueChanged b. Dalam jendela kode yang ketik kode seperti berikut ini: private void lstHobbyValueChanged( javax.swing.event.ListSelectionEvent evt) { // TODO add your handling code here: Object[] selectedItems = lstHobby.getSelectedValues(); if(selectedItems == null || selectedItems.length == 0) txtPilihanHobby.setText(""); else{ StringBuffer strValues = new StringBuffer(); for(Object item : selectedItems){ strValues.append(item.toString()+","); } txtPilihanHobby.setText(strValues.substring(0, strValues.length()-2)); } } Method getSelectedValues dari JList mengembalikan item-item yang terpilih. 9.3.4 Contoh Penggunaan Menu, Popup Menu dan Toolbar Untuk membuat menu pada program sebagai berikut. 1. Buat sebuah class JFrame dan beri nama ToolbarMenu.java 2. Pilih komponen Menu Bar dari Jendela Pallete kemudian klik JFrame di Jendela Design. Sebuah class JMenuBar akan ditambahkan di dalam JFrame. Ganti namanya menjadi menuBar. 3. Klik kanan JMenuBar yang baru saja kita buat di Jendela Inspector, kemudian pilih menu: Add > JMenu Ganti nama JMenu tersebut menjadi menuFile. Kemudian alihkan perhatian anda ke Jendela Properties

71

Gambar 9.10 Jendela Properties dari class JMenu Isi properti text dengan string File. Kemudian set isi properti mnemonic dengan string f, hal ini akan menyebabkan tampilanya menuFile menjadi File dan user dapat menekan tombol ALT + F untuk mengaktifkan menu menuFile. Langkah berikutnya adalah menambahkan JMenuItem ke dalam JMenu menuFile yang telah dibuat di langkah sebelumnya. caranya, klik kanan di JMenu menuFile di Jendela Inspector, kemudian pilih menu: Add > JMenuItem Tambahkan berturut-turut menuNew, menuOpen dan menuSave. Pilih JMenuItem dari Jendela Inspector, kemudian untuk masing-masing JMenuItem set text dan mnemonic yang sesuai dari Jendela Properties. Dalam struktur menu yang bagus, menu yang mempunyai fungsi serupa diletakkan dalam urutan berdekatan dan dipisahkan dengan separator (pemisah). Klik kanan di JMenu menuFile kemudian pilih menu: Add > JSeparator Berikutnya kita akan menambahkan JMenu baru ke dalam JMenu menuFile. JMenu yang baru ini akan bertindak sebagai sub menu. Caranya juga sama : klik kanan di JMenu menuFile kemudian pilih menu: Add > JMenu Beri nama menuSetting, set text dan mnemonic yang sesuai pada Jendela Properties. Perilaku JCheckBoxMenuItem tidak berbeda jauh dengan JCheckBox biasa, bedanya hanyalah JCheckBoxMenuItem berada dalam struktur menu. Cara menambahkan JCheckBoxMenuItem sama dengan komponen lain: klik kanan JMenu menuSetting kemudian pilih menu: Add > JCheckBoxMenuItem Beri nama chkLineNumber, set text dan mnemonic yang sesuai pada Jendela Properties. JCheckBoxMenuItem sedikit spesial dibandingkan dengan JMenuItem, karena JCheckBoxMenuItem memiliki properties selected. Properties selected ini digunakan untuk menentukan apakah JCheckBoxMenuItem dalam keadaan terpilih atau tidak. Dalam contoh ini kita akan mempunyai dua buah JRadioButtonMenuItem, radioBinary dan radioText. Keduanya dibuat dengan langkah yang sama dengan komponen lain, klik kanan di JMenu menuSetting, kemudian pilih menu: Add > JRadioButtonMenuItem Set text dan mnemonic yang sesuai dari Jendela Properties. Menambahkan ButtonGroup. Seperti halnya JRadioButton, JRadioButtonMenuItem juga memerlukan ButtonGroup agar hanya satu buah JRadioButtonMenuItem yang bisa dipilih. Cara menambahkan ButtonGroup sangat mudah, klik item ButtonGroup dari Jendela Pallete kemudian klik Jendela Design, maka otomatis ButtonGroup akan ditambahkan. Ganti namanya menjadi groupOpenMethod. Dalam Jendela Inspector, ButtonGroup yang baru 72

4.

5. 6.

7.

8.

9.

dibuat tadi akan berada dalam kategori Other Components, seperti terlihat dalam gambar di bawah ini:

Gambar 9.11 ButtonGroup berada dalam kategori Other Components 10. Pilih masing-masing JRadioButtonMenuItem dari Jendela Inspector, kemudian perahatikan Jendela Properties dari JRadioButtonMenuItem tersebut, pada bagian groupButton pilih item groupOpenMethod, seperti terlihat dalam gambar di bawah ini:

Gambar 9.12 Properties dari JRadioButtonMenuItem 11. Compile dan jalankan class ToolbarMenu.java. Klik kanan class ToolbarMenu dari Jendela Design kemudaian pilih menu Run File atau tekan tombol SHIFT + F6. Untuk menambahkan aplikasi dengan PopUp Menu, lakukan langkah berikut ini. 1. Buka class ToolbarMenu.java, yang telah dibuat dalam langkah sebelumnya, dalam Jendela Design. 2. Klik Jendela Pallete dan pilih JPopupMenu, kemudian klik Jendela Design. Secara otomatis JPopupMenu akan ditambahkan dalam class ToolbarMenu.java. JPopupMenu tidak terlihat dalam Jendela Design, namun anda bisa mengkasesnya melalui Jendela Inspector. 3. Seperti halnya JMenuBar, JPopupMenu dapat memiliki child berupa JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem dan JSeparator. Menambahkan JMenuItem ke dalam JPopupMenu sangat sederhana, caranya: klik kanan pada JPopupMenu di Jendela Design, kemudian pilih menu: Add > JMenuitem 73

Ganti nama objectnya menjadi menuCut, beralihlah ke Jendela Properties kemudian set text dan mnemonic yang sesuai. Lakukan langkah ini untuk JMenuItem yang lain, menuCopy dan menuPaste. 4. Ketika tombol kanan mouse di klik di atas JFrame, JPopupMenu akan tampil. Agar behavior tersebut berjalan, kita perlu menangani event mouseClick terhadap JFrame. Caranya : a. Klik kanan JFrame di Jendela Design, kemudian pilih menu: Events > Mouse > mouseClicked b. Di dalam jendela source yang terbuka masukkan kode berikut ini: private void formMouseClicked(java.awt.event.MouseEvent evt){ // TODO add your handling code here: if(evt.getButton() == MouseEvent.BUTTON3){ popUpMenu.show( (Component)evt.getSource(), evt.getX(),evt.getY()); } } Kondisi if di atas digunakan apakah tombol yang diklik mouse adalah tombol sebelah kanan, jika nilai kembalian method getButton sama dengan nilai BUTTON3 maka benar tombol kanan yang ditekan. Method show digunakan untuk memunculkan popup menu, parameter pertama diisi dengan Component di mana nantinya popup menu akan ditampilkan, sedangkan parameter kedua dan ketiga diisi dengan letak koordinat popup menu akan ditampilkan. 5. Simpan file ToolbarMenu.java, compile dan jalankan. Kemudian coba munculkan popup menu dengan mengklik kanan JFrame. Untuk menambahkan toolbar pada aplikasi, lakukan langkah berikut ini. 1. Buatlah sebuah java package baru untuk menampung semua icon yang akan digunakan. caranya klik kanan di jendela Projects bagian nama project, pilih menu: New > Java Package Beri nama images untuk java package yang baru saja kita buka. 2. Memasukkan Icon ke dalam package. Untuk memasukkan image ke dalam package kita perlu tahu di mana project disimpan, misalkan project disimpan dalam folder: c:\javaswing Buka file explorer, kemudian navigasi ke folder c:\javaswing\src\images Copy semua icon yang diperlukan ke dalam folder di atas. Build Project akan berhasil jika tidak ada satupun error dalam kode program. Sebelum melakukan build project pastikan terlebih dahulu tidak ada error dalam kode. Lakukan build setiap kali menambahkan file nonjava ke dalam folder source file. Agar file tersebut ikut tercopy ke dalam folder build\classes penting 3. Build project. 4. Buka class ToolbarMenu.java yang sudah dibuat di langkah sebelumnya. 5. Buat sebuah object JToolBar, caranya: klik item JToolBar dari Jendela Pallete, kemudian klik JFrame di Jendela Design. Secara otomatis sebuah object JToolBar akan dimasukkan ke dalam JFrame. Ganti namanya menjadi toolBar. 6. Klik item JButton dalam Jendela Pallete kemudian klik komponen JToolBar yang baru saja kita buat tadi. JButton baru akan diletakkan di atas JToolBar, ganti nama JButton tersebut menjadi btnNew. Letakkan lagi satu buah JButton di atas JToolBar dan beri nama btnMaximize. 7. Agar tampilan JButton terlihat cantik, kita perlu mengeset beberapa nilai dari properti JButton, seperti terlihat pada gambar di bawah ini:

74

Gambar 9.13 Jendela Properties JButton a. Text, hapus nilai textnya. b. Border, pilih bordernya menjadi empty border dan set nilai bordernya menjadi [5,5,5,5]. Tujuan pemberian empty border ini agar tombol berukuran lebih besar dibandingkan dengan icon yang akan digunakan nanti, dan setiap mouse melewati JButton, ada efek transisi yang cantik. Untuk mengedit border dari JButton, Matisse menyediakan Jendela Border untuk memilih border yang kita inginkan untuk Jbutton. Border yang dipilih bisa single border, atau composite border yang terdiri dari beberapa border.

Gambar 9.14 Jendela Border Editor dari Jbutton c. Opaque, uncheck nilai opaque. Bertujuan agar tombolnya berwarna transparan, sehingga mempunyai warna background yang sama dengan background JToolBar. d. Icon, ganti iconya dengan icon yang telah disiapkan. Untuk memasukkan icon ke dalam JButton, tekan tombol di samping pilihan Icon di dalam Jendela Properties, kemudianakan muncul Dialog Icon Editor seperti di bawah ini:

75

Gambar 9.15 Jendela icon editor Pilih radio button Classpath, kemudian tekan tombol Select File dan pilih salah satu icon yang telah disiapkan. Tekan OK. Lakukan langkah-langkah yang sama terhadap JButton yang lain. 8. Compile dan jalankan class ToolbarMenu untuk melihat hasilnya. 9.3.5 JDialog Beberapa contoh penggunaan JDialog sebagai berikut. JOptionPane.showMessageDialog(null, "Simple plain dialog", "Plain dialig", JOptionPane.PLAIN_MESSAGE);

Gambar 9.16 Tampilan dialog sederhana JOptionPane.showMessageDialog(null, "Your action was succeed, + you can proceed to next assigment", "Information dialog", JOptionPane.INFORMATION_MESSAGE);

Gambar 9.17 Tampilan dialog dengan tipe dialog Information JOptionPane.showMessageDialog(null, "You neet to be sure to do this action!", "Dialog Peringatan", JOptionPane.WARNING_MESSAGE); 76

Gambar 9.18 Dialog dengan tipe Warning JOptionPane.showMessageDialog(null, "Something goes wrong and generate error message", "Error Dialog", JOptionPane.ERROR_MESSAGE);

Gambar 9.19 Dialog dengan tipe Error JOptionPane.showConfirmDialog(null, "Choose yes or no","Confirmation Dialog", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);

Gambar 9.20 Option dialog dengan tipe Information dan pilihan YES_NO JOptionPane.showConfirmDialog(null, "Choose yes, no or cancel","Confirmation Dialog", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);

Gambar 9.21 OptionDialog dengan tipe Plain dan pilihan YES_NO_CANCEL JOptionPane.showInputDialog(null, "Input your Dialog", JOptionPane.INFORMATION_MESSAGE); name here","Input

77

Gambar 9.22 InputDialog dengan tipe message Information String[] options = {"Apple","Mango","Grape","Guava"}; JOptionPane.showInputDialog(null, "Choose this one Option","Input dialog", JOptionPane.WARNING_MESSAGE,null,options,"Apple");

Gambar 9.23 InputDialog dialog dengan tipe Warning, Options berupa array of String dan initialValue = 'Apple' 9.3.6 JFileChooser Aplikasi berikut ini adalah contoh penggunaan JFileChooser untuk membuka dan menyimpan file.

Gambar 9.24 Contoh program menggunakan JFileChooser Tampilan JFileChooser ketika tombol open ditekan adalah seperti di bawah ini:

Gambar 9.25 Tampilan JFileChooser 78

Untuk membuat aplikasi di atas lakukan langkah-langkah berikut ini: 1. Buat class JFrame Form baru, beri nama Chooser.java 2. Masukkan dua buah JTextField: txtOpen dan txtSave, dua buah Jbutton: btnOpen dan btn save, sebuah JLabel: lblStatus. Sesuaikan penataan komponen sesuai dengan gambar di atas. 3. Tambahkan sebuah object JFileChooser sebagai field dari class Chooser, beri nama chooser. public class Chooser{ JFileChooser chooser = new JFileChooser(); //kode lain di sini } 4. FileNameExtentionFilter digunakan sebagai file filter dalam JFileChooser. Metode filteringnya adalah mencocokkan ekstensi file dalam file system dengan ekstensi yang ada dalam FileNameExtentionFilter. Contoh kode di bawah ini akan menyebabkan JFileChooser mempunyai pilihan JPEG File, dan jika pilihan tersebut dipilih, maka file dengan ekstensi jpg, jpeg,JPG atauJPEG saja yang akan ditampilkan oleh JFileChooser. FileNameExtensionFilter JPEGFilter = New FileNameExtensionFilter( "JPEG File","jpg","jpeg",JPG,JPEG); chooser.addChoosableFileFilter(JPEGFilter); 5. Set direktori yang akan dituju oleh JFileChooser. Untuk mengetahui di mana direktori aktif aplikasi, kita bisa menggunakan system property user.dir. Kode berikut ini akan menyebabkan JFileChooser dibuka pada direktori aktif aplikasi: String dir = System.getProperty("user.dir"); chooser.setCurrentDirectory(new File(dir)); 6. Menghandle event penekanan tombol btnSave. Ketika tombol btnSave ditekan, chooser akan menampilkan dialog save file, kemudian mengambil nama file yang dipilih dan menampilkannya dalam txtSave, serta menampilkanya dalam lblStatus. Berikut ini kodenya : private void btnSaveActionPerformed(ActionEvent evt) { // TODO add your handling code here: int ret = chooser.showSaveDialog(this); if(ret == JFileChooser.APPROVE_OPTION){ File f = chooser.getSelectedFile(); lblStatus.setText("Status : saving file" + f.getAbsolutePath()); txtSave.setText(f.getAbsolutePath()); } } 7. Menghandle penekanan tombol btnOpen. Kode untuk menangani penekanan tombol btnOpen mirip dengan kode untuk menangani penenakan tombol btnSave, perbedaanya adalah btnOpen akan menampilkan dialog open file, berikit ini kodenya: private void btnBrowseActionPerformed(ActionEvent evt){ // TODO add your handling code here: int ret = chooser.showOpenDialog(this); if(ret == JFileChooser.APPROVE_OPTION){ File f = chooser.getSelectedFile(); lblStatus.setText("Status : opening file" + f.getAbsolutePath()); txtOpen.setText(f.getAbsolutePath()); } } 8. Compile dan jalankan aplikasinya dengan menekan tombol SHIFT + F6

79

10 Akses Database Via JDBC


Overview Bagian ini akan membahas bagaimana mengakses database via JDBC. Dengan mengakses database, kita dapat membuat aplikasi yang bisa melakukan penyimpanan data ke dalam storage dan juga mengakses untuk keperluan proses bisnis tertentu. Tujuan 1. Memahami konsep JDBC 2. Myenggunakan JDBC 10.1 Pengenalan JDBC

Java Database Connectivity (JDBC) merupakan Application Programming Interface (API), dalam paket java.sql.*, yang memungkinkan untuk mengakses segala database menggunakan Java. Dari JDBC ini kemudian muncul konsepkonsep yang berdiri di atas JDBC, seperti SQLMapping (misal menggunakan iBatis), Data Access Object (DAO, misal menggunakan SpringDAO), dan Object Relational Mapping (ORM, misal menggunakan Oracle Toplink dan Hibernate). Posisi JDBC dalam program Java dapat dilihat pada gambar berikut:

Gambar 10.1 Posisi JDBC dalam program Java 10.2 Menggunakan JDBC Pada dasarnya, untuk mengakses database dengan JDBC, diperlukan langkah-langkah berikut: a. Load Database Driver b. Buat koneksi c. Lakukan pemrosesan query d. Tutup koneksi Berdasarkan langkah di atas maka kita memerlukan Database Driver dari masingmasing vendor database (misal untuk MySQL bisa diunduh dari http://mysql.com ) supaya JDBC bisa mengakses database dari vendor tersebut. Untuk meload sebuah driver digunakan dynamic class loading, contoh: Class.forName(com.mysql.jdbc.Driver); Sintaks di atas digunakan untuk meload database driver milik MySQL ke dalam system property jdbc.drivers. Setelah driver diload,class javax.sql.DriverManager dibutuhkan untuk meload system property jdbc.drivers. Saat koneksi dibutuhkan, method getConnection() dari Driver manager digunakan untuk membuat koneksi JDBC. Connection con = DriverManager.getConnection( "jdbc:mysql://host:port/dbname", 80

"dbuser", "dbpass" ); Setelah koneksi berhasil terbentuk, maka bisa dilakukan interaksi dengan database melalui perintahperintah SQL, dengan terlebih dahulu membuat objek Statement sebagai berikut: . . . . . Statement stmt = con.createStatement(); ResultSet rset = stmt.executeQuery(SQLQuery); . . . . . SQLQuery merupakan suatu String yang berisi query ke database. Hasil query tersebut disimpan di objek ResultSet. Untuk menampilkan hasil dari query tersebut, digunakan variabel rset yang kemudian dimasukkan dalam suatu loop sebagai berikut: . . . . . while(rset.next()){ System.out.print(rset.getString(1)+"--"); System.out.print(rset.getString(2)+"--"); System.out.print(rset.getString(3)); System.out.println(); } . . . . . perintah while di atas akan mengambil hasil kolom pertama, kedua dan ketiga. Bila koneksi telah dilakukan dan aplikasi tidak lagi membutuhkan koneksi ke database, session yang terbentuk antara aplikasi dengan database sebaiknya ditutup dengan kode sebagai berikut: try{ con.close(); }catch(SQLException ex){} 10.3 Membuat Form CRUD dengan JDBC Pada bagian ini, kita akan mencoba untuk membuat sebuah aplikasi CRUD (Create, Read, Update, Delete) sederhana menggunakan JDBC. Sebelumnya dibuat dulu database dengan satu tabel mahasiswa dengan 4 atribut (Nama, NIM, JenisKelamin dan Jurusan). Untuk membuat form CRUD, lakukan langkah-langkah berikut ini. Pertama kita buat aplikasi desktop menggunakan JTable sesuai gambar di bawah ini. 1. Pilih File > New File > Swing GUI Form > JFrame Form.

81

Gambar 10.2 Dialog window 2. Isi nama Classnya dan pilih packagenya sesuai anak panah. 3. Pertama kita membuat Table dengan Mendrag JTable pada Palette. Kita beri nama dgn klik kanan pilih change variable name,kita beri nama misal : table 4. Pilih Table klik kanan Properties,seperti gambar di bawah ini :

Gambar 10.3 Tabel Properties 5. Buat kolom dengan klik Model lalu isi nama kolom kolomnya seperti gambar di bawah ini sesuai anak panah:

Gambar 10.4 JTable Model 6. Setting di source code nya. Pada baris paling akhir di sourcenya buat obyek untuk TableModel langsung ketik code di bawah ini: private javax.swing.table.DefaultTableModel tblModel = getDefaultTabelModel(); 7. Buat fungsi getDefaultTabelModel(); dan Tabel untuk pengaturan tablenya seperti pada gambar di bawah ini, juga diketik secara manual:

82

8. Setting di konstruktornya, untuk pengaturan lebar kolomnya. Tambahkan source code berikut: tabel.setModel(tblModel); Tabel(tabel,new int[]{120,180,120,120}); 9. Cara menginput data kedalam ke JTable. Pertama kali kita deklarasikan dulu variable array satu dimensi di luar fungsi supaya dikenal disemua fungsi yang lain. String data[] = new String [4]; Di dalam fungsi private void cmdsimpanactionperformed() tambahkan kode berikut.

10. Cara Menampilkan Data dari JTable kedalam Form di Netbeans. Nanti kita akan mengklik 2x baris dalam JTable yang berisi data yang akan ditampilkan kedalam Form di Netbeans, caranya pilih Inspector kemudian ikuti petunjuk di bawah ini:

83

Gambar 10.5 Inspector window Setelah itu akan muncul Fungsi : private void tabelMouseClicked(java.awt.event.MouseEvent evt) { } Kita modifikasi Fungsi tersebut sehingga menjadi seperti di bawah ini :

Dengan code di atas 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. 11. Cara mengedit data dalam JTable. Setelah data muncul dalam Form untuk mengeditnya ikuti code di bawah ini:

84

12. Cara menghapus data dalam JTable. Ketikan code di bawah ini: private void cmdhapusActionPerformed( java.awt.event.ActionEvent evt) { tblModel.removeRow(row); } Langkah berikutnya adalah melakukan setting terhadap database dan koneksi JDBC yang digunakan. 1. Pertama kita buat file dengan extention .ini pada folder lib dengan terlebih dahulu membuat folder lib(misal : database.ini). yang isinya seperti di bawah ini:

Gambar 10.6 Setting JDBC 2. Lalu kita buat file Database.java untuk melakukan relasi dengan file Database.ini yang isinya:

85

3. Memanggil class Database.java jika kita ingin melakukan pemrosesan data yang berhubungan ke database. Untuk mengambil data dari file database.ini kita akan memodifikasi program seperti di bawah ini pada sebelum dan dalam Konstruktor:

4. Lalu kita buat Function setDefaultTable():

86

5. Setelah code di atas selesai, data dari mysql akan tertampil pada table di Form javanya seperti gambar di bawah ini:

Gambar 10.7 Aplikasi jadi Berikutnya adalah membuat fungsi untuk pemrosesan data dengan Java. Berikut langkahlangkahnya. 1. Untuk pembuatan menu input . klik kanan tombol Input lalu pilih Event ->action->Action Performed Setelah itu buatlah code dalam function yg baru terbentuk seperti di bawah ini:

87

2. 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 code di bawah ini:

3. Untuk pembuatan menu edit . klik kanan tombol ubah di Netbeans lalu pilih Event ->Action->ActionPerformed. Untuk lebih jelasnya lihat code berikut:

88

4. 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):

89

11 Networking
Overview Java memberikan kemudahan dalam pengembangan aplikasi yang meliputi berbagai fungsi yang melalui jaringan. Pada bagian ini, akan dibahas tentang konsep dasar jaringan dan aplikasi via jaringan sederhana menggunakan Java. Tujuan 1. Mengerti konsep dasar jaringan 2. Membuat aplikasi menggunakan package jaringan Java 11.1 Konsep Dasar Jaringan Jika sebelumnya Anda telah mengetahui, bahwa internet adalah jaringan global dengan berbagai jenis komputer yang berbeda yang tersambung dalam berbagai cara. Walaupun terdapat perbedaan dalam software dan hardware yang tersambung bersama-sama, hal tersebut sangatlah bagus bahwa internet masih dapat berfungsi. Hal ini memungkinkan karena standar komunikasi memiliki ketetapan dan juga keselarasan. Standar ini menjamin kesesuaian dan kekuatan komunikasi di antara luasnya sistem pada internet. Mari kita pelajari beberapa standar yang berlaku. 11.1.1 IP Address Pada setiap komputer yang tersambung dengan internet memiliki alamat IP yang unik. Alamat IP secara logika hampir sama dengan alamat pengiriman surat tradisional di mana memiliki arti bahwa alamat yang bersifat unik tersebut mewakili dari keterangan sebuah object. Alamat tersebut diwakilkan dalam 32-bit nomor yang digunakan sebagai pengenal yang bersifat unik dari setiap komputer yang tersambung dengan internet. 192.1.1.1 adalah contoh dari sebuah alamat IP. Mereka juga bisa ditulis dengan bentuk simbol seperti docs.rinet.ru. 11.1.2 Protokol Karena terdapat jenis komunikasi yang berbeda-beda yang mungkin terjadi pada internet, di sana harus terdapat suatu jumlah yang sama untuk mekanisme penangangan komunikasi. Setiap jenis komunikasi membutuhkan protokol yang spesifik dan unik. Protokol mengatur peraturan dan standar yang menetapkan jenis komunikasi internet yang khusus. Hal tersebut menjelaskan format data yang dikirim lewat internet, seiring dengan bagaimana dan kapan itu dikirim. Konsep dari protokol tentunya tidak terlalu asing untuk kita. Mengingat sudah beberapa kali Anda telah menggunakan jenis percakapan ini: "Hallo." "Hallo. Selamat siang. Bolehkah saya berbicara dengan Joan?" "Okay, mohon tunggu sebentar." "terima kasih." ... Ini adalah protokol sosial yang digunakan ketika dalam pembicaraan melalui telepon. Jenis protokol tipe ini memberikan kita kepercayaan untuk mengetahui apa yang harus dilakukan dalam situasi tersebut. Mari kita lihat beberapa protokol penting yang digunakan pada internet. Hypertext Transfer Protocol (HTTP) adalah salah satu protokol yang sering digunakan. Digunakan untuk mentransfer dokumen HTML pada Web. Kemudian, ada juga File Transfer Protocol (FTP) di mana lebih umum dibandingkan dengan HTTP dan memperbolehkan Anda untuk mentransfer file biner lewat intenet. Kedua protokol tersebut memiliki peraturan masing-masing dan standar dalam pengiriman data. Java juga mendukung kedua protokol tersebut.

90

11.1.3 Port Sekarang, protokol hanya bisa dipertimbangkan jika digunakan dalam konteks suatu jasa. Sebagai contoh, protokol HTTP digunakan ketika Anda menyediakan isi Web melalui layanan HTTP. Setiap komputer pada internet dapat menyediakan berbagai jenis layanan melalui berbagai jenis protokol yang mendukung. Masalahnya, bagaimanapun juga, kita harus mengetahui jenis layanan sebelum sebuah informasi dapat ditransfer. Untuk itulah port digunakan. Port adalah 16-bit nomor di mana mengenal setiap layanan yang ditawarkan oleh server jaringan. Untuk menggunakan layanan khusus dan oleh karena itu, jalur komunikasi yang melewati protokol tertentu, Anda perlu menyambungkan pada port yang sesuai. Port dihubungkan dengan nomor dan beberapa nomor bersifat spesifik yang berhubungan dengan jenis layanan khusus. Port dengan layanan pekerjaan tertentu disebut port standar. Sebagai contoh, layanan FTP terletak pada port 21 sedangkan layanan HTTP terletak pada port 80. Jika Anda ingin menggunakan file transfer FTP, Anda perlu terhubung dengan port 21 pada komputer Anda. Sekarang, semua standar layanan tertentu diberikan nilai port di bawah 1024. port dengan nilai di atas 1024 disediakan untuk komunikasi custom. Jika terdapat kasus di mana port dengan nilai di atas 1024 telah digunakan oleh beberapa komunikasi custom, Anda harus mencari nilai lain yang tidak digunakan. 11.1.4 Paradigma client/server Paradigma client/server adalah dasar untuk framework jaringan Java. Tentunya, penetapan ini terdiri dari dua elemen besar, yaitu client dan server. Client adalah mesin yang membutuhkan beberapa jenis informasi sedangkan server adalah mesin yang menyimpan informasi dan menunggu untuk menyampaikannya pada client. Paradigma ini menjelaskan sebuah skenario sederhana. Tentunya, client terhubung dengan server dan meminta informasi. Kemudian server mengingat permintaan dan mengembalikan informasi yang tersedia kepada client. 11.1.5 Socket Konsep umum jaringan yang terakhir sebelum kita membahas lebih dalam tentang Java networking adalah dengan memperhatikan sockets. Kebanyakan pemrograman Java network menggunakan jenis khusus dari komunikasi jaringan yang diketahui sebagai sockets. Socket adalah software abstrak untuk media input atau output komunikasi. Socket digunakan oleh Java untuk mengatasi komunikasi pada jaringan level rendah. Jalur komunikasi ini memungkinkan untuk mentransfer data melalui port khusus. Singkatnya, socket adalah point terakhir untuk komunikasi antara dua mesin. 11.2 Java Networking Package Package dari java.net menyediakan banyak class yang berguna untuk pengembangan aplikasi jaringan. Untuk daftar lengkap dari class jaringan dan interface, dapat dilihat pada dokumentasi API. Pembelajaran akan difokuskan pada empat class yaitu : class ServerSocket, Socket, MulticastSocket, dan DatagramPacket. 11.2.1 Class ServerSocket dan Socket Class ServerSocket menyediakan fungsi-fungsi dasar dari sebuah server. Tabel berikut menjelaskan dua dari empat constructor pada class ServerSocket: Nama Constructor ServerSocket(int port) Tabel 11.1 Contructor class ServerSocket Fungsi Ketika sebuah server menetapkan suatu port tertentu, sebuah port 0 menugaskan sebuah server kepada port bebas manapun. 91

Panjang antrian maksimum untuk koneksi yang akan datang diatur sebanyak 50 sebagai defaultnya. ServerSocket(int port, int backlog) Ketika sebuah server menetapkan suatu port tertentu, panjang antrian maksimum untuk koneksi yang akan datang berdasarkan pada parameter backlog.

Berikut ini adalah beberapa method class pada ServerSocket: Nama method public Socket accept() public void close() public int getLocalPort() public boolean isClosed() Tabel 11.2 Method class ServerSocket Fungsi Menyebabkan server untuk menunggu dan mendengarkan dari koneksi client, kemudian menerimanya. Menutup socket server. Client tidak dapat lagi terhubung ke server hingga dibuka kembali Mengembalikan port di mana socket juga membatasi Mendeteksi apakah socket tertutup atau belum

Contoh yang berhasil melakukan implementasi sebuah server sederhana, di mana sebuah informasi sederhana dikirim oleh client dapat dilihat pada listing program berikut ini: import java.net.*; import java.io.*; public class EchoingServer { public static void main(String [] args) { ServerSocket server = null; Socket client; try { server = new ServerSocket(1234); //1234 nomor port yang belum digunakan } catch (IOException ie) { System.out.println("Cannot open socket."); System.exit(1); } while(true) { try { client = server.accept(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); InputStream clientIn = client.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(clientIn)); pw.println(br.readLine()); } catch (IOException ie) { } } 92

} } Ketika class ServerSocket mengimplementasikan server socket, Class Socket mengimplementasikan socket client. Class Socket memiliki delapan constructor, dua di antaranya siap dipanggil. Langsung saja kita lihat dua constructor tersebut. Nama Constructor Socket(String host, int port) Socket(InetAddress port) address, Tabel 11.3 Constructor class Socket Fungsi Membuat sebuah socket client di mana dihubungkan dengan diberikan nomor port pada host tertentu. int Membuat sebuah socket client di mana dihubungkan dengan diberikannya nomor port pada alamat IP tertentu.

Berikut adalah beberapa dari method class pada Socket: Nama Method public void close() public InputStream getInputStream() public OutputStream getOutputStream() public InetAddress getInetAddress() public int getPort() public boolean isClosed() Tabel 11.4 Method class Socket Fungsi Menutup socket client Menerima kembali input stream yang berhubungan dengan socket ini. Menerima kembali output stream yang berhubungan dengan socket ini. Mengembalikan alamat IP kepada socket ini pada saat masih terhubung. Mengembalikan remote port kepada socket ini pada saat masih terhubung. Mendeteksi apakah socket telah tertutup atau tidak

Contoh yang berhasil melakukan implementasi sebuah client sederhana, di mana mengirim data kepada server dapat dilihat pada listing program di bawah ini: import java.io.*; import java.net.*; public class MyClient { public static void main(String args[]) { try { //Socket client = new Socket("133.0.0.1", 1234); Socket client = new Socket(InetAddress.getLocalHost(), 1234); InputStream clientIn = client.getInputStream(); OutputStream clientOut = client.getOutputStream(); PrintWriter pw = new PrintWriter(clientOut, true); BufferedReader br = new BufferedReader(new 93

InputStreamReader(clientIn)); BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Type a message for the server: "); pw.println(stdIn.readLine()); System.out.println("Server message: "); System.out.println(br.readLine()); pw.close(); br.close(); client.close(); } catch (ConnectException ce) { System.out.println("Cannot connect to the server."); } catch (IOException ie) { System.out.println("I/O Error."); } } } 11.2.2 Class MulticastSocket dan DatagramPacket Class MulticastSocket sangat berguna untuk aplikasi yang mengimplementasikan komunikasi secara berkelompok. Alamat IP untuk kelompok multicast berkisar antara 224.0.0.0 hingga 239.255.255.255. Meskipun begitu, alamat 224.0.0.0 telah dipesan dan seharusnya tidak digunakan. Class ini memiliki tiga constructor tetapi yang akan dibahas hanya salah satu dari ketiga constructor ini. Nama Constructor Tabel 11.5 Constructor class MulticastSocket Fungsi

MulticastSocket(int port) Membuat multicast socket dibatasi dengan pemberian nomor port Tabel berikutnya memberikan penjelasan beberapa method MulticastSocket. Nama Method Tabel 11.6 Method class MulticastSocket Fungsi Bergabung dengan kelompok multicast pada alamat tertentu Meninggalkan kelompok multicast pada alamat tertentu Metode turunan dari class DatagramSocket. Mengirim p dari socket ini.

public void joinGroup(InetAddress mcastaddr) public void leaveGroup(InetAddress mcastaddr) public void send(DatagramPacket p)

Sebelum seseorang dapat mengirim pesan kepada suatu kelompok, pertama kali yang harus dilakukan oleh orang tersebut adalah harus menjadi anggota dari multicast kelompok dengan menggunakan method joinGroup. Sekarang seorang anggota dapat mengirim pesan melalui method send. Jika Anda telah selesai berbicara dengan kelompok, Anda dapat menggunakan method leaveGroup untuk melepaskan keanggotaan Anda. 94

Sebelum melihat contoh dalam menggunakan class multicastSocket, pertama-tama mari kita lihat pada class DatagramPacket. Perhatikan bahwa dalam method send dari class multiSocket, dibutuhkan parameter yaitu object DatagramPacket. Sehingga, kita harus mengerti object jenis ini sebelum menggunakan method send. Class DatagramPacket digunakan untuk mengirim data melalui protokol connectionless seperti multicast. Masalah yang ditimbulkan bahwa pengiriman packet tidak terjamin. Mari kita perhatikan dua dari enam constructor. Nama Constructor Tabel 11.7 Constructor class DatagramPacket Fungsi

DatagramPacket(byte[] buf, int length) Constructor dari datagramPacket untuk menerima paket dengan panjang length. Seharusnya kurang dari atau sama dengan ukuran dari buffer buf. DatagramPacket(byte[] buf, int length, InetAddress address, int port) Constructor dari datagramPacket untuk mengirim paket dengan panjang length dengan nomor port tertentu dan host tertentu.

Berikut adalah beberapa method dari class DatagramPacket. Nama Method public byte[] getData() public InetAddress getAddress() public int getLength() public int getPort() Tabel 11.8 Method class DatagramPacket Fungsi Mengembalikan buffer di mana data telah disimpan Mengembalikan alamat IP mesin di mana paket yang dikirim atau yang diterima Mengembalikan panjang data yang dikirim atau diterima Mengembalikan nomor port pada remote host di mana paket yang dikirim atau yang diterima

Contoh multicast kita juga mengandung dua class, server dan client. Server menerima pesan dari client dan mencetak pesan tersebut. Berikut adalah class server: import java.net.*; public class ChatServer { public static void main(String args[]) throws Exception { MulticastSocket server = new MulticastSocket(1234); InetAddress group = InetAddress.getByName("234.5.6.7"); //getByName Mengembalikan alamat IP yang diberikan oleh Host server.joinGroup(group); boolean infinite = true; /* Server terus-menerus menerima data dan mencetaknya*/ while(infinite) { byte buf[] = new byte[1024]; DatagramPacket data = new DatagramPacket(buf,buf.length); server.receive(data); 95

String msg = new String(data.getData()).trim(); System.out.println(msg); } server.close(); } } Berikut adalah class client: import java.net.*; import java.io.*; public class ChatClient { public static void main(String args[]) throws Exception { MulticastSocket chat = new MulticastSocket(1234); InetAddress group = InetAddress.getByName("234.5.6.7"); chat.joinGroup(group); String msg = ""; System.out.println("Type a message for the server:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); msg = br.readLine(); DatagramPacket data = new DatagramPacket(msg.getBytes(), 0, msg.length(), group, 1234); chat.send(data); chat.close(); } }

96

Anda mungkin juga menyukai