pertama. Bab ini membahas secara lebih dalam mengenai exception dan juga sedikit
menyinggung tentang assertion.
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
penanganan exception.
Exception adalah singkatan dari Exceptional Events. Kesalahan (errors) yang terjadi
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.
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.
Contoh dari exceptions adalah pembagian oleh 0 dan error di luar jangkauan array.
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.
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.
penanganan exception, yaitu try, catch dan finally.
Seperti yang telah dijelaskan sebelumnya, keyword try, catch dan finally digunakan
bersama, namun finally bersifat opsional. Akan lebih baik jika memfokuskan pada 2
keyword pertama, kemudian membahas finally pada bagian akhir.
...
ArithmethicException. Tipe exception kemudian mengindikasikan klausa catch pada
class ini. Program tersebut menangani kesalahan yang terjadi dengan menampilkan
deskripsi dari permasalahan.
After exception.
exception. Dalam hal ini, terjadinya bermacam tipe kesalahan dapat ditangani
menggunakan beberapa blok catch. Perlu dicatat bahwa blok try dapat hanya
tipe exception yang berbeda di lain waktu.
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
Penggunaan try bersarang diperbolehkan dalam pemrograman Java.
Pelajari apa yang akan terjadi pada program jika argument – argument berikut dimasukkan :
Kode berikut menggunakan try bersarang tergabung dengan penggunaan method.
Saatnya anda mengimplementasikan finally dalam blok try-cacth. Berikut ini cara
} ...
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
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
melempar sebuah exception. Sintax pelemparan exception cukup sederhana.
Perhatikan contoh berikut ini.
checked exception. Anda akan mempelajari lebih lanjut tentang checked exception
dan unchecked exception pada bagian selanjutnya, “Kategori Exception”.
mungkin terjadi, namun hal itu dapat menghilangkan tipe Error, RuntimeException,
ataupun subclass-nya.
ClassNotFoundException.
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
untuk mengenalkan aturan : catch lebih dari satu harus berurutan dari subclass ke
superclass.
Setelah mengkompilasi kode tersebut akan menghasilkan pesan error jika Exception
class adalah superclass dari ArrayIndexOutOfBoundsException class.
Exception terdiri atas checked dan unchecked exceptions.
Checked exceptions adalah exception yang diperiksa oleh Java compiler. Compiler
terjadi dalam sintax throws. Apabila checked exception tidak didaftar ataupun
Tidak seperti checked exceptions, unchecked exceptions tidak berupa compile-time
checking dalam penanganan exceptions. Fondasi dasar dari unchecked exception
terjadi. Sehingga sangat mungkin bahwa anda perlu untuk membuat tipe exception
tersendiri.
permasalahan yang akan diselesaikan. Members dan constructors dapat dimasukkan
pada exception class milik anda.
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
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
assertions, maka tidak perlu untuk membaca keseluruhan kode melalui setiap
komentar untuk mencari asumsi yang dibuat dalam kode. Namun, menjalankan
salah. Jika assertion tersebut salah, maka AssertionError akan terjadi.
Penggunaan assertions tidak perlu melakukan import package java.util.assert.
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.
ditulis oleh programmer yang memiliki akses terhadap methods tersebut. Sehingga
mereka menyadari bahwa saat menjalankannya, assertion harus dalam keadaan
aktif.
cukup jalankan program secara normal.
parameter –enableassertions atau –ea.
Penulisan assertions memiliki dua bentuk.
dimana <expression1> adalah kondisi dimana assertion bernilai true.
dimana <expression1> adalah kondisi assertion bernilai true dan <expression2> adalah
informasi yang membantu pemeriksaan mengapa program mengalami kesalahan.
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
2
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
3
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
4
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
5
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
6
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
7
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