Bab 2

Exceptions dan Assertions

2.1 Tujuan

Dasar penanganan exception telah dikenalkan pada anda di kursus pemrograman 

pertama. Bab ini membahas secara lebih dalam mengenai exception dan juga sedikit 

menyinggung tentang assertion.

Setelah menyelesaikan pembahasan, anda diharapkan dapat :

1. Menangani exception dengan menggunakan try, catch dan finally

2. Membedakan penggunaan antara throw dengan throws

3. Menggunakan exception class yang berbeda – beda

4. Membedakan antara checked exceptions dan unchecked exceptions

5. Membuat exception class tersendiri

6. Menjelaskan keunggulan penggunaan assertions

7. Menggunakan assertions

2.2 Apa itu Exception?

2.2.1Pendahuluan

Bugs  dan error  dalam sebuah program sangat sering muncul  meskipun program 

tersebut  dibuat  oleh  programmer  berkemampuan  tinggi.  Untuk  menghindari 

pemborosan  waktu  pada  proses  error-checking,  Java  menyediakan  mekanisme 

penanganan exception.

Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi 

saat  runtime,  menyebabkan  gangguan  pada  alur  eksekusi  program.  Terdapat 

beberapa tipe error yang dapat muncul. Sebagai contoh adalah error pembagian 0, 

mengakses  elemen di  luar  jangkauan sebuah array,  input  yang tidak  benar  dan 

membuka file yang tidak ada.

2.2.2Error dan Exception Classes

Seluruh exceptions adalah subclasses, baik secara langsung maupun tidak langsung, 

dari sebuah root class  Throwable. Kemudian, dalam class ini terdapat dua kategori 

umum : Error class dan Exception class.

Exception  class  menunjukkan  kondisi  yang  dapat  diterima  oleh  user  program. 

Umumnya hal  tersebut disebabkan oleh beberapa kesalahan pada kode program. 

Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.

Pengenalan Pemrograman  2 1


Error class digunakan oleh Java run-time untuk menangani error yang muncul pada 

saat dijalankan. Secara umum hal ini  di luar control user karena kemunculannya 

disebabkan oleh run-time environment. Sebagai contoh adalah out of memory dan 

harddisk crash.

2.2.3Sebuah Contoh

Perhatikan contoh program berikut :

class DivByZero {

public static void main(String args[]) {

System.out.println(3/0);

System.out.println(“Cetak.”);

}

}

Jika kode tersebut dijalankan, akan didapatkan pesan kesalahan sebagai berikut :

Exception in thread "main" java.lang.ArithmeticException: / by 

zero at DivByZero.main(DivByZero.java:3)

Pesan  tersebut  menginformasikan tipe  exception  yang terjadi  pada baris  dimana 

exception itu berasal. Inilah aksi default yang terjadi bila terjadi exception yang tidak 

tertangani. Jika tidak terdapat kode yang menangani exception yang terjadi, aksi 

default  akan  bekerja  otomatis.  Aksi  tersebut  pertama-tama  akan  menampilkan 

deskripsi  exception  yang  terjadi.  Kemudian  akan  ditampilkan  stack  trace  yang 

mengindentifikasi method dimana exception terjadi. Pada bagian akhir, aksi default 

tersebut akan menghentikan program secara paksa.

Bagaimana jika anda ingin melakukan penanganan atas exception dengan cara yang 

berbeda? Untungnya, bahasa pemrograman Java memiliki 3 keywords penting dalam 

penanganan exception, yaitu try, catch dan finally.

Pengenalan Pemrograman  2 2


2.3 Menangkap Exception

2.3.1Try - Catch

Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan 

dalam  menangani  bermacam  tipe  exception.  3  Keyword  tersebut  digunakan 

bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada 2 

keyword pertama, kemudian membahas finally pada bagian akhir.

Berikut ini adalah penulisan try-catch secara umum :

try {

<code to be monitored for exceptions>

} catch (<ExceptionType1> <ObjName>) {

<handler if ExceptionType1 occurs>

}

...

} catch (<ExceptionTypeN> <ObjName>) {

<handler if ExceptionTypeN occurs>

}

Petunjuk Penulisan Program :

Blok catch dimulai setelah kurung kurawal dari kode try atau catch terkait. 

Penulisan kode dalam blok mengikuti identasi

Gunakan  contoh  kode  tersebut  pada  program  DivByZero  yang  telah  dibuat 

sebelumnya :

class DivByZero {

public static void main(String args[]) {

try {

System.out.println(3/0);

System.out.println(“Cetak.”);

} catch (ArithmeticException exc) {

//Reaksi atas kejadian

System.out.println(exc);

}

System.out.println(“Setelah Exception.”);

}

}

Kesalahan  pembagian  dengan  bilangan  0  adalah  salah  satu  contoh  dari 

ArithmethicException. Tipe exception kemudian mengindikasikan klausa  catch pada 

class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan 

deskripsi dari permasalahan.

Pengenalan Pemrograman  2 3


Output program saat eksekusi akan terlihat sebagai berikut :

java.lang.ArithmeticException: / by zero

After exception.

Bagian kode yang terdapat pada blok  try dapat menyebabkan lebih dari satu tipe 

exception.  Dalam  hal  ini,  terjadinya  bermacam  tipe  kesalahan  dapat  ditangani 

menggunakan  beberapa  blok  catch. Perlu  dicatat  bahwa  blok  try dapat  hanya 

menyebabkan sebuah exception pada satu waktu, namun dapat pula menampikan 

tipe exception yang berbeda di lain waktu.

Berikut adalah contoh kode yang menangani lebih dari satu exception :

class MultipleCatch {

public static void main(String args[]) {

try {

int den = Integer.parseInt(args[0]); //baris 4

System.out.println(3/den); //baris 5

} catch (ArithmeticException exc) {

System.out.println(“Nilai Pembagi 0.”);

} catch (ArrayIndexOutOfBoundsException exc2) {

System.out.println(“Missing argument.”);

}

System.out.println(“After exception.”);

}

}

Pada  contoh  ini,  baris  ke-4  akan  menghasilkan  kesalahan  berupa 

ArrayIndexOutOfBoundsException bilamana seorang user alpa dalam memasukkan 

argument,  sedang baris  ke-5  akan menghasilkan  kesalahan  ArithmethicException 

jika pengguna memasukkan nilai 0 sebagai sebuah argument.

Pelajari apakah yang akan terjadi terhadap program bila argumen – argumen berikut 

dimasukkan oleh user : 

a) Tidak ada argument

b) 1

c) 0

Penggunaan try bersarang diperbolehkan dalam pemrograman Java.

class NestedTryDemo {

public static void main(String args[]){

try {

int a = Integer.parseInt(args[0]);

try {

int b = Integer.parseInt(args[1]);

System.out.println(a/b);

} catch (ArithmeticException e) {

System.out.println(“Divide by zero error!");

}

} catch (ArrayIndexOutOfBoundsException) {

System.out.println(“2 parameters are required!");

}

}

Pengenalan Pemrograman  2 4


}

Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan :

a) Tidak ada argumen

b) 15

c) 15 3

d) 15 0

Kode berikut menggunakan try bersarang tergabung dengan penggunaan method.

class NestedTryDemo2 {

static void nestedTry(String args[]) {

try {

int a = Integer.parseInt(args[0]);

int b = Integer.parseInt(args[1]);

System.out.println(a/b);

} catch (ArithmeticException e) {

System.out.println("Divide by zero error!");

}

}

public static void main(String args[]){

try {

nestedTry(args);

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("2 parameters are required!");

}

}

}

Bagaimana output program tersebut jika diimplementasikan terhadap argument – 

argument berikut :

a) Tidak ada argumen

b) 15

c) 15 3

d) 15 0

2.3.2Keyword Finally

Saatnya anda mengimplementasikan  finally dalam blok  try-cacth.  Berikut ini  cara 

penggunaan keyword tersebut :

try {

<kode monitor exception>

} catch (<ExceptionType1> <ObjName>) {

<penanganan jika ExceptionType1 terjadi>

} ...

} finally {

<kode yang akan dieksekusi saat blok try berakhir>

}

Pengenalan Pemrograman  2 5


Petunjuk Penulisan Program :

Sekali lagi, coding convention juga mengatur penggunaan finally seperti halnya 

pada blok catch. Penggunaan finally dimulai setelah kurung kurawal penutup blok 

catch terkait. Penulisan dalam blok tersebut juga mengalami identasi.

Blok finally mengandung kode penanganan setelah penggunaan try dan catch. Blok 

kode ini selalu tereksekusi walaupun sebuah exception terjadi atau tidak pada blok 

try. Blok kode tersebut juga akan menghasilkan nilai true meskipun return, continue 

ataupun break tereksekusi. Terdapat 4 kemungkinan skenario yang berbeda dalam 

blok  try-catch-finally.  Pertama,  pemaksaan  keluar  program  terjadi  bila  control 

program dipaksa untuk melewati blok  try menggunakan  return,  continue ataupun 

break. Kedua, sebuah penyelesaian normal terjadi jika  try-catch-finally tereksekusi 

secara normal tanpa terjadi error apapun. Ketiga, kode program memiliki spesifikasi 

tersendiri dalam blok catch terhadap exception yang terjadi. Yang terakhir, kebalikan 

skenario ketiga. Dalam hal ini, exception yang terjadi tidak terdefinisikan pada blok 

catch manapun. Contoh dari skenario – skenario tersebut terlihat pada kode berikut 

ini :

class FinallyDemo {

static void myMethod(int n) throws Exception{

try {

switch(n) {

case 1: System.out.println("case pertama");

return;

case 3: System.out.println("case ketiga");

throw new RuntimeException("demo case 

ketiga");

case 4: System.out.println("case keempat");

throw new Exception("demo case 

keempat");

case 2: System.out.println("case Kedua");

}

} catch (RuntimeException e) {

System.out.print("RuntimeException terjadi: ");

System.out.println(e.getMessage());

} finally {

System.out.println("try-block entered.");

}

}

public static void main(String args[]){

for (int i=1; i<=4; i++) {

try {

FinallyDemo.myMethod(i);

} catch (Exception e){

System.out.print("Exception terjadi: ");

System.out.println(e.getMessage());

}

System.out.println();

}

}

}

Pengenalan Pemrograman  2 6


2.4 Melempar Exception

2.4.1Keyword Throw

Disamping  menangkap  exception,  Java  juga  mengijinkan  seorang  user  untuk 

melempar sebuah exception. Sintax pelemparan exception cukup sederhana.

throw <exception object>;

Perhatikan contoh berikut ini.

/* Melempar exception jika terjadi kesalahan input */

class ThrowDemo {

public static void main(String args[]){

String input = “invalid input”;

try {

if (input.equals(“invalid input”)) {

throw new RuntimeException("throw demo");

} else {

System.out.println(input);

}

System.out.println("After throwing");

} catch (RuntimeException e) {

System.out.println("Exception caught here.");

System.out.println(e);

}

}

}

2.4.2Keyword Throws

Jika  sebuah  method  dapat  menyebabkan  sebuah  exception  namun  tidak 

menangkapnya,  maka digunakan keyword  throws.  Aturan ini  hanya berlaku pada 

checked exception. Anda akan mempelajari lebih lanjut tentang checked exception 

dan unchecked exception pada bagian selanjutnya, “Kategori Exception”.

Berikut ini penulisan syntax menggunakan keyword throws :

<type> <methodName> (<parameterList>) throws <exceptionList> {

<methodBody>

}

Sebuah method perlu untuk menangkap ataupun mendaftar seluruh exceptions yang 

mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, RuntimeException, 

ataupun subclass-nya.

Pengenalan Pemrograman  2 7


Contoh  berikut  ini  menunjukkan  bahwa  method  myMethod tidak  menangani 

ClassNotFoundException.

class ThrowingClass {

static void myMethod() throws ClassNotFoundException {

throw new ClassNotFoundException ("just a demo");

}

}

class ThrowsDemo {

public static void main(String args[]) {

try {

ThrowingClass.myMethod();

} catch (ClassNotFoundException e) {

System.out.println(e);

}

}

}

2.5 Kategori Exception

2.5.1Exception Classes dan Hierarchy

Seperti  yang  disebutkan  sebelumnya,  root  class  dari  seluruh  exception  classes 

adalah  Throwable  class.  Yang  disebutkan  dibawah  ini  adalah  exception  class 

hierarchy. Seluruh exceptions ini terdefinisi pada package java.lang.

Tabel 1.4. Exception Class Hierarchy

Pengenalan Pemrograman  2 8


Sekarang anda sudah cukup familiar dengan beberapa exception classes, saatnya 

untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke 

superclass.

class MultipleCatchError {

public static void main(String args[]){

try {

int a = Integer.parseInt(args [0]);

int b = Integer.parseInt(args [1]);

System.out.println(a/b);

} catch (Exception e) {

System.out.println(e);

} catch (ArrayIndexOutOfBoundsException e2) {

System.out.println(e2);

}

System.out.println("After try-catch-catch.");

}

}

Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception 

class adalah superclass dari ArrayIndexOutOfBoundsException class.

MultipleCatchError.java:9: exception 

java.lang.ArrayIndexOutOfBoundsException has already been 

caught  } catch (ArrayIndexOutOfBoundsException e2) {

2.5.2Checked dan Unchecked Exceptions

Exception terdiri atas checked dan unchecked exceptions.

Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler 

memeriksa keseluruhan program apakah menangkap atau mendaftar exception yang 

terjadi  dalam  sintax  throws.  Apabila  checked  exception  tidak  didaftar  ataupun 

ditangkap, maka compiler error akan ditampilkan. 

Tidak seperti checked exceptions, unchecked exceptions tidak berupa compile-time 

checking  dalam penanganan  exceptions.  Fondasi  dasar  dari  unchecked exception 

classes adalah Error, RuntimeException dan subclass-nya. 

2.5.3User Defined Exceptions

Meskipun beberapa exception classes terdapat pada package java.lang namun tidak 

mencukupi untuk menampung seluruh kemungkinan tipe exception yang mungkin 

terjadi. Sehingga sangat mungkin bahwa anda perlu untuk membuat tipe exception 

tersendiri.

Dalam pembuatan tipe exception anda sendiri,  anda hanya perlu untuk membuat 

sebuah extended class terhadap RuntimeException class, maupun Exception class 

lain.  Selanjutnya  tergantung  pada  anda  dalam  memodifikasi  class  sesuai 

Pengenalan Pemrograman  2 9


permasalahan yang akan diselesaikan. Members dan constructors dapat dimasukkan 

pada exception class milik anda.

Berikut ini contohnya :

class HateStringException extends RuntimeException{

/* Tidak perlu memasukkan member ataupun construktor */

}

class TestHateString {

public static void main(String args[]) {

String input = "invalid input";

try {

if (input.equals("invalid input")) {

throw new HateStringException();

}

System.out.println("String accepted.");

} catch (HateStringException e) {

System.out.println("I hate this string: " + input + 

".");

}

}

}

2.6 Assertions

2.6.1User Defined Exceptions

Assertions  mengijinkan  programmer  untuk  menentukan  asumsi  yang  dihadapi. 

Sebagai contoh, sebuah tanggal dengan area bulan tidak berada antara 1 hingga 12 

dapat diputuskan bahwa data tersebut tidak valid. Programmer dapat menentukan 

bulan harus berada diantara area tersebut. Meskipun hal itu dimungkinkan untuk 

menggunakan contructor lain untuk mensimulasikan fungsi dari assertions, namun 

sulit untuk dilakukan karena fitur assertion dapat tidak digunakan. Hal yang menarik 

dari assertions adalah seorang user memiliki pilihan untuk digunakan atau tidak pada 

saat runtime.

Assertion  dapat  diartikan  sebagai  extensi  atas  komentar  yang  menginformasikan 

pembaca  kode  bahwa  sebagian  kondisi  harus  terpenuhi.  Dengan  menggunakan 

assertions,  maka  tidak  perlu  untuk  membaca  keseluruhan  kode  melalui  setiap 

komentar  untuk  mencari  asumsi  yang  dibuat  dalam kode.  Namun,  menjalankan 

program tersebut akan memberitahu anda tentang assertion yang dibuat benar atau 

salah. Jika assertion tersebut salah, maka AssertionError akan terjadi.

2.6.2Mengaktifkan dan Menonaktifkan Exceptions

Penggunaan  assertions  tidak  perlu  melakukan  import  package  java.util.assert. 

Menggunakan assertions lebih tepat ditujukan untuk memeriksa parameter dari non-

public methods jika public methods dapat diakses oleh class lain. Hal itu mungkin 

terjadi  bila  penulis  dari  class  lain  tidak  menyadari  bahwa  mereka  dapat 

menonaktifkan assertions. Dalam hal ini program tidak dapat bekerja dengan baik. 

Pada non-public methods, hal tersebut tergunakan secara langsung oleh kode yang 

Pengenalan Pemrograman  2 10


ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga 

mereka  menyadari  bahwa  saat  menjalankannya,  assertion  harus  dalam keadaan 

aktif.

Untuk  mengkompilasi  file  yang  menggunakan  assertions,  sebuah  tambahan 

parameter perintah diperlukan seperti yang terlihat dibawah ini :

javac –source 1.4 MyProgram.java

Jika anda ingin untuk menjalankan program tanpa menggunakan fitur assertions, 

cukup jalankan program secara normal.

java MyProgram

Namun,  jika  anda  ingin  mengaktifkan  assertions,  anda  perlu  menggunakan 

parameter –enableassertions atau –ea.

java –enableassertions MyProgram

2.6.3Sintax Assertions

Penulisan assertions memiliki dua bentuk.

Bentuk yang paling sederhana terlihat sebagai berikut :

assert <expression1>;

dimana <expression1>  adalah kondisi dimana assertion bernilai true.

Bentuk yang lain menggunakan dua ekspresi, berikut ini cara penulisannya :

assert <expression1> : <expression2>;

dimana  <expression1>  adalah kondisi  assertion bernilai  true dan  <expression2>  adalah 

informasi yang membantu pemeriksaan mengapa program mengalami kesalahan.

class AgeAssert {

public static void main(String args[]) {

int age = Integer.parseInt(args[0]);

assert(age>0);

/* jika masukan umur benar (misal, age>0) */

if (age >= 18) {

System.out.println(“Congrats! You're an adult! =)”);

}

}

}


Abstract Class 
 
Sebuah class yang tidak abstract disebut sebagai 
concrete class, sejauh ini class yang sudah dikenal 
adalah concrete class. 
 
Bagaimana bisa diketahui bahwa sebuah class 
adalah abstract?  
 
Bila rincian (details) dari sebuah class belum 
diketahui dengan jelas, maka umumnya dibentuk 
lebih dahulu abstract class, untuk kemudian akan 
dikembangkan menjadi concrete class. 
 
Sebagai contoh adalah class Human (manusia). 
Class ini adalah abstract, karena untuk lebih rinci 
lagi, maka akan dibentuk class Pegawai, yang 
merupakan pengembangan dari class Human. 
 
public abstract class Human { 
 
 
 
public class Pegawai extends Human { 
 
 
 
Sebuah abstract class harus dikembangkan dan dari 
abstract class tidak dapat dibuat Instance class. 
 
Human h = new Human(); // error 
 
Abstract class tidak mempunyai implementasi, 
melainkan hanya header berupa metoda (disebut 
juga sebagai signature ). 
 
 
 
Class & Interface 
1-2 
Metoda abstract 
Selain class, metoda juga dapat dibuat abstract, 
artinya bagi class yang mengembangkan abstract 
class tersebut harus mengimplementasikan metoda 
abstract tersebut. 
 
Berikut adalah abstract class Kendaraan, yang 
mana class ini mensyaratkan bahwa class yang 
mengembangkannya harus mengimplementasi 
metoda go() dan stop(). 
 
public abstract class Kendaraan { 
 
   public abstract void go(); 
   public abstract void stop(); 
 
 
Metoda yang tidak mempunyai body (implementasi), 
harus dideklarasikan abstract. 
 
public class Mobil extends Kendaraan { 
     
    /** Creates a new instance of Mobil */ 
    public Mobil() { 
    } 
 
    public void go() { 
        System.out.println("Go ..."); 
    } 
    public void stop() { 
        System.out.println("Stop ..."); 
    } 
    public static void main(String[] args) { 
        Mobil m= new Mobil(); 
        m.go(); 
        m.stop(); 
    } 
 
 
Bila mendeklarasikan metoda sebagai abstract, 
maka class dimana metoda tersebut berada, harus 
juga abstract class. 
Class & Interface 
1-3 
Class abstract dapat mempunyai atribut dan metoda 
non abstract. 
 
public abstract class Kendaraan { 
    private boolean status; 
    public final void setState(boolean status) { 
        this.status= status; 
    } 
    public final boolean getState() { 
        return status; 
    } 
    public abstract void go(); 
    public abstract void stop(); 
     
Variable dideklarasikan sebagai private agar hanya 
dapat diakses melalui metoda, dan metoda 
setState() dan geState() adalah final, artinya 
metoda tersebut tidak dapat diubah (overriding) 
oleh class yang mengembangkannya. 
 
 
 
 
 
 
 
 
 
 
Class & Interface 
1-4 
Interface 
 
Interface adalah seperti juga abstract class, definisi class 
disini tidak mempunyai implementasi (code), melainkan 
hanya nama-nama metoda saja, tanpa body. 
 
Metoda ini akan diimplementasikan pada real class. 
 
Perbedaan yang mendasar antara abstract class dengan 
interface adalah: 
 
abstract class dikembangkan menjadi concrete class, 
interface diimplementasikan oleh class baru. 
 
Sebuah class hanya dapat mengembangkan 1 abstract 
class, namun dapat mengimplementasikan 1 atau lebih 
interface. 
 
Deklarasi interface: 
 
public interface  NamaInterface { 
 
     public void metoda1() ; 
 
     public void metoda2() ; 
 
Implementasi kemudian dilakukan pada class 
lainnya: 
 
public class MyClass implements NamaInterface { 
   public void metoda1 () { 
      ... 
   } 
 
   public void metoda2 () { 
      ... 
   } 
 
 
 
Class & Interface 
1-5 
Berikut dibuat dua buah interface: 
 
// File: Ampibi.java 
public interface Ampibi { 
    public void swim(); 
 
 
// File: Terbang.java 
public interface Terbang { 
     public void fly(); 
 
Aplikasikan kedua interface tersebut pada Mobil, 
yang mana mobil ini bisa terbang dan juga bisa 
berjalan di air. 
 
public class Mobil extends Kendaraan implements  
                                    Ampibi,Terbang { 
     
    public void go() { 
        System.out.println("Go ..."); 
    } 
    public void stop() { 
        System.out.println("Stop ..."); 
    } 
    public void swim() { 
        System.out.println("Yes, I can swim"); 
    } 
    public void fly() { 
        System.out.println("Yes, I can fly"); 
    } 
 
    public static void main(String[] args) { 
        Mobil m= new Mobil(); 
        m.setState(true); 
        m.go(); 
        m.stop(); 
        if (m.getState()) { 
            System.out.println("Status= True"); 
        } 
        else { 
            System.out.println("Status= False"); 
        } 
        m.fly(); 
        m.swim(); 
    } 
  
Inner Class 
Java 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Inner Class 
2-1 
Bentuk Inner Class  
 
Inner class adalah class yang didefinisikan didalam 
class yang sudah ada. 
 
class MyClass { 
 
 
Inner class ditulis didalam {  } dari class MyClass: 
 
class MyClass { 
 
   class MyInnerClass { 
 
      void display() { 
          System.out.println("Inner Class"); 
       } 
   } 
 
 
MyInnerClass dapat mengakses variable dari outer 
class (MyClass), namun tidak sebaliknya, 
 
class MyClass { 
   private double dana; 
   class MyInnerClass { 
 
      void display() { 
        dana= 1000000.0;  
        System.out.println("Inner Class" + dana); 
      } 
   } 
 
 
Bagaimana membuat Instance dari Inner class? 
 
 
Inner Class 
2-2 
Inner class dapat digunakan dengan menciptakan 
Instance dari Inner class tersebut: 
 
public class MyClass { 
   private double dana;    
   MyInnerClass mic = new MyInnerClass(); 
 
 
   public void displaySomething() { 
        mic.display(); 
   } 
 
   class MyInnerClass { 
 
      void display() { 
        dana= 1000000.0;  
        System.out.println("Inner Class " + dana); 
      } 
   } 
     
 
Hasil kompilasi dari MyClass akan membuahkan 
dua buah class: 
 
MyClass$MyInnerClass.class 
MyClass.class 
 
Perhatikan bahwa nama inner class ditambahkan 
dengan MyClass dan disambung dengan karakter $. 
 
TestMyClass dengan program berikut: 
 
public class TestMyClass { 
     
    public static void main(String[] args) { 
        new MyClass().displaySomething(); 
    } 
 
 
 
 
 
 
Inner Class 
2-3 
Inner class umumnya hanya digunakan bagi class 
yang mendefinisikan inner class tersebut. 
 
Walau demikia n, membuat Instance dari inner class 
dapat dilakukan juga dari luar. 
 
public class TestMyClass { 
     
    public static void main(String[] args) { 
        MyClass mc = new MyClass(); 
        MyClass.MyInnerClass myobj =  
                        mc.new MyInnerClass(); 
        myobj.display(); 
    } 
 
Teknik seperti ini, walaupun bisa, namun umumnya 
jarang digunakan. 
 
Kegunaan dari inner class akan menjadi jelas pada 
sesi berikutnya. 
 
 
Inner Class 
2-4 
Static Inner Class  
 
Bila Inner Class menjadi static, maka program main 
tidak perlu menciptakan obyek khusus untuk 
mengakses Inner Class tersebut. 
 
public class MySClass { 
 
   static class MyInnerSClass { 
 
      void display() { 
        System.out.println("From Static Inner Class); 
      } 
   } 
     
 
Program TestMySClass tidak perlu menggunakan 
object MySClass untuk mengakses static Inner 
Class. 
 
public class TestMySClass { 
     
    public static void main(String[] args) { 
 
        MySClass.MyInnerSClass myobj =  
                new MySClass.MyInnerSClass() ; 
        myobj.display(); 
    } 
 
Perhatikan pada program bahwa tidak ada lagi 
kreasi object  dari MySClass (new MySClass()) 
 
 
Inner Class 
2-5 
Anonymous Class  
 
Anonymous Class adalah Inner Class yang 
langsung diaplikasikan dalam Class tanpa harus 
mendefinisikan inner class tersebut. 
 
Untuk mendemonstrasikan anonymous class, buat 
sebuah class yang mengembangkan Window 
Adapter dan mengimplementasikan metoda 
windowClosing(). 
 
import java.awt.event.*; 
class WAdapter extends WindowAdapter { 
   public void windowClosing(WindowEvent ev) {  
         System.out.println("Bye, see you ..."); 
         System.exit(0);  
   } 
Selanjutnya buat Class WListener yang 
menggunakan class WAdapter tersebut.  
 
 
import javax.swing.*; 
import java.awt.*; 
 
public class WListene r extends JFrame {  
 
   public WListener (String s) 
   { 
      super(s); 
      JLabel teks= new JLabel( "Window - Listener");  
      WAdapter wa = new WAdapter(); 
      addWindowListener( wa); 
 
      getContentPane().add(BorderLayout.CENTER,teks) ;  
      setBounds(30,30,3 00,20 0 ); 
      setVisible(true);  
   } 
}  
 
 
 
 
 
Inner Class 
2-6  
Buat Class yang menjalankan WListener:  
 
public class TestWListener {  
    public static void main(String[] args) { 
        new WListener("Test Anonymous Class");  
    } 
     
 
Karena Class WAdapter  hanya dibutuhkan satu kali 
saja , ada baiknya jika WAdapter dibuat sebagai 
Inner Class. 
 
      WAdapter wa = new WAdapter(); 
      addWindowListener( wa ); 
 
Penulisan dapat diganti tanpa deklarasi obyek  wa 
sebagai berikut: 
 
      addWindowListener( new WAdapter() ); 
 
Dan class WAdapter adalah: 
 
class WAdapter extends WindowAdapter {  
   public void windowClosing(WindowEvent ev) {  
         System.out.println("Bye, see you ..."); 
         System.exit(0);  
   } 
 
class WAdapter ini kemudian dipindahkan p ada saat 
obyek diciptakan langsung dengan new 
WindowAdapter(). 
 
      addWindowListener ( new WindowAdapter()  
 
           { 
             // penulisan class WAdapter dipindahkan 
             // ke blok ini 
 
           } 
 
      ); 
Inner Class 
2-7  
Program menjadi berikut: 
 
      addWindowListener( new WindowAdapter()  
 
        { 
           public void windowClosing(WindowEvent ev) { 
             System.out.println("Bye, see you ..."); 
             System.exit(0); 
           } 
        } 
 
      ); 
 
 
Program Lengkap:  
 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
public class WListener extends JFrame{  
     
    public WListener(String s) {  
      super(s); 
      JLabel teks= new JLabel("Window - Listener");  
       
      addWindowListener( new WindowAdapter() { 
         public void  windowClosing(WindowEvent  ev) { 
              System.out.println("Bye, see you ..."); 
              System.exit(0);  
            } 
         }         
      ); 
 
      getContentPane().add(BorderLayout.CENTER,teks) ;  
      setBounds(30,30,300,200);  
      setVisible(true);  
    } 
     
 
Anonymous Class ditandai dengan $1 pada nama 
class yang telah dikompilasi. 
 
WListener$1.class  
WListener.class  
 
Inner Class 
2-8  
Lab : Variable Inner Class  
 
Buat program dibawah ini dan periksa hasilnya: 
 
public class MyClass {    
   String s="String dari MyClass"; 
   MyInnerClass mic = new MyInnerClass(); 
 
    /** Creates a new instance of MyClass */ 
    public MyClass() { 
    } 
    public void displaySomething() { 
        mic.display("String dari parameter"); 
    } 
 
   class MyInnerClass { 
      String s="String dari MyInnerClass"; 
      void display(String s) { 
        System.out.println(s); 
        System.out.println(this.s); 
        System.out.println(MyClass.s); 
        System.out.println(MyClass.this.s); 
      } 
   } 
 
Bila ada error, maka hapus baris dengan error 
tersebut dan jelaskan kenapa terjadi error. 
 
public class TestMyClass { 
     
    public static void main(String[] args) { 
        MyClass mc = new MyClass(); 
        mc.displaySomething(); 
        System.out.println("----------------------- "); 
        MyClass.MyInnerClass myobj =  
                               mc.new MyInnerClass(); 
        myobj.display("String dari main"); 
    } 
 
  
 
  
GUI Event 
Java 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
GUI Event  
3-1 
Event Listeners  
 
Jika sebuah CLASS ingin bereaksi atas aksi yang 
dilakukan oleh pemakai (user) melalui keyboard, 
mouse atau lainnya, maka Java menjawab dengan 
sistem yang disebut sebagai Event Handling. 
 
Class tersebut harus mengimplementasikan 
interface yang diasosiakan dengan event tersebut.  
 
Program atau interface ini disebut sebagai Event 
Listeners, antara lain:  
 
ActionListener 
Bereaksi atas perubahan komponen, seperti klik 
mouse atau tombol. 
 
AdjustmentListener 
Berekasi atas perubahan komponen untuk 
penyesuaian, misalnya scrollbar yang digerakkan 
 
FocusListener 
Event yang disebabkan oleh focus pada field, 
misalnya kursor berada pada field tersebut. 
 
ItemListener 
Beraksi pada perubahan checkbox, radiobutton dan 
lainnya 
 
KeyListener 
Bereaksi atas keyboard, misalnya penekanan 
tombol ALT, Ctrl dan lainnya.  
 
WindowsListener 
Beraksi atas perubahan pada window, misalnya 
diperbesar, diperkecil, digeser atau ditutup. 
 
GUI Event  
3-2 
MouseListener 
Bereaksi atas klik dari mouse 
 
MouseMotionListener 
Bereaksi atas pergerakan mouse, misalnya bila 
melewati area komponen tertentu 
 
Listeners terdaftar pada java.awt.event.* yang 
harus disertakan pada class yang menggunakan-
nya. 
 
Setelah komponen dideklarasikan, maka listener 
dapat ditambahkan pada komponen tersebut, 
misalnya pada Button: 
 
JButton b1 = new JButton("Tombol"); 
 
b1.addActionListener(...) 
 
Perhatikan bahwa Listener ini harus ditambahkan 
lebih dahulu ke komponen, sebelum komponen 
tersebut diletakkan pada Frame/ Content Pane.  
 
 
GUI Event  
3-3 
 Interface Event Handling  
 
Cara  mengendalikan Eve nt antara lain dengan 
menggunakan interface, yang mana program listener harus 
mengimplementasikan satu metoda yang disebut 
actionPerformed(). 
 
public class MyClass implements ActionListener { 
 
   public void actionPerformed (ActionEvent evt) { 
      ... 
      ... 
   } 
Variable ActionEvent evt dapat menunjukkan identitas dari 
mana Event tersebut berasal. Berdasarkan hasil tersebut, 
maka program dapat memberikan reaksi yang diinginkan. 
 
public void actionPerformed (ActionEvent ev) { 
 
   Object obyek_asal = ev.getSource(); 
 
   if (obyek_asal instanceof JButton) 
 //Berasal dari Tombol 
     ; 
   else if (obyek_asal instanceof JTextField) 
     //Berasal dari Textfield 
     ; 
   ... 
Atau bila JButton adalah b1 dan JTextField adalah tf1, 
maka program tersebut dapat diubah menjadi: 
 
private static JButton b1= new JButton("Pilih"); 
private static JTextField tf= new JTextField(30); 
 
public void actionPerformed (ActionEvent ev) { 
 
   Object var_id = ev.getSource(); 
 
   if (var_id == b1) 
 //Berasal dari Tombol 
     ; 
   else if (var_id == tf1 ) 
     //Berasal dari Textfield 
     ; 
   ... 
GUI Event  
3-4 
EventHandling Adapter  
 
Implementasi WindowListener pada contoh sebelumnya 
mengharuskan perogramer untuk menulis semua interface 
(metoda) yang ada pada abstract class tersebut. 
 
Untuk  menghindari implementasi semua metoda, class 
java.awt.event.WindowAdapter dapat digunakan, yang 
mana class ini mendefinisikan semua metoda dengan blok 
yang kosong (empty block). 
 
Dengan demikian programer dapat memilih metoda yang 
mana saja yang akan ditulis (override) untuk EventHandling 
tersebut. 
 
/* Author: Inixindo */ 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
 
public class WListener2 extends JFrame { 
 
   public WListener2(String s) 
   { 
      super(s); 
      JLabel teks= new JLabel("Window-Listener"); 
 
      Container c= this.getContentPane(); 
      c.setLayout(new BorderLayout()); 
      c.add(teks,"Center"); 
   } 
   public static void main (String[] args) { 
      WListener2 app= new WListener2("Test App"); 
      WAdapter wa = new WAdapter(); 
      app.addWindowListener( wa); 
      app.pack(); 
      app.setVisible(true); 
   } 
}  
class WAdapter extends WindowAdapter { 
   public void windowClosing(WindowEvent ev) { 
         System.out.println("Bye"); 
         System.exit(0); 
   } 
   public void windowActivated(WindowEvent ev) { 
        System.out.println("Activated"); 
   } 
GUI Event  
3-5 
Class WListener hanya mengimplementasikan 2 
metoda, yaitu windowClosing() dan 
windowActivated(). 
 
Dengan demikian Adapter menawarkan 
penyederhanaan dari implementasi Listener, 
sehingga programmer tidak perlu mengimplemen-
tasikan semua interface yang ada pada Listener.  
 
   public static void main (String[] args) { 
      WListener2 app= new WListener2("Test App"); 
      WAdapter wa = new WAdapter(); 
      app.addWindowListener( wa); 
      app.pack(); 
      app.setVisible(true); 
   } 
 
 
GUI Event  
3-6  
Pergerakan Komponen  
 
Window dapat digerakkan/ berpindah lokasi, ukuran 
(size) diperkecil atau diperbesar. 
 
Perubahan ini ditangkap oleh class 
java.awt.event.ComponentEvent.  
 
component Shown  
Diaktifkan pada saat komponen pertama kali muncul 
(visible) di layar dan tergantung pada metoda 
setVisible(true) atau setVisible(false). 
 
componentHidden  
Dilakukan setelah pelaksanaan metoda 
setVisble(false) 
 
componentMoved  
Diaktifkan jika komponen bergerak/ berpindah lokasi 
misalnya melalui metoda setLocation(), 
setBounds() atau diubah oleh LayoutManager.  
 
componentResized  
Diaktifkan jika ukuran komponen berubah, seperti 
juga componentMoved.  
 
 
 
GUI Event  
3-7  
/* Author: Inixindo */ 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
 
public class CListener extends JFrame implements  
       ComponentListener  
    
   public CListener () 
   { 
    
      JLabel teks= new JLabel("Component-Listener"); 
      getContentPane().add(teks,"Center"); 
      addComponentListener (this); 
      setVisible(true); 
   } 
 
   public void componentMoved(ComponentEvent ev) { 
      System.out.println("Digerakkan..."); 
   } 
   public void componentResized(ComponentEvent ev) { 
      System.out.println("Ukuran diubah ..."); 
   } 
   public void componentShown(ComponentEvent ev) { 
      System.out.println("Tampil ..."); 
   } 
   public void componentHidden(ComponentEvent ev) { 
      System.out.println("Hidden ..."); 
   } 
 
   public static void main (String[] args) { 
      new CListener(); 
   } 
 
Hasil dari Console Output: 
 
Tampil ... 
Digerakkan... 
Digerakkan... 
Ukuran diubah ... 
Ukuran diubah ... 
Digerakkan... 
 
 
GUI Event  
3-8  
Lab 3 : Component Adapter  
 
Buat program CListener2.java dari CListener, 
gunakan ComponentAdapter sebagai class. 
 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
 
public class CListener2 extends JFrame  { 
    
   public CListener2 () 
   { 
       initComponents(); 
   } 
   private void initComponents() 
   { 
      JLabel teks= new JLabel("Component-Listener"); 
      getContentPane().add(teks,"Center"); 
 
      addComponentListener ( . . . ); 
 
  setTitle("Component Adapter"); 
      setVisible(true); 
   } 
   public static void main (String[] args) { 
      new CListener2(); 
   } 
 
class CAdapter extends ComponentAdapter 
 
   //program ComponentAdapter 
 
 
 
 
 
 
 
GUI Event  
3-9  
Focus  
 
Sebuah komponen mendapat focus, artinya aktifitas 
diarahkan pada komponen tersebut, misalnya menunggu 
data entry pada textfield, atau menunggu pada tombol 
untuk dipilih dengan Enter (dari keyboard).  
 
Program berikut menampilkan Label, TextField dan Button:  
 
 
 
JLabel teks= new JLabel("Action-Listener"); 
JTextField tf= new JTextField(25); 
JButton tombol= new JButton("Bersihkan !"); 
 
Bila data dimasukkan pada TextField dan Enter ditekan, 
maka teks tersebut akan disalin sebagai Titel Window.  
 
Program ini dimasukkan dalam ActionListener dengan 
mengimplementasikan metoda actionPerformed() . 
 
public void actionPerformed (ActionEvent ev) { 
 
      if (ev.getSource() == tombol) { 
          tf.setText(""); 
      } else { 
          this.setTitle ( tf.getText() ); 
      } 
 
Event ini kemudian didaftarkan pada komponen 
terkait saja, yaitu textfield dan tombol.  
 
//registrasi event untuk komponen spesifik 
tombol.addActionListener (this); 
tf.addActionListener (this); 
 
Pada saat program dijalankan, focus tidak terarah 
pada textfield dan pemakai harus menggunakan 
mouse untuk menunjuk pada textfield tersebut, 
kemudian baru memasukkan data. 
GUI Event  
3-10  
Untuk mengarahkan focus langsung kepada 
komponen, maka metoda requestFocus() dapat 
digunakan. 
 
public void actionPerformed (ActionEvent ev) { 
 
      if (ev.getSource() == tombol) { 
          tf.setText(""); 
          tf.requestFocus(); 
      } else { 
         this.setTitle ( tf.getText() ); 
      } 
 
Perhatikan bahwa setiap kali tombol ditekan, maka 
focus akan berpindah pada awal textfield tersebut.  
 
//Author: Inixindo 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
class FListener extends JFrame implements ActionListener 
   JLabel teks= new JLabel("Action-Listener"); 
   JTextField tf= new JTextField(25); 
   JButton tombol= new JButton("Bersihkan !"); 
 
   public FListener () 
   { 
       initComponents(); 
   } 
 
   private void initComponents() 
   { 
      getContentPane().setLayout(new FlowLayout()); 
      getContentPane().add(teks); 
      getContentPane().add(tf); 
      getContentPane().add(tombol); 
 
      setTitle("Component Adapter"); 
      setSize(200,300); 
      pack(); 
      setVisible(true); 
 
      tombol.addActionListener (this); 
      tf.addActionListener(this); 
   } 
 
GUI Event  
3-11 
 
   public void actionPerformed (ActionEvent ev) { 
 
      if (ev.getSource() == tombol) { 
          tf.setText(""); 
      } else { 
          this.setTitle ( tf.getText() ); 
      } 
   } 
 
 
   public static void main (String[] args) { 
      new FListener(); 
   } 
 
Lab 4 : Pergerakan Component  
 
Modifikasi program CListener.java 
(ComponentListener) dengan menambahkan 
program sebagai berikut: 
 
public static void main (String[] args) { 
      CListener layar= new CListener() ; 
 
      try { 
         Thread.sleep(2000); 
         layar.setVisible(false); 
 
         Thread.sleep(2000); 
         layar.setSize(100,200); 
         layar.setVisible(true); 
 
         Thread.sleep(2000); 
         layar.setLocation(50,50); 
 
         Thread.sleep(2000); 
         layar.setSize(400,300); 
 
         Thread.sleep(2000); 
         layar.pack(); 
      } catch (Exception e) { 
    //empty 
      } 
 
 
GUI Event  
3-12 
Lab 5 : Focus  
 
Buat sebuah Frame sebagai berikut:  
 
Jika tombol 1 ditekan, maka focus akan ke textfield 
pertama, tombol 2 ke textfield ked ua dan seterusnya. 
 
Setiap teks yang ditulis di textfield akan disalin menjadi titel 
di frame. 
 
 
Lab 6 : MouseListener sebagai Panel  
 
Graphic untuk menggambar dilakukan tidak pada 
Frame, melainkan pada Panel. Buat Class Mouse2 
yang mengembangkan class JPane l. Pada program 
main, ciptakan obyek JFrame dan tempatkan Panel 
pada Frame tersebut.  
 
public class LayarMouse extends JPanel { 
    private Point posisi; 
    /** Creates a new instance of LayarMouse */ 
    public LayarMouse () { 
        addMouseListener ( new MListener() ); 
        addMouseMotionListener ( new MotionListener() ); 
        setBackground(Color.BLACK); 
    } 
     
    private class MListener implements MouseListener 
    { 
       ... 
    } 
 
     
GUI Event  
3-13 
    public static void main(String[] args) { 
 
        JFrame f = new JFrame();         
        LayarMouse m= new LayarMouse(); 
        m.setBounds(0,0,300,300); 
 
        f.getContentPane().setLayout(null); 
        f.getContentPane().add(m); 
        f.setLocation(200,200); 
        f.setSize(300,300); 
        f.setTitle("Painter"); 
        f.setVisible(true); 
        f.addWindowListener(new WindowAdapter() { 
            public void windowClosing(WindowEvent ev) { 
                System.out.println("exiting ..."); 
                System.exit(0); 
            } 
        } ); 
    } 
    
 
 
 
  
LAYOUT MANAGER 
Java 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Layout  
4-1 
Frame  
 
JFrame secara default mempunyai 5 area, dimana 
component dapat diletakkan pada area yang disebut 
sebagai mata angin, NORTH, WEST, CENTE R, 
EAST dan SOUTH.  
 
NORT H
SOUT H
WEST CENT ER
EAST
 
 
 
Layout ini disebut sebagai BorderLayout dan 
digunakan pada saat component ditambahkan di 
Container (ContentPane). 
 
JFrame layar= new JFrame(); 
Container c = layar.getContentPane(); 
 
JButton tombol1= new JButton("tombol 1"); 
JButton tombol2= new JButton("tombol 2"); 
 
c.add(BorderLayout.NORTH, tombol1);  
c.add(BorderLayout.SOUTH, tombol2); 
layar.setSize(200,250); 
layar.setVisible(true); 
 
Layout  
4-2 
BorderLayout  
 
 
import javax.swing.*; 
import java.awt.*; 
 
public class TestBorderLayout { 
 
   public static void main(String argv[]) 
   { 
      JFrame layar = new JFrame("Border Layout"); 
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
      JButton b2 = new JButton("Cancel"); 
 
      Container c = layar.getContentPane(); 
 
      // tidak perlu, karena DEFAULT pada Frame 
      //c.setLayout( new BorderLayout()); 
 
      c.add(BorderLayout.NORTH, l1); 
      c.add(BorderLayout.WEST, tf1); 
      c.add(BorderLayout.CENTER, l2); 
      c.add(BorderLayout.EAST, psw); 
      c.add(BorderLayout.SOUTH, b1); 
 
      layar.setSize(380,150);  
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
   } 
 
 
 
 
Layout  
4-3 
Flow Layout  
 
FlowLa yout, yaitu menyusun komponen dari kiri ke 
kanan dan atas ke bawah. Bila ruang pada bagian 
kanan tidak terdapat tempat lagi, maka komponen 
diletakkan pada baris bawah berikunya dan dimulai 
kembali dari bagian paling kiri. 
 
        
 
        
 
 
F lowLayout mempunya properti, yaitu penyesuaian 
(alignment ) kekiri, ditengah atau kekanan. (Default 
adalah ditengah). 
 
FlowLayout.LEFT :  
menyusun kearah kiri 
 
FlowLayout.CENTER:  
menyusun ditengah 
 
FlowLayout.RIGHT:  
menyusun kearah kanan. 
 
Contoh: 
 
import javax.swing.*; 
import java.awt.*; 
 
public class TestFlowLayout { 
 
   public static void main(String argv[]) 
   { 
      JFrame layar = new JFrame("Flow Layout"); 
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
Layout  
4-4 
      JButton b2 = new JButton("Cancel"); 
 
      Container c = layar.getContentPane(); 
      c.setLayout( new FlowLayout()); 
 
      c.add(l1); 
      c.add(tf1); 
      c.add(l2); 
      c.add(psw); 
      c.add(b1); 
      c.add(b2); 
 
      layar.setSize(380,10 0); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
   } 
 
 
Hasil: 
 
 
 
 
Default dari FlowLayout()  adalah CENTER , 
sehingga terlihat penyusunan baris kedua berada 
tepat ditengah. 
 
Layout  
4-5 
Pengubahan dengan FlowLayout.RIGHT : 
 
Container c = layar.getContentPane(); 
c.setLayout( new FlowLayout(FlowLayout.RIGHT)); 
 
 
 
 
 
 
hga p & vgap  
 
FlowLayout dapat diinisialisasi dengan 
menambahkan parameter hgap (horizontal gap) dan 
vgap (vertical gap) yaitu pembatas berupa jumlah 
piksel antara satu komponen dengan lainnya. 
 
FlowLayout (int alignment, int hgap, int vgap ) 
 
Contoh berikut menggunakan hgap=40 vgap=8. 
 
 
 
 
Container c = layar.getContentPane(); 
 
c.setLayout( new FlowLayout(FlowLayout.RIGHT,40,8)); 
 
 
 
Layout  
4-6  
Hasil: 
 
 
 
Perhatikan bahwa komponen berusaha untuk 
mengisi seluruh layar (panel) yang ada. Komponen 
tersebut melakukan penyesuaian secara otomatis. 
 
Jarak Antara (Gap)  
 
Kadangkala diperlukan jarak antara komponen satu 
dengan lainnya, agar komponen tersebut tidak 
berdempetan, maka diciptakan jarak antara (gap) 
yang terdiri atas gap horisontal  dan gap vertikal . 
 
Dalam konstruktor Bo rderLayout  dan FlowLayout 
dapat diberikan gap tersebut sebagai berikut: 
 
BorderLayout(int hgap, int vgap); 
 
Default penempatan komponen pada BorderLayout  
adalah CENTER . 
 
      Container c = layar.getContentPane(); 
      c.setLayout( new BorderLayout(10,15)); 
 
      c.add(BorderLayout.NORTH, l1);  
      c.add(BorderLayout.WEST, tf1); 
      c.add(BorderLayout.CENTER, l2);  
      c.add(BorderLayout.EAST, psw); 
      c.add(BorderLayout.SOUTH, b1); 
 
 
Layout  
4-7  
GridLayout  
 
Layout Grid  menempatkan komponen pada matriks 
2 dimensi dengan baris dan kolom. 
 
GridLayout(int baris, int kolom);  
GridLayout(int baris, int kolom, int hgap, int vgap);  
 
Contoh: 
 
import javax.swing.*; 
import java.awt.*; 
 
public class TestGridLayout  { 
 
   public static void main(String argv[]) 
   { 
      JFrame layar = new JFrame("Grid Layout");  
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
      JButton b2 = new JButton("Cancel"); 
 
      Container c = layar.getContentPane(); 
      c.setLayout( new GridLayout(1,2)); 
 
      c.add(l1); 
      c.add(tf1); 
      c.add(l2); 
      c.add(psw); 
      c.add(b1); 
      c.add(b2); 
 
      layar.setSize(380,150);  
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
   } 
 
 
 
Layout  
4-8  
Hasil: 
 
 
Perhatikan bahwa GridLayout  diciptakan sebanyak 
1 baris dan 2 kolom. Karena ruang kolomg tidak 
mencukupi, maka tempat diteruskan kebagian 
kanan. Perhatikan juga bahwa pembagian CELL 
adalah sama besar. 
 
Buat berikut dengan 2 baris dan 3 kolom. 
 
 
Hasil: 
 
 
 
Catatan: 
hgap  dan vgap  dapat disertakan pada konstruktor 
sebagai berikut: 
 
GridLayout (int rows, int co ls, int hgap,  
         int vgap) 
 
Layout  
4-9  
JPanel  
 
JPanel  adalah komponen container , artinya 
komponen ini dapat mengakomodasikan komponen-
komponen AWT (Abstract Windowing Tools) 
lainnya. 
 
Setiap JPanel dapat mempunyai Layout sendiri  dan 
dapat mengendalikan Event  maupun Action untuk 
JPanel tersebut. Sehingga bila aplikasi terdiri atas 
banyak komponen, maka jalan terbaik untuk 
menampilkan komponen-komponen tersebut adalah 
dengan membaginya dalam beberapa Panel. 
 
JApplet   adalah subclass dari JPanel dengan 
kemampuan tambahan, bahwa Applet didisain untuk 
dapat berjalan pada Web -Browser. 
 
 
Component     Container    JComponent  
    JPanel    JApplet  
 
 
Konstruktor: 
 
JPanel(); 
 
Contoh: 
 
JPanel p1= new  JPanel(); 
JPanel p2= new  JPanel(); 
 
Secara default JPanel mewari si FlowLayout 
sebagai Layout Manager.  
 
 
Layout  
4-10  
Contoh: 2 buah Panel 
 
import javax.swing.*; 
import java.awt.*; 
 
public class MyPanel { 
 
   public static void main(String argv[]) 
   { 
      JFrame layar = new JFrame("Panel"); 
 
      JPanel panel1= new JPanel(); 
      JPanel panel2= new JPanel(); 
 
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
      JButton b2 = new JButton("Cancel"); 
 
      panel1.setLayout(new FlowLayout()); 
      panel2.setLayout(new GridLayout(2,2)); 
 
      panel1.add(l1); 
      panel1.add(tf1); 
       
      panel2.add(l2); 
      panel2.add(psw); 
      panel2.add(b1); 
      panel2.add(b2); 
 
      Container c= layar.getContentPane(); 
      c.setLayout(new FlowLayout() ); 
      c.add(panel1); 
      c.add(panel2); 
      layar.setSize(380,150);  
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
   } 
 
Layout  
4-11 
Hasil: 
 
 
 
    Panel 1                         Panel2 
 
Setiap Panel dapat mempunyai Layout sendiri, 
maka program dapat diubah  agar Panel p1  
menggunakan FlowLayout dan Panel 2 
menggunakan GridLayout. 
 
      panel1.setLayout(new FlowLayout()); 
      panel2.setLayout(new GridLayout(2,2)); 
 
J Frame sendiri belum mempunyai layout manager, 
oleh karena itu disampaikan dengan FlowLayout().  
 
Container c= layar.getContentPane(); 
 
c.setLayout(new FlowLayout() ); 
 
 
 
 
 
 
 
 
 
Layout  
4-12 
Gr idBagLayout  
 
Adalah Layout yang paling fleksibel di AWT dengan 
memberikan kendali penuh atas isi container dan susunan 
komponen didalamnya. 
 
GridBagLayout  mirip dengan GridLayout  dengan 
perbedaan sebagai berikut: 
 
Baris dan kolom pada GridBagLayout dapat berbeda 
ukuran. Komponen dapat menduduki satu area dengan 
ukuran bebas (tidak satu cell seperti pada GridLayout).  
 
import javax.swing.*; 
import java.awt.*; 
 
public class TestGridBagLayout  { 
 
   public static void main(String argv[]) 
   { 
      JFrame layar = new JFrame("GridBag Layout");  
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
      JButton b2 = new JButton("Cancel"); 
 
      Container c = layar.getContentPane(); 
      c.setLayout( new GridBagLayout()); 
 
      c.add(l1); 
      c.add(tf1); 
      c.add(l2); 
      c.add(psw); 
      c.add(b1); 
      c.add(b2); 
 
      layar.pack(); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
   } 
 
 
Layout  
4-13 
Hasil: 
 
 
Instruksi pack() digunakan untuk membuat layar 
(Panel) menjadi kompak, sesuai dengan ukuran 
komponen yang ada didalamnya. 
 
Setiap komponen yang dimasukan kedalam 
container, dapat mempunyai parameter untuk 
memberikan ukuran yang diinginkan. Paramater ini 
dinyatakan dalam GridBagConstraints . 
 
Beberapa properti dari GridBagContraints:  
 
gridheight  
Tinggi dari grid dalam piksel  
 
gr idwidth  
Lebar dari grid dalam piksel  
 
gridx, gridy  
Koordinat x dan y, sebagai posisi komponen  
 
Deklarasi dibuat sebagai berikut: 
 
GridBagConstraints gbc = new GridBagConstraints(); 
Container c = layar.getContentPane(); 
       
      c.setLayout( new GridBagLayout()); 
 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.gridheight = 1; 
      gbc.gridwidth = 2; 
      c.add(l1, gbc); 
 
Parameter constraint 
Layout  
4-14 
Contoh: 
 
import javax.swing.*; 
import java.awt.*; 
 
public class TestGridBagConstraint  { 
 
   public static void main(String argv[]) 
   { 
      JFrame layar = new JFrame("GridBag Layout");  
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
      JButton b2 = new JButton("Cancel"); 
 
      GridBagConstraints gbc = new GridBagConstraints(); 
      Container c = layar.getContentPane(); 
      c.setLayout( new GridBagLayout());  
 
      gbc.gridx = 0; 
      gbc.gridy = 0; 
      gbc.gridheight = 1; 
      gbc.gridwidth = 2; 
      c.add(l1, gbc); 
 
      gbc.gridy++; 
      c.add(tf1, gbc); 
 
      gbc.gridy++; 
      c.add(l2, gbc); 
 
      gbc.gridy++; 
      c.add(psw,gbc); 
 
      gbc.gridy++; 
      c.add(b1, gbc); 
 
      gbc.gridy++; 
      c.add(b2,gbc); 
 
      layar.pack(); 
      layar.setVisible(true); 
   } 
 
Layout  
4-15 
CardLayout  
 
CardLayout menampilkan window dalam bentuk 
Panel. CardLayout dapat terdiri atas satu atau 
beberapa Panel. Perpindahan dari satu Panel ke 
Panel lainnya dapat dilakukan dengan metoda 
first(), last(), next() dan previous(). 
 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
 
public class CardLayout1 { 
 
   public CardLayout1() { 
 
      JFrame layar= new JFrame ("CARD Layout"); 
      JLabel l1= new JLabel ("User Name : ");  
      JTextField tf1 = new JTextField(5) ; 
      JLabel l2= new JLabel ("Password : "); 
      JPasswordField psw= new JPasswordField(5); 
      JButton b1 = new JButton("OK");  
      JButton b2 = new JButton("Cancel"); 
 
      Container c= layar.getContentPane(); 
      CardLayout card = new CardLayout(); 
      c.setLayout(card); 
 
      c.add(l1, "First"); 
      c.add(tf1, "Second"); 
      c.add(l2, "Third"); 
      c.add(psw, "Fourth"); 
      c.add(b1, "Fifth"); 
      c.add(b2,"Sixth");     
 
      layar.setSize(300,100); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLO SE); 
 
 
      for ( ; ; ) { 
         try { 
            Thread.sleep (2000); 
            double acak = Math.random(); 
            if (acak < 0.2)  
               card.last(c); 
            else if (acak < 0.4)  
Layout  
4-16  
               card.previous (c); 
            else if (acak < 0.6)  
               card.next(c); 
            else card.first(c); 
         } 
         catch (Exception e) { 
         } 
      } 
   } 
   public static void main(String argv[]) 
   { 
      CardLayout1 app= new CardLayout1(); 
   } 
 
 
Metoda: 
 
first(Container c)  
 menampilkan Card pertama 
 
next(Container c) 
 menampilkan Card berikutnya 
 
previous(Container c) 
 menampilkan Card sebelumnya 
 
last(Container c) 
 menampilkan Card terakhir 
 
show(Container c, String nama) 
menampilkan Card yang diberi  nama " first", 
"second" dan seterusnya.  
 
 
Layout  
4-17  
Layout Null  
 
Menampilkan komponen dapat dilakukan tanpa 
menggunakan Layout Manager yang ada. Dengan 
arti kata lain, yaitu menggunakan koordinat absolut 
X,Y dalam meletakkan komponen di layar.  
 
Untuk menempatkan komponen pada posisi yang 
diinginkan, maka berikan koordinat absolut melalui 
metoda setBounds() 
 
setBounds(int x, int y, int w, int h); 
 
int x,y   koordinat awal (x,y)  
int w     width, lebar komponen dalam pixel  
int h  height, tinggi komponen dalam pixel  
 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
 
public class NoLayout {  
 
    public static void main (String argv[]) { 
        JFrame layar= new JFrame ("No Layout");  
        JButton button1; 
        JButton button2; 
        JButton button3; 
        JButton button4; 
        JButton button5; 
        Container c; 
        c = layar.getContentPane(); 
        c.setBackground(Color.WHITE); 
        c.setLayout(null); 
 
        button1=new JButton("1"); 
        c.add(button1); 
        button1.setBounds(21,7,49,30);  
        button2=new JButton("2"); 
        c.add(button2); 
        button2.setBounds(21,45,49,30);  
        button3=new JButton("3"); 
        c.add(button3); 
        button3.setBounds(21,82,49,30);  
        button4=new JButton("4"); 
        c.add(button4); 
Layout  
4-18  
        button4.setBounds(21,120,49,30);  
        button5=new JButton("5"); 
        c.add(button5); 
        button5.setBounds(21,157,49,30);  
         
        layar.setSize(300,300); 
        layar.setVisible(true); 
              layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
    } 
}      
 
Hasil: 
 
 
 
 
Perubahan Window tidak mempengaruhi letak 
komponen: 
 
 
 
  
 
 
 
 
 
 
 
  
Komponen GUI 
Java 
 
 
 
 
 
 
 
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-1 
JCheckBox  
 
JCheckBox  menampilkan pilihan melalui box yang 
dapat dipilih (checked = true) atau tidak dipilih 
(checked= flase).  
 
Konstuktor: 
 
JCheckBox(); 
JCheckBox(String teks); 
JCheckBox(String teks, boolean state); 
 
JRadioButton(); 
JRadioButton(String teks); 
JRadioButton(String teks, boolean state); 
 
Berikut adalah program dengan memiliki 2 Panel, 
panel pertama untuk checkbox dan panel kedua 
untuk radio button. 
 
JPanel panel1= new JPanel(); 
JPanel panel2= new JPanel(); 
panel1.setLayout(new GridLayout(3,1)); 
panel2.setLayout(new GridLayout(3,1)); 
 
Container c= this.getContentPane(); 
c.setLayout(new BorderLayout()); 
c.add(panel1,"West"); 
c.add(panel2,"East"); 
 
Panel pertama diisi dengan checkbox dan 
menggunakan GridLayout(3,1), diisi dengan 3 buah 
checkbox.  
 
JCheckBox cb1= new JCheckBox("UNIX"); 
JCheckBox cb2= new JCheckBox("Windows 2000"); 
JCheckBox cb3= new JCheckBox("AS400"); 
 
panel1.setLayout(new GridLayout(3,1)); 
panel1.add(cb1); 
panel1.add(cb2); 
panel1.add(cb3); 
 
Kom ponen GUI  
Copyright  Inixindo  5-2 
Panel untuk Checkbox diberikan Border, d iambil dari 
BorderFactory.  
 
import javax.swing.border.*; 
 
.... 
Border b= BorderFactory.createEtchedBorder(); 
 
panel1.setBorder ( 
           
      BorderFactory.createTitledBorder( 
        b, "Operating Systems", 
        TitledBorder.TOP, TitledBorder.CENTER )); 
 
Label Operating Systems diletakkan pada bagian 
atas Border, ditulis di tengah. 
 
Hasil: 
 
 
 
 
 
 
 
 
Kemudian dibentuk RadioButton sebagai berikut:  
 
JRadioButton rb1= new JRadioButton("Distributor"); 
JRadioButton rb2= new JRadioButton("Reseller"); 
JRadioButton rb3= new JRadioButton("Partner"); 
 
panel2.add(rb1); 
panel2.add(rb2); 
panel2.add(rb3); 
 
Demikian juga dengan Border, identis dengan cara 
pada checkbox:  
 
Border b2= BorderFactory.createEtchedBorder(); 
panel2.setBorder(BorderFactory.createTitledBorder( 
b2,"Status",TitledBorder.TOP, TitledBorder.LEFT)); 
 
Kom ponen GUI  
Copyright  Inixindo  5-3 
Program Lengkap:  
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import javax.swing.border.*; 
 
public class CheckRadio extends JFrame { 
   public CheckRadio() 
   { 
 JPanel panel1= new JPanel(); 
 JPanel panel2= new JPanel(); 
     panel1.setLayout(new GridLayout(3,1)); 
 panel2.setLayout(new GridLayout(3,1)); 
 Container c= this.getContentPane(); 
 c.setLayout(new BorderLayout()); 
 c.add(panel1,"West"); 
 c.add(panel2,"East"); 
 
 JCheckBox cb1= new JCheckBox("UNIX/LINUX"); 
 JCheckBox cb2= new JCheckBox("Windows 2003"); 
 JCheckBox cb3= new JCheckBox("AS400"); 
 
     Border b1= BorderFactory.createEtchedBorder(); 
 panel1.setBorder(BorderFactory.createTitledBorder(b1
,"Operating Systems", 
  TitledBorder.TOP,TitledBorder.CENTER)); 
 panel1.add(cb1); 
 panel1.add(cb2); 
 panel1.add(cb3); 
     Border b2= BorderFactory.createEtchedBorder(); 
 panel2.setBorder(BorderFactory.createTitledBorder(b2
,"Status", 
  TitledBorder.TOP,TitledBorder.CENTER)); 
 JRadioButton rb1= new JRadioButton("Distributor"); 
 JRadioButton rb2= new JRadioButton("Reseller"); 
 JRadioButton rb3= new JRadioButton("Partner"); 
 panel2.add(rb1); 
 panel2.add(rb2); 
 panel2.add(rb3); 
 
   } 
   public static void main (String[] args) { 
      CheckRadio layar= new CheckRadio(); 
      layar.pack(); 
      layar.setLocation(60,60); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
   } 
Kom ponen GUI  
Copyright  Inixindo  5-4 
Hasil: 
 
 
 
RadioButton belum berfungsi dengan baik,  karena 
tidak membentuk satu group, bila satu radiobutton 
ON, maka yang lainnya harus dalam posisi OFF 
(tidak terpilih). 
 
Agar dapat berfungsi dengan baik, class 
ButtonGroup harus dideklarasikan dan obyek 
Radiobutton ditambahkan sebagai member dalam 
group tersebut. 
 
 
JRadioButton rb1= new JRadioButton("Distributor"); 
JRadioButton rb2= new JRadioButton("Reseller"); 
JRadioButton rb3= new JRadioButton("Partner"); 
panel2.add(rb1); 
panel2.add(rb2); 
panel2.add(rb3); 
 
ButtonGroup bg = new ButtonGroup();  
bg.add(rb1 ); 
bg.add(rb2);  
bg.add(rb3);  
 
Metoda: Pada JCheckBox dan JRadioButton  
 
setSelected(boolean val) 
menjadikan ON (true) atau OFF(false)  
 
boolean getSelected() 
mengambil nilai checkbox (true atau false)  
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-5 
Event untuk CheckBox dan RadioButton  
 
Event ditangkap  melalui ItemListener dan 
ActionListener. 
 
 ActionListener al= new ActionListener() { 
  public void actionPerformed(ActionEvent ev) { 
     System.out.println("Action:"); 
  } 
 }; 
 ItemListener il= new ItemListener() { 
  public void itemStateChanged(ItemEvent ev) { 
     System.out.println("Item:"); 
  } 
 }; 
 
 cb1.addActionListener(al);  
 cb1.addItemListener(il);  
 
Bila terjadi perubahan state dari true menjadi false 
dan sebaliknya, maka kedjadian ini akan diregistrasi 
ke komponen melalui ItemListener.  
 
 
Kom ponen GUI  
Copyright  Inixindo  5-6  
Lab 1:  CheckBox Test  
 
Buat sebuah TexField dan 2 buah CheckBox. Bila 
checkbox pertama dipilih, maka tulisan pada 
TextField akan berubah menjadi BOLD, sedangkan 
bila checkbox kedua terpilih, tulisan akan menjadi 
miring (italic). 
 
 
 
Untuk mengetahui perubahan pad a CheckBox, 
gunakan Event dari ItemListener.  
 
private class Lab4_1 implements ItemListener { 
 
   private int vBold = Font.PLAIN; 
   private int vItalic = Font.PLAIN; 
 
   public void itemStateChanged (ItemEvent e) { 
      if (e.getSource() == jCheckBox1) 
        if ( e.getStateChange() == ItemEvent.SELECTED ) 
               vBold= Font.BOLD; 
        else vBold= Font.PLAIN; 
      else if (e.getSource() == jCheckBox2) 
        if ( e.getStateChange() == ItemEvent.SELECTED ) 
               vItalic= Font.ITALIC; 
        else vItalic= Font.PLAIN; 
 
      jTextField1.setFont ( 
         new Font ("TimesRoman", vBold + vItalic, 14) ); 
      jTextField1.repaint(); 
    } 
Daftarkan ItemListener ini pada komponen dengan 
menggunakan addItemListener(...) . 
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-7  
JList (Daft ar Pilihan)  
 
JList adalah komponen yang menampilkan daftar pilihan 
dan pemakai dapat memilih satu atau beberapa baris dari 
pilihan tersebut. 
 
Konstruktor: 
JList(); 
JList (ListModel model) 
JList (Object[ ] nilai ) 
JList (Vector elemen); 
 
Contoh Program: 
// Author: Inixindo 
public static void main (String[] args) { 
    
      JFrame layar= new JFrame(); 
      String[] kota=      
    {"Medan","Batam","Balikpapan","Semarang","Surabaya"}; 
 
      JList mylist= new JList(kota); 
      Container c= layar.getContentPane(); 
      c.add (mylist); 
 
      layar.setSize(200,80); 
      layar.setLocation(60,60); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
   } 
 
Hasil: 
 
Tampilan JList  tersebut hanya sebatas Frame yang 
tersedia, sedangkan data yang lainnya tidak 
tampak. Untuk menampilkan seluruh data, maka 
diperlukan bantuan JScrollPane . 
 
Kom ponen GUI  
Copyright  Inixindo  5-8  
JScrollPane jsp= new JScrollPane(mylist); 
 
Kemudian komponen jsp ini ditambahkan pada 
panel dan bukan mylist. 
 
Container c= layar.getContentPane(); 
c.add(jsp); 
 
Hasil: 
 
 
JList  dapat dideklarasikan tanpa elemen, dan  
kemudian ditambahkan dengan metoda 
setListData . 
 
JList mylist= new JList(); 
String[] kota=      
    {"Medan","Batam","Balikpapan","Semarang","Surabaya"}; 
 
mylist.setListData  (kota); 
 
Cara lain menginisialisi elemen pada JList adalah 
dengan menggunakan DefaultListModel  yang 
merupakan implementasi dari AbstractListModel.  
 
DefaultListModel  menggunakan struktur data 
Vector  untuk menyimpan dan mengakses elemen 
didalamnya. 
 
Kom ponen GUI  
Copyright  Inixindo  5-9  
Contoh dengan ListModel:  
 
DefaultListModel dlist= new DefaultListModel(); 
dlist.addElement("Medan"); 
dlist.addElement("Batam"); 
dlist.addElement("Balikpapan"); 
dlist.addElement("Semarang"); 
dlist.addElement("Surabaya"); 
 
JList mylist2= new JList(dlist); 
 
 
Event untuk JList  
 
Event ListSelectionListener harus 
didaftarkan pada komponen JList agar dapat 
bereaksi atas pilihan pada daftar tersebut. 
 
ListSelectionListener mengimplementasikan satu 
metoda saja, yaitu valueChanged() . 
 
ListSelectionListener ls = new ListSelectionListener() { 
      public void valueChanged(ListSelectionEvent ev) { 
         int i= mylist.getSelectedIndex(); 
         String s = (String) mylist.getSelectedValue(); 
     tf.setText(i + " : " + s); 
      } 
} ; 
 
Metoda getSelectedIndex() mereferensikan 
pada index dari elemen yang dipilih. Index dimulai 
dari angka 0.  
 
getSelectedValue()  memberikan obyek yang 
dipilih. Pada contoh diats, obyek tersebut dikonver -
sikan ke String. 
 
Obyek string dan index kemudian ditampilkan pada 
sebuah textfield.  
 
 
Kom ponen GUI  
Copyright  Inixindo  5-10  
Program berikut akan menampilkan sebuah JList 
yang berisi nama kota. Bila salah satu beris dipilih, 
maka string pada kota tersebut akan disalin ke 
textfield, disertai dengan index.  
 
 
 
// Author: Inixindo 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import javax.swing.event.*; 
 
public class MyList  { 
   static JTextField tf = new JTextField(20); 
   static JList mylist= new JList(); 
    
   public static void main (String[] args) { 
 
      String[] kota= 
{"Medan","Batam","Balikpapan","Semarang","Surabaya"}; 
       
      JFrame layar= new JFrame(); 
      mylist.setListData(kota); 
      JScrollPane jsp= new JScrollPane(mylist); 
 
Container c= layar.getContentPane(); 
      c.setLayout(new FlowLayout() ); 
      c.add(jsp); 
      c.add(tf); 
 
      mylist.setSelectedIndex(2); 
 
      ListSelectionListener ls =  
           new ListSelectionListener() { 
        public void valueChanged(ListSelectionEvent ev) { 
               int i= mylist.getSelectedIndex(); 
Kom ponen GUI  
Copyright  Inixindo  5-11 
           String s = (String) mylist.getSelectedValue(); 
       tf.setText(i + " : " + s); 
         } 
      } ; 
      mylist.addListSelectionListener(ls); 
 
 
      layar.pack(); 
      layar.setLocation(60,60); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
   } 
 
Hasil: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-12 
Lab 2: JList  
 
 
 
Buat sebuah komponen JList  yang terdiri atas daftar nama 
warna: 
yellow, green, red, magenta, orange, pink, white, black, 
gray, blue. 
 
Bila warna tersebut dipilih, maka background color dari 
Frame yang digunakan segera menjadi warna yang dipilih 
tersebut. Gunakan setBackground ( ) untuk mengubah 
warna. 
 
Container c = layar.getContentPane(); 
c.setBackground ( .........); 
 
Gunakan event ListSelectionListener  . 
 
ListSelectionListener ls = new ListSelectionListener() { 
        public void valueChanged(ListSelectionEvent ev) { 
           int i= clist.getSelectedIndex(); 
           c.setBackground (cl[i]); 
        } 
      }; 
      clist.addListSelectionListener(ls); 
 
Kom ponen GUI  
Copyright  Inixindo  5-13 
Kerangka Program: 
 
// Author: Inixindo 
import javax.swing.*; 
import javax.swing.event.*;  
import java.awt.event.*; 
import java.awt.*; 
 
public class TestJList  extends JFrame   { 
   private JList clist= new JList(); 
   private Container c= getContentPane(); 
   String[] warna= { 
        "yellow", "green", "red", "magenta", "orange",  
        "pink", "white", "black", "gray", "blue" }; 
   Color[] cl= {Color.YELLOW, Color.GREEN, Color.RED,     
     Color.MAGENTA,Color.ORANGE, Color.PINK, Color.WHITE,  
     Color.BLACK,Color.GRAY, Color.BLUE }; 
    
   public TestJList  { 
      initComponents(); 
   } 
   public void initComponents() { 
 
      int i=0; 
       
      clist.setListData(warna); 
      JScrollPane jsp= new JScrollPane(clist); 
 
      c.setLayout(new FlowLayout() ); 
      c.add(jsp); 
       
      setSize(200,300); 
      setVisible(true); 
      setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
 
      // posisikan warna awal pada index = 2 (red) 
      clist.setSelectedIndex(2); 
      c.setBackground (2); 
 
   .... 
   .... 
 
   }  
   public static void main (String[] args) { 
      new TestJList(); 
   } 
 
Kom ponen GUI  
Copyright  Inixindo  5-14 
JComboBox  
 
JComboBox menawarkan pilihan pada daftar yang 
diberikan melalui data model. 
 
Konstruktor: 
JComboBox(); 
JComboBox(ComboBoxModel model); 
 
Untuk menambahkan elemen pada JComboBox 
digunakan metoda addItem seperti pada contoh 
berikut: 
 
JComboBox combo= new JComboBox(); 
combo.addItem("Medan"); 
combo.addItem("Batam"); 
combo.addItem("Balikpapan"); 
combo.addItem("Semarang"); 
combo.addItem("Surabaya"); 
 
Hasil: 
 
 
Metoda setSelectedIndex() atau 
setSelectedItem() dapat digunakan untuk 
memilih elemen yang muncul sebagai pilihan awal. 
 
Metoda setSelectedItem(Object Item) 
digunakan untuk memilih elemen dalam daftar 
tersebut, sedangkan getSelectedItem dipakai 
untuk mengetahui elemen mana yang terpilih dari 
daftar tersebut. 
Kom ponen GUI  
Copyright  Inixindo  5-15 
 
//Pilih kota Semarang 
combo.setSelectedIndex(3); 
 
atau: 
 
//Pilih kota Batam 
combo.setSelectedItem("Batam"); 
 
 
Untuk mendapatkan elemen yang dipilih, digunakan 
metoda getS el ec t edIte m( )  atau ge tSel ec tedIndex ().  
 
 
Event untuk JComboBox  
 
Event ItemListener dapat didaftarkan pada 
JComboBox dengan mengimplementasikan metoda 
itemStateChanged().  
 
ItemListener ls = new ItemListener() { 
    public void itemStateChanged(ItemEvent ev) { 
       int i= combo.getSelectedIndex(); 
       String s = (String) combo.getSelectedItem(); 
   tf.setText(i + " : " + s); 
    } 
} ; 
combo.addItemListener(ls); 
 
Hasil: 
 
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-16  
Program Lengkap:  
 
/* Author: Inixindo */ 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
import javax.swing.event.*; 
 
public class MyCombo extends JFrame { 
   private JTextField tf = new JTextField(20); 
   private JComboBox combo= new JComboBox(); 
   private String[] kota={"Medan","Jakarta", "Bandung", 
   "Jogja", "Surabaya", "Denpasar","Palembang"}; 
   private Container c= getContentPane();                   
   public MyCombo() { 
      initComponents(); 
   } 
   private void initComponents()  
   { 
      // daftarkan nama kota pada combo box 
      for (int k=0; k< kota.length;k++) { 
           combo.addItem( kota [k] ); 
      } 
 
      combo.setSelectedItem("Bandung"); 
      c.setLayout(new FlowLayout() ); 
      c.add(combo); 
      c.add(tf); 
 
      ItemListener ls = new ItemListener() { 
         public void itemStateChanged(ItemEvent ev) { 
           int i= combo.getSelectedIndex(); 
           int ix= i + 1; 
           String s = (String) combo.getSelectedItem(); 
       tf.setText(ix + " : " + s); 
         } 
      } ; 
      combo.addItemListener(ls); 
      pack(); 
      setLocation(100,100); 
      setVisible(true); 
      setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
   } 
   public static void main (String[] args) { 
    new MyCombo(); 
   } 
 
Kom ponen GUI  
Copyright  Inixindo  5-17  
Window - Dialog  
 
Dialog adalah subwindow yang diasosiasikan 
dengan aplikasi dan hanya muncul bila dibutuhkan. 
 
Dialog adalah media interaktif yang singkat untuk 
memberikan informasi kepada pemakai atau 
digunakan untuk data masukan yang singkat. 
 
Class JOptionPane memberikan banyak metoda 
dan opsi untuk menampilkan dialog, antara lain: 
 
‰ Message Dialog 
 
‰ Confirmation Dialog 
 
‰ Option Dialog  
 
‰ Input Dialog 
 
‰ Dan lainnya 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-18  
Message Dialog  
 
Metoda showMessageDialog() pada class 
JOptionPane menampilkan pesan seperti pada 
contoh berikut: 
 
import javax.swing.*; 
import java.awt.*; 
 
public class Dialog1  { 
    
   public static void main (String[] args) { 
    
      JFrame layar = new JFrame("Dialog"); 
 
      JOptionPane.showMessageDialog  
(layar,"Press OK to continue");    
      layar.setSize(200,80); 
      layar.setLocation(60,60); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
 
   } 
 
 
Pesan ini muncul sebelum Window/ Frame aktif.  
 
Konstruktor dari contoh diatas: 
 
showMessageDialog(Component cm, Object message); 
 
Bentuk lain konstruktor yang lain: 
 
showMessageDialog(Component cm, Object message, 
String title, int messageType); 
Kom ponen GUI  
Copyright  Inixindo  5-19  
Bebe rapa mes s agety pe :  
 
JOptionPane.PLAIN_MESSAGE 
JOptionPane.INFORMATION_MESSAGE 
JOptionPane.WARNING_MESSAGE 
JOptionPane.QUESTION_MESSAGE 
JOptionPane.ERROR_MESSAGE 
 
 
JOptionPane.showMessageDialog(layar, 
"Press OK to continue");    
JOptionPane.showMessageDialog(layar, 
"AWAS ada ULAR","Warning",  
JOptionPane.WARNING_MESSAGE);    
JOptionPane.showMessageDialog(layar, 
"Anda sudah yakin ?","Question", 
JOptionPane.QUESTION_MESSAGE);    
JOptionPane.showMessageDialog(layar, 
       "Fatal Error","Error",JOptionPane.ERROR_MESSAGE); 
 
 
 
 
 
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-20  
Confirmation Dialog  
 
Seperti juga Message Dialog, Confirmation Dialog 
memberikan pertanyaan dengan menampilkan satu 
atau beberapa tombol sebagai pilihan. 
 
int showConfirmDialog (Component comp, Object Message) 
 
Metoda s howC o nfi rmDia l og()  memberikan nilai balik 
yaitu: 
 
JOptionPane.CLOSED_OPTION 
JOptionPane.CANCEL_OPTION 
JOptionPane.NO_OPTION 
JOptionPane.YES_OPTION 
 
 
 
      int jawaban=  
  JOptionPane.showConfirmDialog(layar,"Yakin ?"); 
 
      if (jawaban==JOptionPane.YES_OPTION) 
         System.out.println("Yes !"); 
      else if (jawaban==JOptionPane.NO_OPTION) 
         System.out.println("No !"); 
      else if (jawaban==JOptionPane.CANCEL_OPTION) 
         System.out.println("Cancel !"); 
      else if (jawaban==JOptionPane.CLOSED_OPTION) 
         System.out.println("Tidak dijawab !"); 
 
 
 
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-21 
Pilihan tombol dapat diganti dengan menggunakan 
konstruktor berikut: 
 
showConfirmDialog (Component comp, Object message, 
       String title, int optionType); 
 
Opti onType adal ah:  
 
JOptionPane.OK_CANCEL_OPTION  
JOptionPane.YES_NO_ OPTION  
JOptionPane.YES_NO_CANCEL_OPTION  
JOptionPane.DEFAULT_ OPTION  
 
 
Dialog diatas menggunakan opsi YES_NO_OPTION.  
 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-22 
Option Dialog  
 
Option Dialog mirip dengan Confirm Dialog, tapi 
perogrammer dapat mengendalikan tombol dan 
susunan tombol tersebut, lengkap dengan string/ 
tulisan diatas tombol. 
 
showOptionDialog (Component comp, Object message, 
      String title, int optionType, 
      Icon ic, Object options[], 
      Object initialValue); 
 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
 
public class Dialog2  { 
   static String strCoba = "Coba Lagi"; 
   static String strBatal= "Batal"; 
    
   public static void main (String[] args) { 
        
      JFrame layar = new JFrame("Dialog"); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
      int jawaban=  
  JOptionPane.showOptionDialog (  
          layar, 
          "Hubungan ke Internet putus, coba lagi ?", 
  "Tanya", 
  JOptionPane.DEFAULT_OPTION, 
  JOptionPane.ERROR_MESSAGE, 
  null,  
  new String[] { strCoba, strBatal}, 
      strBatal ); 
 
      System.out.println("Jawaban = " + jawaban); 
      
      layar.setSize(200,80); 
      layar.setLocation(60,60); 
      layar.setVisible(true); 
   } 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-23 
Input Dialog  
 
Input DIalog memberikan textfield untuk dapat diisi 
atau Dialog dapat memberikan daftar pilihan input. 
 
Input Dialog mempunyai 4 buah konstruktor: 
 
showInputDialog (Object message); 
 
showInputDialog (Component comp, Object message); 
 
showInputDialog (Component comp, Object message, 
  String title, int messageType); 
 
showInputDialog (Component comp, Object message, 
  String title, int messageType, Icon ic, 
  Object[] selectionValue, Object initialSelectionValue); 
 
Tipe dari s howIn putDi al og  adalah String  dan 
digunakan sebagai nilai balik. 
 
String str; 
 
str= JOptionPane.showInputDialog(...); 
 
 
Program berikut menggunakan konstruktor pertama: 
 
String input; 
input = JOptionPane.showInputDialog("Hai"); 
 
Hasil: 
 
 
 
 
 
 
 
Bila tombol Cancel yang dipilih, maka Java 
memberikan nilai null sebagai jawaban input string. 
Kom ponen GUI  
Copyright  Inixindo  5-24 
Berikut adalah program dengan konstruktor ketiga: 
 
 
 
 
 
 
 
 
String input; 
input = JOptionPane.showInputDialog(layar, 
       "Berikan Nama File", 
       "Nama File", 
       JOptionPane.WARNING_MESSAGE); 
 
 
Konstruktor keempat memberikan pilihan berupa 
daftar string. 
 
input = (String) JOptionPane.showInputDialog( 
              layar, 
       "Pilih Kota Untuk Seminar VOIP", 
       "Voice Over IP", 
       JOptionPane.QUESTION_MESSAGE, 
       null, 
       pilihan, 
       pilihan[0] ); 
 
 
 
 
 
 
 
 
Karena konstruktor keempat memberikan nilai balik 
berupa Object , maka casting dengan String 
diperlukan. 
 
 
 
Kom ponen GUI  
Copyright  Inixindo  5-25 
Program: Dialog3.java  
 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.*; 
 
public class Dialog3  { 
   static String strCoba = "Coba Lagi"; 
   static String strBatal= "Batal"; 
   static String input; 
    
   public static void main (String[] args) { 
        
      JFrame layar = new JFrame("Dialog"); 
 
 
      String[] pilihan = { 
        "Medan","Bandung","Surabaya","Jogja", 
            "Palembang"}; 
 
      input = (String) JOptionPane.showInputDialog( 
              layar, 
       "Pilih Kota Untuk Seminar VOIP", 
       "Voice Over IP", 
       JOptionPane.QUESTION_MESSAGE, 
       null, 
       pilihan, 
       pilihan[0] ); 
 
 
      System.out.println("Jawaban = " + input); 
      
      layar.setSize(200,80); 
      layar.setLocation(60,60); 
      layar.setVisible(true); 
      layar.setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
   } 
 
 
  
Menu 
Java 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
MENU  
 6 -1 
Sistem Menu  
 
Menubar dapat ditambahkan pada Frame dengan 
menggunakan class JMenuBar.  
 
JMenuBar menu = new JMenuBar(); 
 
Menu adalah bagian dari JComponent  yang dapat 
ditempatkan pada window aplikasi dengan 
menggunakan metoda setJMenuBar(). 
 
JFrame layar= new JFrame(); 
JMenuBar menu= new JMenuBar(); 
 
layar.setJMenuBar(menu); 
 
Menubar terdiri atas satu atau beberapa submenu. 
Submenu dapat dtambahkan melalui class JMenu 
sebagai berikut: 
 
JMenu submenu= new JMenu("Peserta"); 
 
Submenu ini ditambahkan kepada MenuBar sebagai 
berikut: 
 
menu.add(submenu); 
 
Selanjutnya setiap submenu mempunyai MenuItem, 
yang mana kemudian dapat dipilih. 
 
JMenuItem addmenu= new JMenuItem("Pendaftaran"); 
JMenuItem modmenu= new JMenuItem("Perubahan"); 
JMenuItem canmenu= new JMenuItem("Pembatalan"); 
 
MenuItem ini kemudian ditambahkan ke submenu: 
 
submenu.add(addmenu); 
submenu.add(modmenu); 
submenu.add(canmenu); 
MENU  
 6 -2 
Contoh Program: 
 
public class Menu extends JFrame { 
   JMenu submenu = new JMenu("Peserta"); 
   JMenuItem addmenu= new JMenuItem("Pendaftaran"); 
   JMenuItem modmenu= new JMenuItem("Perubahan"); 
   JMenuItem canmenu= new JMenuItem("Pembatalan"); 
 
   public Menu() { 
      JMenuBar menu = new JMenuBar(); 
      this.setJMenuBar(menu); 
 
      menu.add(submenu); 
 
      submenu.add(addmenu); 
      submenu.add(modmenu); 
      submenu.add(canmenu);       
 
   } 
   public static void main (String[] args) { 
 
      Menu m = new Menu(); 
      m.setSize(400,100); 
      m.setLocation(60,60);  
      m.setVisible(true); 
   } 
 
 
Hasil: 
 
 
Catatan: 
Bila dibutuhkan pemisah antar menu, maka dapat 
dipanggil metoda addSeparator() pada submenu. 
 
submenu.addSeparator(); 
 
MENU  
 6 -3 
Event Handling  
 
Menu yang dipilih akan diberitahukan melalui event 
yang dikirim melalui ActionListener . 
 
JMenuItem exitmenu= new JMenuItem("Exit"); 
       
submenu.add(addmenu); 
submenu.add(modmenu); 
submenu.add(canmenu);       
submenu.addSeparator(); 
submenu.add(exitmenu); 
 
exitmenu.addActionListener( new ActionListener()  
   { 
      public void actionPerformed(ActionEvent ev) { 
         System.exit(0); 
      } 
   } ) ; 
 
Melalui Inner Class, actionPerformed()  
diimplementasikan dan didaftarkan pada exitmenu. 
Sehingga bila exitmenu dipilih, maka event tersebut 
akan menjalankan System.exit(0);  
 
Menerima Event dari Menu secara umum dapat 
dilakukan sebagai berikut: 
 
menulistener= new ActionListener()  
  { 
     public void actionPerformed(ActionEvent ev) { 
        if ( ev.getSource() == addmenu) { 
            //handling add-menu 
        } 
        else if ( ... ) 
 
     } 
   } 
    
 
 
 
 
 
MENU  
 6 -4 
CheckBox  
 
MenuItem dapat berbentuk check box atau radio 
button melalui class JCheckBoxMenuItem.  
 
Deklarasi dibuat sebagai berikut: 
 
JCheckBoxMenuItem ronly=  
      new JCheckBoxMenuItem("Read Only"); 
submenu.add(addmenu); 
submenu.add(modmenu); 
submenu.add(canmenu);       
submenu.addSeparator(); 
submenu.add(ronly); 
submenu.addSeparator(); 
submenu.add(exitmenu); 
 
Nilai default dari CheckBox adalah false  
(unchecked). Untuk mengubahnya dibuat true pada 
saat inisialisasi. 
 
JCheckBoxMenuItem ronly=  
     new JCheckBoxMenuItem("Read Only", true); 
 
Untuk mengubah nilai tersebut, metoda setState()  
dapat digunakan. Untuk melihat nilai, gunakan 
getState().  
 
JCheckBoxMenuItem ronly=  
     new JCheckBoxMenuItem("Read Only"); 
ronly.setState(true); 
 
 
MENU  
 6 -5 
MenuItem dapat diabaikan dengan menempatkan 
metoda setEnabled = false.  
 
Contoh berikut mendemonstrasikan penggunaan 
CheckBox, yang bila dipilih, maka menuitem 
modmenu akan menjadi disable. 
 
ronly.addActionListener( new ActionListener()  
    public void actionPerformed(ActionEvent ev) { 
       if (ronly.getState() )  
  modmenu.setEnabled(false); 
       else 
          modmenu.setEnabled(true); 
    } 
} ) ; 
 
Program diatas menjelaskan bahwa jila status dari 
checkbox adalah true, maka modmenu akan 
menjadi disable, sedangkan bila false, maka 
modmenu menjadi enable. 
 
Hasil: 
 
 
Perhatikan bahwa menu "Perubahan" diabaikan dan 
kursor tidak dapat memilihnya lagi. 
 
 
 
 
 
MENU  
 6 -6  
Lab 1: Kerangka Java Editor  
 
Buat sistem Menu yang menyerupai aplikasi 
NotePad  di Windows.  
 
 
 
 
 
 
 
 
 
 
 
 
 
Pertama, definisikan dulu variable untuk Menu dan 
MenuItem. 
 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.io.*; 
import java.util.*; 
 
public class MyEditor  extends JFrame { 
     
    private JMenuBar menuBar= new JMenuBar(); 
    private JMenu fileMenu= new JMenu ("File"); 
    private JMenu helpMenu= new JMenu ("Help"); 
     
    private JMenuItem newMenu= new JMenuItem("New");  
    private JMenuItem openMenu= new JMenuItem("Open"); 
    private JMenuItem saveMenu= new JMenuItem("Save"); 
    private JMenuItem saveAsMenu=  
                          new JMenuItem("Save As ..."); 
    private JMenuItem closeMenu= new JMenuItem("Close"); 
    private JMenuItem exitMenu= new JMenuItem("Exit"); 
 
 
 
MENU  
 6 -7  
Pada Konstruktor, daftarkan menubar dan menuitem 
 
//Konstruktor  
public MyEditor() { 
        super("NotePad");     //Titel 
        setSize(350,250);   //Ukuran layar 
        setLocation(60,100);   //Lokasi Awal 
        setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE);  
 
        this.setJMenuBar(menuBar); 
        menuBar.add(fileMenu); 
        menuBar.add(helpMenu); 
        fileMenu.add(newMenu); 
        fileMenu.add(openMenu); 
        fileMenu.addSeparator(); 
        fileMenu.add(saveMenu); 
        fileMenu.add(saveAsMenu); 
        fileMenu.add(closeMenu); 
        fileMenu.addSeparator(); 
        fileMenu.add(exitMenu); 
 
 
Agar Frame dapat ditutup dengan baik, perlu 
dicantumkan windowsClosing ..... Tempatkan code 
tersebut pada Konstruktor. 
 
public MyEditor () { 
... 
... 
     addWindowListener (new WindowAdapter() { 
        public void windowClosing(WindowEvent ev) { 
             System.exit(0); 
        } 
     } 
     ); 
 } 
 
public void static main(String[] argv) { 
   MyEditor editor= new MyEditor(); 
   editor.show(); 
 
 
MENU  
 6 -8  
Lab 2: TextArea untuk Editor  
 
Sebagai canvas untuk editor, gunakan TextArea . 
Komponen ini diletakkan pada Pane dari Frame 
tersebut. 
 
Definisikan TextArea pada awal deklarasi MyEditor.  
 
public class MyEditor  extends JFrame { 
     
    .... 
    .... 
    private JMenuItem closeMenu= new JMenuItem("Close"); 
    private JMenuItem exitMenu= new JMenuItem("Exit"); 
     
      private JTextArea textArea= new JTextArea(20,40);  
 
 
Di Konstruktor tambahkan TextArea  dan ScrollBar 
pada Container dari Frame (ContentPane).  
 
 
    Container c; 
    c= getContentPane(); 
    c.add(new JScrollPane(textArea)); 
 
 
 
 
Periksa hasil dari MyEditor. Perhatikan bahwa Menu 
berlum bereaksi karena Event Handling belum 
dibuat. 
 
 
MENU  
 6 -9  
Lab 3: Event untuk Menu Exit  
 
Agar aplikasi MyEditor dapat berhenti dengan baik, 
bila menu EXIT dipilih, maka perlu dibuat Event 
Handling untuk menu EXIT tersebut.  
 
Dari Konstruktor, daftarkan Event Handling dengan 
InnerClass sebagai berikut: 
 
exitMenu.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ev) { 
         System.exit(0); 
    } 
} ); 
 
Eksekusi program untuk memeriksa apakah Aplikasi 
bereaksi bila menu Exit  dipilih. 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
MENU  
 6 -10  
Lab 4: Event Handling untuk MenuItem  
 
Event untuk Menu dibuat melalui sebuah class baru, 
yaitu MyListener. Semua MenuItem kecual 
menuExi t, bereaksi atas MyListener.  
 
newMenu.addActionListener(new MyListener()); 
         
saveMenu.addActionListener(new MyListener()); 
... 
// dan menu yang lain 
 
MyListener mendengar Event dari MenuItem 
tersebut dan kemudian mengidentikasikan, menu 
mana yang dimaksud. 
 
Untuk mengetahui MenuItem tertent, Event Handling 
menyediakan metoda getSource(). Melalui metoda 
ini kemudian dapat diketahui, MenuItem mana yang 
dipilih. 
 
 
class MyListener implements ActionListener  { 
    public void actionPerformed(ActionEvent ev) { 
        
       JMenuItem actualMenu = (JMenuItem) ev.getSource();  
             
       if(actualMenu == newMenu) { 
           textArea.setText("New Menu");  
       } 
       else if (actualMenu == openMenu) { 
           textArea.setText("Open Menu"); 
       } 
       else if (actualMenu == saveMenu) { 
           textArea.setText("Save Menu"); 
       } 
       else if (actualMenu == saveAsMenu) { 
           textArea.setText("Save As Menu"); 
       } 
       else if (actualMenu == closeMenu) { 
           textArea.setText("Close Menu"); 
       } 
 
 
  
File & Stream I/O 
Java 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
File & Stream  I/O  
7 -1 
Class File  
 
Class File tidak berhubungan dengan membaca 
atau menulis File, melainkan memberikan informasi 
tentang File tersebut, baik tipe File, ijin akses, 
jumlah byte dan lain-lain. 
 
Konstruktor: 
 
File (String Directory) 
File (String Directory, String NamaFile) 
File (String DirectoryObject, String NamaFile) 
 
Metoda isDirectory()  memberikan nilai balik true 
jika nama file adalah directory. 
 
import java.io.*; 
class FileInfo { 
   public static void main(String args[]){ 
   File f= new File(namaFile);  
   if ( f .isDirectory()  ) { 
      System.out.println(namaFile + " adalah Directory"); 
   else 
      System.out.println(namaFile + " bukan Directory"); 
 
Metoda list() memberikan daftar nama file yang 
berada pada direcoty tersebut. 
 
Program berikut mengembangkan program 
sebelumnya dengan menampilkan daftar file pada 
direktori. 
 
if (f.isDirectory()  ) { 
      System.out.println(namaFile + " adalah Directory"); 
      String s[]= f.list();  
      for (int i=0; i<s.length; i++) { 
         System.out.println(s[i]); 
      } 
else 
      System.out.println(namaFile + " bukan Directory"); 
File & Stream  I/O  
7 -2 
Atribut File  
 
File mempunyai attribut yang dapat dilihat melalui 
metoda sebagai berikutL  
 
boolean exists () 
File tersebut ada  
 
String getName() 
Memberikan nilai balik nama file 
 
String getAbsolutPath() 
Nama lengkap file dari root  
 
String getParent() 
Memberikan nama parent directory 
 
boolean canRead() 
File dapat dibaca  
 
boolean canWrite() 
File dapat ditulis  
 
int length() 
Jumlah bytes file tersebut  
 
 
File & Stream  I/O  
7 -3 
File Chooser  
 
File Chooser adalah box dialo g yang memberikan 
fasilitas untuk memilih File dan Directory yang 
diinginkan. 
 
Dialog ini akan memudahkan program untuk 
memilih File secara cepat dan tidak tergantung atas 
operating system yang ada. 
 
Konstruktor dari File Chooser adalah sebagai 
berikut: 
 
JFileChooser() 
JFileChooser(String currentDir) 
JFileChooser(File currentDir) 
 
Jika argumen tidak diberikan (kosong), maka default 
directory adalah Home directory. 
 
Program berikut akan menampilkan File Chooser:  
 
private JFileChooser fChooser; 
fChooser= new JFileChooser (); 
int pilihan= fChooser.showOpenDialog (); 
 
Setelah obyek JFileChooser diciptakan, maka 
metoda showOpenDialog()  akan menampilkan Box 
Dialog yang berisi Directory Tree.  
 
Bila pada Dialog tersebut file ada yang dipilih,  maka 
variable int pilihan akan memberikan informasi 
tentang tombol mana yang dipilih. 
 
JFileChooser.APPROVE_OPTION 
Tombol OPEN dipilih  
 
JFileChooser.CANCEL_OPTION 
Tombol CANCEL dipilih  
File & Stream  I/O  
7 -4 
 
 
Jika File telah dipilih, maka File tersebut dapat 
diambil dari Dialog dengan getSelectedFile (). Tipe 
Variable adalah class File.  
 
Nama File kemudian dapat diperoleh dengan 
menggunakan getName(),  metoda dari class File.  
 
File f; 
String namaFile; 
if (pilihan==JFileChooser.APPROVE_OPTION ) { 
     f= fChooser.getSelectedFile (); 
     namaFile= f.getNam e(); 
 
 
File & Stream  I/O  
7 -5 
Program Lengkap: FileChooser.java 
 
import javax.swing.*; 
import java.io.*; 
import java.awt.*; 
import java.awt.event.*; 
public class FileChooser extends JFrame { 
    private JFileChooser fChooser; 
    private File f; 
    private String namaFile; 
     
    public FileChooser() { 
        Container c= getContentPane(); 
        fChooser= new JFileChooser(); 
        int pilihan= fChooser.showOpenDialog(c); 
         
        if (pilihan==JFileChooser.APPROVE_OPTION) { 
            f= fChooser.getSelectedFile(); 
            namaFile= f.getName(); 
            System.out.println("File : " + namaFile); 
        } 
 
        addWindowListener(WindowAdapter() { 
            public void windowClosing(WindowEvent ev) { 
              System.exit(0); 
            } 
        } ); 
         
        setSize(300,300); 
       setLocation(100,100); 
        setDefaultCloseOperation 
                           (JFrame.EXIT_ON_CLOSE); 
 
    } 
 
    public static void main (String args[]) { 
        new FileChooser().show (); 
    } 
 
 
File & Stream  I/O  
7 -6  
La b: FileChooser  
 
Kembangkan program File Chooser, tampilkan File 
dan attribut dari file tersebut. 
 
 
 
 
 
 
 
 
 
 
 
 
 
File & Stream  I/O  
7 -7  
Stream I/O  
 
Ada 2 cara untuk menyimpan data (file) di Java :  
 
1. Sebagai binary data  
File ini menyimpan bytes dan tidak dalam bentuk 
yang dapat dibaca sebagai teks (human readable), 
melainkan dalam bentuk bytes. 
 
2. Sebagai TextFile  
File menyimpan data dalam bentuk yang bisa 
dibaca sebagai teks (human readable) dalam format 
UTF (Un icode Text Formatted).  
 
Cara pertama digunakan bila data yang disimpan 
hanya dapat dibaca oleh aplikasi Java , sedangkan 
cara kedua digunakan bila data yang simpan juga 
akan dibaca oleh aplikasi non Java . 
 
Semua data yang akan disimpan dan dibaca dalam 
bentuk I/O Stream (aliran bits ) akan ditulis sebagai 
File  menggunakan class FileInput- Stream  dan 
FileOutputStream . 
 
 J av a Code
0 10 10 110 10 10 10 0 10 10 10 0 1
0 10 10 110 10 10 10 0 10 10 10 0 1
FileOutputStream
FileInputStream
 
Class FileOutputStream mempunyai metoda write() 
dan FileInputStream metoda read(), namun 
argumen yang digunakan adalah int atau byte[] 
(array of byte). 
 
 
 
File & Stream  I/O  
7 -8  
Sehingga untuk dapat menulis String ke dalam 
FileOutputStream, String tersebut harus terlebih 
dahulu dikonversi ke array byte [ ] .  
 
import java.io.*;  
public class FileIO { 
    public static void main (String []args) 
                                throws IOException  { 
       FileInputStream fis; 
       FileOutputStream fos; 
        
       byte[] b= {'h', 'a', 'l', 'o'};  
       int len= b.length; 
        
       fos = new FileOutputStream("myfile.dat");  
       fos.write (b, 0,  len); 
       fos.close(); 
        
    } 
 
Library Stre am I/O ada pada java.io.*  dan 
FileStream melempar  IOException . 
 
      fos = new FileOutputStream("myfile.dat");  
 
Bila "myfile.dat" belum ada, maka file tersebut akan 
diciptakan. 
 
      fos.write (b, 0,  len); 
Metoda write menulis array of bytes b, mulai dari 
index 0 (disebut juga offset), sepanjang len karakter.  
 
      fos.close(); 
Bila file tidak digunakan lagi, maka file tersebut 
harus ditutup dengan close(). 
 
 
 
 
 
 
File & Stream  I/O  
7 -9  
Untuk membaca file yang ditulis dengan 
FileOutputStream adalah menggunakan 
FileInputStream . 
 
       fis= new FileInputStream("myfile.dat"); 
       fis.read(b,0, len); 
       for (int i=0; i< len; i++) { 
           System.out.print(b[i]); 
       } 
       System.out.println(""); 
       fis.close(); 
 
Bila "myfile.dat" tidak ada, maka akan muncul 
F ileNotFoundException.  
 
      fis.read(b,0, len); 
Membaca FileInputStream kedalam array of bytes b, 
mulai dari offset 0, sepanjang len karakter.  
 
      for (int i=0; i< len; i++) { 
           System.out.print(b[i]); 
      } 
Menampilkan satu per satu isi byte yang dibaca. 
 
      fis.close(); 
Bila FileInputStream tidak dibutuhkan lagi, maka 
stream ini ditutup dengan close(). 
 
Hasil dari program adalah diluar dugaan, adalah 
berupa desimal, bukan kata 'halo'.  
 
10497108111  
 
Hal ini terjadi karena tipe dari byte adalah subtype 
dari integer. Untuk membuatnya dapat terbaca 
diperlukan casting ke char . 
 
for (int i=0; i< len; i++) { 
 
    System.out.print((char) b[i]); 
 
File & Stream  I/O  
7 -10  
Lab 1: Membaca File (FileInputStream)  
 
Untuk membaca File dari disk, diperlukan beberapa 
langkah. 
 
1. Definisikan nama file yang akan dibaca melalui class File, 
atau nama File lengkap dengan Path.  
 
2. Periksa apakah file tersebut ada (exist) dan tipe adalah 
file (bukan directory). 
 
3. Siapkan obyek FileInputStream untuk membaca isi file.  
 
4. Baca input, dan bila tidak ada input lagi, FileInput -Stream 
memberikan indikator -1 sebagai tanda tidak ada lagi 
data yang dapat dibaca. 
 
Program berikut menghitung jumlah bytes yang dibaca dari 
File. Perhatikan bahwa membaca file dapat menyebabkan 
Exception, karena i tu perlu ditangkap sinyal Exception, bila 
terjadi error. 
 
 
import java.io.*; 
public class BacaFile { 
    FileInputStream fin;  
    boolean eof;  
    public BacaFile() 
    { 
        File f= new File("C: \ \ Tutor \ \ MyClass.java"); 
        if (f.exists() && f.isFi le() ){ 
            System.out.println("OK"); 
        } 
        else { 
            System.out.println("File not found"); 
            System.exit(- 1); 
        } 
File & Stream  I/O  
7 -11 
 
        try { 
            fin= new FileInputStream(f);  
            eof= false; 
            int count= 0; 
            while (! eof){ 
               int input= fin.read();  
               if (input == - 1) 
                  eof= true; 
               else 
                  count++; 
            } 
            fin.close(); 
            System.out.println("Bytes=" + count); 
        } 
        catch (IOException ex) {  
            System.out.println("error here");; 
        } 
    } 
     
    public static void main(String []arg) { 
         
       new BacaFile(); 
        
    } 
 
 
 
File & Stream  I/O  
7 -12 
Lab 2: Menulis ke File (FileOutp utStream)  
 
FileOutputStream  adalah ekstensi dari O utputStream. 
Stream ini digunakan untuk menulis datastream ke File.  
 
Metoda write() dari FileOutputStream akan menulis array 
dari byte. Data yang akan ditulis, harus lebih dahulu 
ditransfer ke array tersebut. 
 
Metoda getBytes()  memindahkan data dari tipe String ke 
bytes array. 
 
Metoda flush()  memaksa sistem untuk mentransfer isi 
buffer di memory ke disk. Metoda close() digunakan untuk 
menutup FileStream jika sudah tidak dibutuhkan.  
 
import java.io.*; 
public class TulisFile  { 
    FileOutputStream fout ; 
    String teks = "Teks ini akan disimpan" ; 
    byte buf[];  
 
    public TulisFile() 
    { 
        File f= new File("C:\ \ Tutor\ \ MyFile.txt"); 
        try { 
            fout= new FileOutputStream(f);  
            buf= teks.getBytes();  
            fout.write(buf);  
            fout.flush();  
            fout.close();  
            System.out.println("Data writen to File " +  
f.getName() ); 
        } 
        catch (IOException ex) { 
            System.out.println("error here");; 
        } 
    } 
     
 
 
File & Stream  I/O  
7 -13 
PrintStream  
 
Contoh PrintStream  yang umum digunakan adalah 
System.out  dan System.err  dengan metoda 
print() dan println(). 
 
Class PrintStream  tidak menayangkan Eksepsi 
(throw IOException). Untuk memeriksa apakah 
terjadi error sewaktu penulisan, System.out 
menggunakan metoda checkError().  
 
import java.io.*; 
public class BacaFile2 { 
    FileInputStream fin; 
    public BacaFile2() 
    { 
        byte dataIn[]; 
        dataIn= new byte[1200]; 
        File f= new File("C:\ \ Tutor\ \ MyFile.txt"); 
        if (f.isFile() ){ 
            System.out.println("OK"); 
        } 
        else { 
            System.out.println("File not found"); 
            System.exit(- 1); 
        } 
        try { 
            int len; 
            fin= new FileInp utStream(f);  
            len= fin.read(dataIn,0,dataIn.length );  
            fin.close();  
            String teks = new String(dataIn, 0, len); 
            System.out.println(teks); 
        } 
        catch (IOException ex) { 
            System.out.println("error here");; 
        } 
    } 
 
    public static void main(String []arg) { 
          new BacaFile2(); 
    } 
 
 
 
File & Stream  I/O  
7 -14 
Reader dan Writer  
 
Di Java banyak teknik yang dapat digunakan untuk 
membaca dan menulis File. Reader dan Writer 
adalah class yang dapat membaca karakter dan 
baris text (String) dengan teknik yang relatif mudah.  
 
Direkomendasikan menggunakan Class Reader dan 
Writer ketimbang Streams  untuk membaca dan 
menulis data, khususnya untuk Character I/O 
(String).  
 
Kelebihan dari class Stream adalah performance 
yang lebih baik. Oleh karena itu bila menggunakan 
Reader dan Writer, sebaiknya menggunakan 
fasilitas buffering untuk mempercepat performance, 
yaitu dengan BufferedReader  dan PrintWriter. 
 
Class BufferedReader mempunyai metoda 
readLine() yang memberikan nilai balik berupa 
String, sedangkan class PrintWriter menggunakan 
metoda print() dan println() untuk menulis String ke 
File.  
 
Untuk menyimpan teks dalm file dipergunakan 
teknik sebagai berikut: 
 
File f = new File("C:\ \ Tutor\ \ MyFile.txt"); 
FileWriter fw  = new FileWriter( f ); 
PrintWriter fout  = new PrintWriter( fw ); 
 
Enkapsulasi file menjadi FileWriter diperlukan untuk 
mendefinisikan jalur output untuk karakter. 
Pembungkusan berikutnya dengan PrintWriter 
diperlukan agar program dapat menggunakan 
metoda print() dan println() atas obyek tersebut. 
 
 
File & Stream  I/O  
7 -15 
 J av a Code
0 10 10 110 10 10 10 0 10 10 1
FileWriter
0 10 10 110 10 10 10 0 10 10 10 0 1
PrintWriter
(buffered)
File
print()
println()
write()
/** 
 * @author INIXINDO  
*/ 
import java.io.*; 
public class MyWriter { 
    File f ;  
    FileWriter fw;  
    PrintWriter fout ;  
    /** Creates new MyWriter */ 
    public MyWriter() { 
        try { 
           f= new File ("C:\ \ Tutor\ \ MyFile.txt"); 
           fw= new FileWriter (f); 
           fout= new PrintWriter (fw); 
        } 
        catch (IOException ex) { 
            System.out.println("File gagal dibuka"); 
        } 
    } 
    public void tulisSajak() { 
        // Puisi Chairul Anwar 
        String sajak[]= { 
       "Ini kali tidak ada yang mencari cinta", 
       "di antara gudang, rumah tua, pada cerita", 
       "tiang serta temali, kapal, perahu tiada berlaut", 
       "menghe