MODUL PRAKTIKUM PEMROGRAMAN LANJUT
Disusun oleh : 1. Candra Dewi, S.Kom., M.Sc. 2. Adharul Muttaqin, ST., MT. 3. Ahmad Afif Supianto, S.Si., M.Kom.
Program Teknologi Informasi dan Ilmu Komputer Universitas Brawijaya Malang
DAFTAR ISI
DAFTAR ISI .....................................................................................................................1 1. Method Static dan Method Overloading .........................................................................2 2. Class, Konstruktor dan Method Instan .......................................................................... 10 3. Encapsulation ............................................................................................................... 19 4. Inheritance ................................................................................................................... 29 5. Polymorphism .............................................................................................................. 37 6. Interface ....................................................................................................................... 47 7. Graphic User Interface ................................................................................................. 60 8. Graphic User Interface Lanjut ...................................................................................... 73
Praktikum Pemrograman Lanjut
1
Bab
Method Static dan Method Overloading
1 Methode Static
Hampir semua methode kelas (method yang dikaitkan dengan kelas secara keseluruhan dan bukan pada instan tertentu) dideklarasikan sebagai static. Method main hanya dapat mengakses method-method static dalam suatu kelas yang sama. Program berikut mengimplementasikan method static pada suatu kelas.: tStatic.java 1 import java.util.Scanner; 2 3 public class tStatic 4 { 5 public static void prosesString ( String s1, String s2 ) 6 { 7 System.out.println ( "String yang dimasukkan adalah :
"+s1 + " dan " + s2); 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
} public static void prosesInt ( int i ) { System.out.println ( "Hasil kuadrat " + i + " = " + Math.pow(i,2)); System.out.println ( "Hasil kali " + i + " dengan 2 = " + ( i * 2)); } public static void prosesDouble2 ( double a, double b ) { System.out.println ( "Hasil kali " + a +" dan " + b + " = " + ( a * b)); System.out.println ( "Jumlah " + a + " dan " + b + " = " + ( a + b)); } public static void prosesDouble ( double n ) { System.out.println ( n + " ^ 3 = " + (n*n*n)); System.out.println ( n + " / 3 = " + (n/3)); } public static void main ( String [] main ) { String s1, s2; Int i; double d1, d2; Scanner input = new Scanner(System.in);
System.out.print("Masukkan string pertama: "); s1 = input.next(); System.out.print("Masukkan string kedua: ");
Praktikum Pemrograman Lanjut
2
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
s2 = input.next(); prosesString (s1,s2); System.out.print("\nMasukkan bilangan integer : "); i = input.nextInt(); prosesInt(i); System.out.print("Masukkan bilangan pecahan pertama: "); d1 = input.nextDouble(); System.out.print("Masukkan bilangan pecahan kedua : "); d2 = input.nextDouble(); prosesDouble(d1); prosesDouble2(d1,d2); } }
Jalankan program diatas dan cobalah menghilangkan kata kunci static pada method kelas pada baris 5, 11, 17 dan 23. Perhatikan apa yang terjadi dan jelaskan kenapa hal tersebut bisa terjadi? 1.1 Method dengan Return Value Kita dapat mendeklarasikan method yang bisa mengembalikan suatu nilai dengan mengganti reference void dengan tipe tertentu. Perhatikan contoh program berikut yang memberikan return value dengan tipe long dan double. hitungluas.java 1 import java.util.Scanner; 2 3 public class hitungLuas 4 { 5 public static double luaslingkaran ( int r ) 6 { 7 double Luas; 8 9 Luas = 3.14 * r * r ; 10 11 return Luas; 12 } 13 14 public static long luasbidang( int p, int l ) 15 { 16 long Luas; 17 18 Luas = p * l; 19 20 return Luas; 21 } 22 23 public static void main ( String [] args ) 34 { 25 int r, p,l; 26 double Luas1=0; 27 long Luas2=0; 28 29 Scanner input = new Scanner(System.in);
Praktikum Pemrograman Lanjut
3
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
System.out.print("Masukkan jari-jari lingkaran : "); r = input.nextInt(); Luas1 = luaslingkaran ( r ); System.out.println ("Luas lingkaran : " + Luas1 ); System.out.print("\nMasukkan panjang segiempat : "); p = input.nextInt(); System.out.print("Masukkan lebar segiempat : "); l = input.nextInt(); Luas2 = luasbidang(p,l); System.out.println ("Luas Bidang : " + Luas2 ); } }
1.2 Method Overloading Overloading terjadi jika beberapa method memiliki nama yang sama, tetapi berbeda argumennya. Perhatikan program berikut yang merupakan modifikasi contoh program tStatic dengan mengimplementasikan overloading method.proses. Overloading.java 1 import java.util.Scanner; 2 3 public class Overloading 4 { 5 public static void proses ( String s1, String s2 ) 6 { 7 System.out.println ( s1 + " " + s2); 8 9 } 10 11 public static void proses ( int i ) 12 { 13 System.out.println ( "Hasil kuadrat " + i + " = " +
Math.pow(i,2)); System.out.println ( "Hasil kali " + i + " dengan 2 = " + ( i * 2));
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
} public static void proses ( double a, double b ) { System.out.println ( "Hasil kali " + a +" dan " + b + " = " + ( a * b)); System.out.println ( "Jumlah " + a + " dan " + b + " = " + ( a + b)); } public static void proses ( double n ) { System.out.println ( n + " ^ 3 = " + Math.pow(n,3)); System.out.println ( n + " / 3 = " + (n/3)); } public static void main ( String [] main ) {
Praktikum Pemrograman Lanjut
4
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
String s1, s2; Int i; double d1, d2; Scanner input = new Scanner(System.in);
System.out.print("Masukkan string pertama: "); s1 = input.next(); System.out.print("Masukkan string kedua: "); s2 = input.next(); proses(s1,s2); System.out.print("\nMasukkan bilangan integer : "); i = input.nextInt(); proses(i); System.out.print("Masukkan bilangan pecahan pertama: "); d1 = input.nextDouble(); System.out.print("Masukkan bilangan pecahan kedua : "); d2 = input.nextDouble(); proses(d1); proses(d1,d2); } }
Soal 1.1 (HexToDec) Susun program yang di dalamnya terdapat method untuk melakukan konversi bilangan heksadesimal menjadi desimal.
Soal 1.2 (Overloading2) Susun program dengan menggunakan overloading function dimana bila : a.
Dimasukkan argumen berupa string, maka dia akan menampilkan pola : Misal : argumen adalah JAVA J J A J A V J A V A
b.
Dimasukkan argumen integer, dia akan memberikan pola : Misal : argumen adalah angka 4 1 2 3 4
4 6 8
9 12
16
Praktikum Pemrograman Lanjut
5
c.
Dimasukkan dua argument dengan tipe boolean, maka dia akan menampilkan hasil dari operasi “And” untuk berbagai kombinasi dari dua argumen tersebut
Praktikum Pemrograman Lanjut
6
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
7
Praktikum Pemrograman Lanjut
8
Praktikum Pemrograman Lanjut
9
Bab
2
Class, Konstruktor dan Method Instan
2.1 Class dan Konstruktor Sebuah kelas bisa memiliki beberapa konstruktor, yaitu method dengan nama yang sama dengan nama class tetapi parameternya berbeda. Konstruktor secara otomatis akan dijalankan jika di-instan obyek dengan tipe kelas tersebut. Rasional2.java 1 public class Rasional2 2 { 3 private int pembilang, penyebut; 4 5 public Rasional2() 6 { 7 pembilang=1; 8 penyebut=1; 9 } 10 11 public Rasional2(int pbl, int pyb) 12 { 13 pembilang=pbl; 14 penyebut=pyb; 15 } 16 17 public int getPbl() 18 { 19 return pembilang; 20 } 21 22 public int getPyb() 23 { 24 return penyebut; 25 } 26 27 public void setRasional(int pbl , int pyb) 28 { 29 pembilang=pbl; 30 penyebut=pyb; 31 } 32 33 public void setPbl(int pbl) 34 { 35 pembilang=pbl; 36 } 37 38 public void setPyb(int pyb) 39 { 40 penyebut=pyb; 41 } 42
Praktikum Pemrograman Lanjut
10
Perhatikan deklarasi new pada baris 5 dan 6 (Rasional2Demo.java) ketika sebuah obyek diinstan dan inisialisasi kontruktor untuk kedua obyek tersebut dimana keduanya menjalankan kontruktor yang berbeda tergantung dari parameter yang dimasukkan. Perhatikan pula pemanggilan method-method instan pada main program. Rasional2Demo.java 1 public class Rasional2Demo 2 { 3 public static void main(String[] args) 4 { 5 Rasional2 R1 = new Rasional2(); 6 Rasional2 R2 = new Rasional2(6,8); 7 8 System.out.println("R1.getPbl() : " + R1.getPbl()); 9 System.out.println("R1.getPyb() : " + R1.getPyb() + "\n"); 10 11 System.out.println("R2.getPbl() : " + R2.getPbl()); 12 System.out.println("R2.getPyb() : " + R2.getPyb()+ "\n"); 13 14 R1.setRasional(3,5); 15 16 System.out.println("Setelah nilai pembilang dan penyebut pada R1 diset ulang"); 17 System.out.println("R1.getPyb() : " + R1.getPyb()); 18 System.out.println("R1.getPyb() : " + R1.getPyb()); 19 } 20 }
2.2 Method Instan Sebuah kelas juga memiliki method yang dikaitkan dengan instan tertentu. Sewaktu method instan dipanggil, dia akan mengakses data yang terdapat pada instan yang dikaitkannya. Program berikut merupakan modifikasi dari program sebelumnya dengan menyertakan operasi-operasi pada bilangan rasional. Rasional3.java 1 public class Rasional3 2 { 3 private int pembilang, penyebut; 4 5 public Rasional3() 6 { 7 pembilang=0; 8 penyebut=0; 9 } 10 11 public Rasional3(int pbl, int pyb) 12 { 13 pembilang=pbl; 14 penyebut=pyb; 16 } 17 18 //mengecek suatu bilangan adalah rasional atau bukan 19 public boolean isRasional() 20 {
Praktikum Pemrograman Lanjut
11
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
return (penyebut!= 0); } //menyederhanakan bilangan rasional public void Sederhana() { int temp, A, B; if (penyebut ==0) { return; } A = (pembilang
public boolean moreThan (Rasional3 A) { return (pembilang * A.penyebut > penyebut * A.pembilang ); } //operator Unary- ---> A = -A public void negasi() { pembilang = - pembilang; } //operator unary += public void unaryPlus(Rasional3 A) { pembilang = pembilang * A.penyebut + penyebut * A.pembilang; penyebut *=A.penyebut; } public void cetak() { System.out.println(pembilang + "/" + penyebut); } }
Rasional3Demo.java 1 public class Rasional3Demo 2 { 3 public static void main(String[] args) 4 { 5 Rasional3 R1 = new Rasional3(1,2);
Praktikum Pemrograman Lanjut
12
6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
Rasional3 R2 = new Rasional3(1,3); System.out.println("R1.isRasional: " + R1.isRasional()); System.out.println("R2.isRasional: " + R1.isRasional()); System.out.println(); System.out.println("R1 > R2 : " + R1.moreThan(R2)); System.out.println();
System.out.print("R1 : "); R1.cetak(); System.out.print("R2 : "); R2.cetak(); System.out.println(); R1.Sederhana(); R2.Sederhana(); System.out.print("R1 : "); R1.cetak(); System.out.print("R2 : "); R2.cetak(); System.out.println(); System.out.println("Setelah dilakukan Cast ke double menjadi : " ); System.out.println("R1 : " + R1.Cast()); System.out.println("R2 : " + R2.Cast()); System.out.println(); R1.negasi(); System.out.print("Unary- dari R1 : "); R1.cetak(); System.out.println(); R1.unaryPlus(R2); System.out.print("Nilai dari 'R1 += R2' : "); R1.cetak(); System.out.println(); } }
Soal 2.1 (Rasional4.java) Tambahkan operator – operator lain untuk melengkapi kelas bilangan rasional diatas, seperti : (minimal 5 operator) Operator Unary -= , unary /=, unary *=, unary ++, unary- Operator < , <= , >= Operator pembanding ==, pembanding != Opearator + , - , * , /
Praktikum Pemrograman Lanjut
13
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
14
Praktikum Pemrograman Lanjut
15
Praktikum Pemrograman Lanjut
16
Praktikum Pemrograman Lanjut
17
Praktikum Pemrograman Lanjut
18
Bab
3
Encapsulation
Enscapsulation (terkadang disebut sebagai Information Hiding) adalah kunci konsep dari bekerja dengan object. Secara format, encapsulation adalah tidak lebih dari kombinasi dari data dan method pada paket suatu class dan menyembunyikan implementasi detail dari user terhadap suatu object. Memahami sifat encapsulation harus mengerti access modifier. Terdapat 4 access modifier pada OOP yaitu :
Private hanya dapat diakses oleh class itu sendiri
Public dapat diakses dari mana pun
Protected dapat diakses dari package dan sub class
Default – no modifier – hanya dapat diakses di dalam package saja
Access
Class tersebut
Package
Subclass
Root / Network
Modifier Private
v
Default
v
v
Protected
v
v
v
Public
v
v
v
v
Kunci dari encapsulastion adalah tidak memberikan akses secara langsung kepada class lain atau program lain kecuali melalui suatu method-method yang ssudah diberikan. Hal ini menunjukkan bahwa sifat encapsulation pada suatu class sebagai “black box” dilihat dari class lainnya. Class lain hanya melihat interface (cara menggunakan method dari class tersebut). Keuntungan ini memberikan kemampuan desain OOP yang reusable dan reliable.
Praktikum Pemrograman Lanjut
19
Perhatikan class Employee berikut ini : employee.java 1 import java.util.Date; 2 import java.text.SimpleDateFormat; 3 4 public class employee 5 { 6 private String name; 7 private double salary; 8 private Date hireDay; 9 10 public employee(String n, double s, int year, int month, int day) 11 { 12 name=n; 13 salary=s; 14 GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); 15 hireDay = calendar.gettime(); 16 } 17 18 public double getSalary() 19 { 20 return salary; 21 } 22 23 public String getName() 24 { 25 return name; 26 } 27 28 public Date getHireDay() 29 { 30 return hireDay; 31 } 32 33 public void raiseSalary(double byPercent) 34 { 35 double raise = salary * byPercent / 100; 36 salary += raise; 37 } 38 39 53 }
Perhatikan method-method dari class Employee yaitu : getName, getSalary, dan getHireDay. Method-method ini adalah accessor method karena method tersebut mengembalikan nilai data dengan sederhana.
Tetapi, tidak kah lebih sederhana jika data name, salary, dan hireDay dibuat
public
daripada harus membuat accessor method secara terpisah?
Data name bersifat read-only. Sekali nilai data name diberikan pada saat constructor dijalankan maka hal ini menjamin data akan terjaga. Sedangkan untuk data salary tidak bersifat read-only. Oleh sebab itu data salary dapat diubah melalui method raiseSalary. Jika
Praktikum Pemrograman Lanjut
20
data salary dibuat public maka akan memberikan peluang akses yang dapat menimbulkan permasalahan tersendiri. Oleh sebab itu method raiseSalary sekaligus sebgaiai filter untuk perubahan data salary yang valid. Keuntungan sifat encapsulation yang dapat menyembuyikan data ini disebut sebagai information Hiding. Secara singkat information Hiding dapat dinyatakan dengan 3 hal.
Membuat data bersifat private
Memberikan accessor method (getter)
Memberikan mutator method (setter)
PENDEKLARASIAN ACCESS MODIFIER
1. CLASS Pada class, access modifier yang dapat digunakan hanyalah Public dan Default, kecuali dalam inner class dapat menggunakan seluruh access modifier.
[ACCESS MODIFIER] NamaClass { // TODO code application logic here }
2. ATRIBUT Pada atribut, dapat menggunakan seluruh access modifier.
[ACCESS MODIFIER] TIPE_ATRIBUT nama_atribut;
3. METHOD Pada method, dapat menggunakan seluruh access modifier. [ACCESS MODIFIER] TIPE_METHOD NamaMethod (){ // TODO code application logic here } ATAU [ACCESS MODIFIER] nama_paramater){
TIPE_METHOD
NamaMethod
(TIPE_DATA_PARAMETER
// TODO code application logic here }
Praktikum Pemrograman Lanjut
21
Soal 3.1 (Vehicle1.java dan TestVehicle1.java) Buatlah class Vehicle1 dan TestVehicle1 seperti source code dibawah ini : 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
public class Vehicle1 {
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
public class TestVehicle1{ public static void main(String[] args){
private double load, maxLoad; public Vehicle1 (double max){ this.maxLoad = max; } public double getLoad(){ return this.load; } public double getMaxLoad(){ return this.maxLoad; } public boolean addBox(double weight){ double temp = 0.0D; temp = this.load + weight;
if(temp <= maxLoad){ this.load = this.load + weight; return true; } else { return false; } } }
System.out.println("Creating a vehicle with a 10,000 kg maximum load."); Vehicle1 vehicle = new Vehicle1(10000); System.out.println("Add box System.out.println("Add box System.out.println("Add box System.out.println("Add box System.out.println("Add box System.out.println("Vehicle } }
Praktikum Pemrograman Lanjut
#1 (500kg) : " + vehicle.addBox(500)); #2 (250kg) : " + vehicle.addBox(250)); #3 (5000kg) : " + vehicle.addBox(5000)); #4 (4000kg) : " + vehicle.addBox(4000)); #5 (300kg) : " + vehicle.addBox(300)); load is " +vehicle.getLoad() + "kg");
22
1. Method apakah yang menjadi accessor (getter) ? 2. Apakah output dari program tersebut ? 3. Tambahkan source kode berikut dibawah baris ke 6 pada class TestVehicle1. System.out.println("Add load(100kg) : " + (vehicle.load=500));
Jalankan program, apakah output dari program tersebut? Kembalikan program seperti semula. 4. Ubahlah tipe data pada atribut load dan maxload pada class Vehicle1 menjadi public. Jalankan program, apakah output dari program tersebut? a. Tambahkan source kode berikut dibawah baris ke 6 pada class TestVehicle1. System.out.println("Add load(100kg) : " + (vehicle.load=500));
Jalankan program, apakah output dari program tersebut? Kembalikan program seperti semula. b. Tambahkan source kode berikut dibawah baris ke 12 pada class TestVehicle1. System.out.println("Add load(100kg) : " + (vehicle.load=500));
Jalankan program, apakah output dari program tersebut? Kembalikan program seperti semula. 5. Ulangi instruksi pada nomer 4 dengan mengubah tipe data pada atribut load dan maxload pada class Vehicle1 menjadi protected. 6. Ulangi instruksi pada nomer 4 dengan mengubah tipe data pada atribut load dan maxload pada class Vehicle1 menjadi default. 7. Tuliskan kesimpulan dari percobaan yang telah dilakukan mulai dari no 3 – 6 !
Praktikum Pemrograman Lanjut
23
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
24
Praktikum Pemrograman Lanjut
25
Praktikum Pemrograman Lanjut
26
Praktikum Pemrograman Lanjut
27
Praktikum Pemrograman Lanjut
28
Bab
4
Inheritance
Inheritance memugkinkan untuk membuat sebuah obyek dari obyek lain yang sudah ada sebelumnya. Dengan inheritance, kita bisa menggunakan kembali atau mengganti method dari class yang ada, juga menambahkan field instan juga methode yang baru. Bentuk umum dari inheritance di Java adalah sebagai berikut : public class <derived_class> extends { //body of class }
Berikut merupakan contoh penurunan class manager dari class employee. Class manager selain dapat memakai beberapa method instan dari class employee, juga masih mempertahankan semua field dari kelas semula. Disini terdapat tiga kelas, yaitu employee, manager dan employeedemo employee.java 1 import java.util.Date; 2 import java.text.SimpleDateFormat; 3 4 public class employee 5 { 6 private String name; 7 private double salary; 8 Date hdate; 9 10 public employee(String n,double s, Date d) 11 { 12 name=n; 13 salary=s; 14 Hdate = d; 16 } 17 18 public double getSalary() 19 { 20 return salary; 21 } 22 23 public String gstName() 24 { 25 return name; 26 } 27 28 public void print() 29 { 30 Date today = new Date(); 31 SimpleDateFormat format= new SimpleDateFormat("dd MMMM yyyy"); 32 String s = format.format(hdate); 33 System.out.println(" Nama : " + name); 34 System.out.println(" Tanggal masuk : " + s);
Praktikum Pemrograman Lanjut
29
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
System.out.println(" Gaji pokok : $ " + salary); System.out.println(" Lama kerja : " + (today.getYear() hdate.getYear())+ " Tahun"); } public void printSalary() { System.out.println(" }
Gaji sekarang : $ " + salary);
public int hYear() { return hdate.getYear(); } public void raiseSalary(double r) { salary *=1+ r/100; } }
Manager.java 1 import java.util.Date; 2 3 public class manager extends employee 4 { 5 public manager(String n,double s, Date d) 6 { 7 super(n,s,d); 8 } 9 10 public void raiseSalary(double r) 11 { 12 Date today = new Date(); 13 double bonus= 0.5 * (today.getYear() - hYear()); 14 super.raiseSalary(r+bonus); 16 } 17 }
Perhatikan perluasan method raiseSalary pada class manager dengan menambahkan bonus (baris 13) dan pemanggilan method raiseSalary pada base class. (baris 14). Employeedemo.java 1 import java.util.*; 2 3 public class employeedemo 4 {public static void main(String[] args) 5 { 6 employee[] staff=new employee[3]; 7 manager boss = new manager("Dumbledore",5000, new Date(55,6,10));; 8 9 staff[0]=new employee("Harry",750,new Date(60,3,12)); 10 staff[1]=new employee("Hermione",1000,new Date(65, 6,17)); 11 staff[2]=new employee("Ron",800, new Date(70,7,11)); 12 13 System.out.println("Data pegawai sebelum ada kenaikan gaji : " ); 14 System.out.println("Manajer : " ); 16 boss.print(); 17 boss.raiseSalary(5); 18 boss.printSalary(); 19 20 for (int i=0;i<staff.length;i++) 21 {
Praktikum Pemrograman Lanjut
30
22 23 24 25 26 27 28
System.out.println("Staff ke " + (i+1) + " : "); staff[i].print(); staff[i].raiseSalary(5); staff[i].printSalary(); } } }
Soal 4.1 (programmer.java) Buatlah class Programmer yang inherit class employee dengan ketentuan kenaikan gaji sebagai berikut : Jika masa kerja dibawah 1 tahun : tidak ada perubahan (sama dengan employee) Jika masa kerja 1- 10 tahun , ada tambahan bonus sebesar 0.01 dari lama kerja Jika masa kerja diatas 10 tahun, ada tambahan bonus sebesar 0.02 dari lama kerja
Soal 4.2 (direktur.java) Buatlah class direktur yang inherit class employee dengan ketentuan kenaikan gaji sebagai berikut : Selain bonus sebesar 0.5 dari lama kerja , juga mendapat tunjangan sebesar 0.1 dari lama kerja
Praktikum Pemrograman Lanjut
31
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
32
Praktikum Pemrograman Lanjut
33
Praktikum Pemrograman Lanjut
34
Praktikum Pemrograman Lanjut
35
Praktikum Pemrograman Lanjut
36
Bab
5 5.1
Polymorphism
Kelas Abstrak
Dengan kelas abstrak memungkinkan untuk membuat method tanpa mendefinisikan method tersebut. Hal ini bermanfaat kalau kita tahu kelas dalam program kita harus memberikan operasi tertentu, tetapi spesifikaasi operasi tersebut dapat berbeda-beda antara satu subelas dengan subkelas yang lainnya. Dalam Java kita bisa mendefinisikan method semacam ini dengan kata kunci abstract, untuk menunjukkan bahwa methode tersebut belum dispesifikasikan. Kelas dengan satu atau lebih method abstrak dengan sendirinya harus dinyatakan abstrak. Contoh pada program berikut adalah pendefinisian kelas dan method abstrak untuk class Shape, dimana kelas Shape memiliki data berupa Point yang menunjukkan titik koordinat(x,y) dan Color yang menunjukkan tingkat RGB dari warna serta memiliki methode Abstrak untuk menghitung luas, keliling dan cetak. Shape.java 1 public 2 { 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
abstract class Shape private Color color; private Point origin; protected Shape(Color col, Point org) { origin = new Point(org.getX(), org.getY()); Color = new Color(col.getR(),col.getG(), col.getB()); } protected Shape(Point org) { origin = new Point(org.getX(), org.getY()); color = new Color(0,0,0); } protected Shape() { origin = new Point(0.0, 0.0); color = new Color(0,0,0); } public abstract double area(); public abstract double perimeter(); public abstract void print(); public Color getColor() { return color; } public void setColor(Color col)
Praktikum Pemrograman Lanjut
37
35 36 37 38 39 40 41 42 43 44 45 46 47 48
{ color.setRGB(col.getR(), col.getG(), col.getB()); } public Point getOrigin() { return origin; } public void setOrigin(Point org) { origin.setPoint(org.getX(), org.getY()); } }
Method Abstrak dari kelas Shape mempunyai implementasi yang berbeda-beda ketika diimplementasikan pada kelas turunannya, yaitu kelas Circle dan Rectangle. Circle.java 1 public class Circle extends Shape 2 { 3 private double radius; 4 5 public Circle() 6 { 7 super(); 8 radius = 0.0; 9 } 10 11 public Circle(final Point org, final double rad) 12 { 13 super(org); 14 radius = rad; 16 } 17 18 public double getRadius() 19 { 20 return radius; 21 } 22 23 public void setRadius(double r) 24 { 25 radius = r; 26 } 27 28 public double area() 29 { 30 return Math.PI * radius * radius; 31 } 32 33 public double perimeter() 34 { 35 return 2 * Math.PI * radius; 36 } 37 38 public void print() 39 { 40 System.out.println("Lingkaran :"); 41 System.out.println(" Pusat -> X : " + super.getOrigin().getX() + ", Y : " + super.getOrigin().getY()); 42 System.out.println(" Radius : " + radius); 43 System.out.println(" Luas : " + (Math.PI * radius * radius)); 44 System.out.println(" Keliling : " + (2 * Math.PI * radius));
Praktikum Pemrograman Lanjut
38
45
46 47
System.out.println(" Warna R : " + super.getColor().getR() + ", G : " + super.getColor().getG() + ", B : " + super.getColor().getB()); } }
Rectangle.java 1 public class Rectangle extends Shape 2 { 3 private double height; 4 private double width; 5 6 public Rectangle() 7 { 8 super(); 9 height = 0.0; width = 0.0; 10 } 11 12 public Rectangle(Point org, double h, double w) 13 { 14 super(org); 16 height = h; width = w; 17 } 18 19 public double area() 20 { 21 return height * width; 22 } 23 24 public double getH() 25 { 26 return height; 27 } 28 29 public double getW() 30 { 31 return width; 32 } 33 34 public void setHW(double h, double w) 35 { 36 height = h; width = w; 37 } 38 39 public double perimeter() 40 { 41 return 2 * (height + width); 42 } 43 44 public void print() 45 { 46 System.out.println("Segi Empat:"); 47 System.out.println(" P : " + width + ", L : " + height); 48 System.out.println(" Luas : " + (height * width)); 49 System.out.println(" Keliling : " + (2 * (height + width))); 50 System.out.println(" Nilai X : " + super.getOrigin().getX() + ", Y : " + super.getOrigin().getY()); 51 System.out.println(" Warna R : " + super.getColor().getR() + ", G : " + super.getColor().getG() + ", B : " + super.getColor().getB()); 52 } 53 }
Praktikum Pemrograman Lanjut
39
ShapeDemo.java 1 public class ShapeDemo 2 { 3 public static void main(String [] args) 4 { 5 Point p = new Point(5,9); 6 Color co = new Color (10,10,10); 7 Circle c = new Circle(p,6); 8 Rectangle r = new Rectangle(p,5,8); 9 10 System.out.println("Luas Segiempat mula-mula:"+r.area()+"\n"); 11 System.out.println("Keliling Segiempat mula-mula : " + r.perimeter()+ "\n"); 12 13 r.setHW(20.6 , 10.3); 14 r.print(); 16 System.out.println(); 17 18 System.out.println("Luas Lingkaran mula-mula:"+c.area()+"\n"); 19 System.out.println("Keliling Lingkaran mula-mula : " + c.perimeter()+ "\n"); 20 21 c.setRadius(5.8); 22 c.setColor(co); 23 c.print(); 24 25 } 26 }
Soal 5.1 (employeePoly) Implementasikan polymorphism pada class employee (pada bab sebelumnya) sehingga methode raiseSalary() dan print() menjadi method abstrak : employeePoly.java 1 import java.util.Date; 2 import java.text.SimpleDateFormat; 3 4 public abstract class employee 5 { 6 private String name; 7 Date hdate; 8 9 //konstruktor 10 public employeePoly(String n, Date d) 11 12 //method-methode untuk set dan get variable 13 14 public int hYear() 16 { 17 return hdate.getYear(); 18 } 19 20 public abstract void print(); 21 public abstract void raiseSalary(double persen) 22 23 }
Praktikum Pemrograman Lanjut
40
Soal 5.2 (staff.java) Buatlah class staff yang inherit class employee dengan ketentuan sebagai berikut : Terdapat variable tambahan salary dengan tipe double Jika masa kerja dibawah 1 tahun, kenaikan gaji dihitung : salary *=1+ persen/100;
Jika masa kerja 1- 10 tahun , ada tambahan bonus sebesar 0.01 dari lama kerja Jika masa kerja diatas 10 tahun, ada tambahan bonus sebesar 0.02 dari lama kerja
Soal 5.3 (manager.java) Buatlah class direktur yang inherit class employee dengan ketentuan kenaikan gaji sebagai berikut : Selain bonus sebesar 0.5 dari lama kerja , juga mendapat tunjangan sebesar 0.1 dari lama kerja
Praktikum Pemrograman Lanjut
41
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
42
Praktikum Pemrograman Lanjut
43
Praktikum Pemrograman Lanjut
44
Praktikum Pemrograman Lanjut
45
Praktikum Pemrograman Lanjut
46
Bab
6
Interface
6.1 Deklarasi Interface Dengan polimorphism hanya memungkinkan untuk mewarisi sifat dari satu kelas abstrak saja. Namun kadangkala diperlukan untuk mewarisi sifat dari lebih dari satu kelas abstrak. Kemampuan ini disebut dengan multiple inheritance. Dalam Java, sebuah class hanya bisa mewarisi sifat dari sebuah superclass (disebut sebagai single inheritance) dan tidak mendukung prinsip multiple inheritance. Namun demikian, untuk mendekati prinsip multiple inheritance ini, dalam Java terdapat Interfaces yang memiliki efek seperti multiple inheritance. Berbeda dengan kelas abstrak, sebuah interface hanya memiliki konstanta dan method abstrak. Syntaks untuk mendeklarasikan interface diawali dengan kata kunci interface seperti terlihat pada contoh berikut: modifier interface InterfaceName { /** Konstanta */ /** Method abstrak */ }
Contoh pada program berikut adalah pendefinisian interface Eatable, dimana interface ini hanya memiliki sebuah method abstrak howToEat. public interface Eatable { public String howToEat(); }
6.2 Implementasi Interface Sebuah kelas dapat mengimplementasikan sebuah interface dengan menggunakan kata kunci implements. Program berikut adalah contoh implementasi interface Eatable pada kelas Fish1. Fish1.java 1 class Fish1 implements Eatable { 2 int weight; 3 4 public Fish1(int w) { 5 weight = w; 6 } 7 8 public String howToEat() { 9 10 String st = "Dengan cara menggoreng atau membuat ikan baker"; 11 return st; 12 } 13 }
Praktikum Pemrograman Lanjut
47
Kelas Fish1 mengimplementasikan method howToEat pada interface Eatable. Program berikut adalah contoh kelas yang melakukan instansiasi kelas Fish1. Fish1Demo.java 1 public class Fish1Demo 2 { 3 public static void main(String [] args) 4 { 5 Fish ikan = new Fish(3); 6 7 System.out.println("Cara makan ikan:"+ikan.howToEat()); 8 9 } 10 }
Jalankan program diatas dan perhatikan hasil dari eksekusi program. Dari contoh program diatas, kemudian jelaskan perbedaan antara polimorphism dan interface. Program berikut adalah contoh lain deklarasi dan penggunaan interface. Pada contoh ini terdapat interface Comparable yang dapat digunakan untuk membandingkan dua buah obyek. public interface Comparable { public boolean compareTo(Object obj); }
Interface Comparable ini diimplementasikan oleh kelas Rectangle dengan jalan mengimplementasikan method compareTo(Object obj)yang dideklarasi dalam interface Comparable. Rectangle.java 1 public class Rectangle implements Comparable 2 { 3 4 private double height; 5 private double width; 6 7 public Rectangle() 8 { 9 height = 0.0; width = 0.0; 10 } 11 12 public Rectangle(double h, double w) 13 { 14 height = h; width = w; 16 } 17 18 19 public double getH() 20 { 21 return height; 22 } 23 24 public double getW() 25 { 26 return width; 27 }
Praktikum Pemrograman Lanjut
48
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
public void setHW(double h, double w) { height = h; width = w; } public double area() { return height * width; } public double perimeter() { return 2 * (height + width); } public {
void print() System.out.println("Segi Empat:"); System.out.println(" P : " + width + ", L : " + height); System.out.println(" Luas : " + area()); System.out.println(" Keliling : " + perimeter());
} public boolean compareTo(Object obj) { if (area() == ((Rectangle)obj).area()) return true; else return false; } }
Program berikut adalah contoh kelas yang melakukan instansiasi kelas Rectangle. Rectangle.java 1 public class RectangleDemo 2 { 3 public static void main(String [] args) 4 { 5 Rectangle rect1 = new Rectangle(7,5); 6 Rectangle rect2 = new Rectangle(5,4); 7 8 System.out.println("Luas bidang1 : "+ rect1.area() ); 9 System.out.println("Luas bidang2 : "+ rect2.area() ); 10 System.out.println("Hasil pembandingan : "+ rect1.compareTo(rect2)); 11 } 12 }
6.3 Implementasi Multiple Interface Seperti telah dijelaskan diatas, bahwa sebuah kelas bisa mengimplementasikan lebih dari satu
interface.
Pada
mengimplementasikan
contoh interface
berikut Eatable
akan
dideklarasikan
kelas
Fish
dan
Comparable2.
Adapun
yang
interface
Comparable2 dideklarasikan sebagai berikut:
Praktikum Pemrograman Lanjut
49
public interface Comparable2 { public double compareTo(Object obj); }
Deklarasi kelas Fish yang mengimplementasikan interface Eatable dan Comparable2 ditunjukkan pada program berikut. Fish.java 1 public 2 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 }
class Fish implements Eatable, Comparable2 { int weight; public Fish(int w) { weight = w; } public String howToEat() { String st = "Dengan menggoreng atau membuat ikan bakar"; return st; } public double compareTo(Object obj) { return (Math.abs(weight - ((Fish)obj).weight)); }
Program berikut adalah contoh kelas yang melakukan instansiasi kelas Fish. FishDemo.java 1 public class FishDemo 2 { 3 public static void main(String [] args) 4 { 5 Fish ikan1 = new Fish(3); 6 Fish ikan2 = new Fish(5); 7 8 System.out.println("Cara makan ikan : "+ikan1.howToEat()); 9 System.out.println("Beda berat kedua ikan : "+ ikan1.compareTo(ikan2)); 10 } 11 }
6.3 Penggunaan Pewarisan dan Interface Sebuah kelas bisa mewarisi sifat dari kelas induk dan sekaligus mengimplementasikan interface. Berikut adalah contoh implementasi kelas ComparableRectangle2
yang
mewarisi sifat dari kelas Rectangle dan mengimplementasikan interface Comparable. ComparableRectangle2.java 1 public class ComparableRectangle2 extends Rectangle2 implements Comparable 2 { 3 public ComparableRectangle2(double w, double h) { 4 super(w, h); 5 } 6 7 public boolean compareTo(Object obj) 8 { 9 if (area() == ((ComparableRectangle2)obj).area()) 10 return true; 11 Else
Praktikum Pemrograman Lanjut
50
12 13 14
return false; } }
Program berikut adalah ComparableRectangle2.
contoh
kelas
yang
melakukan
instansiasi
kelas
ComparableRectangleDemo.java 1 public class ComparableRectDemo 2 { 3 public static void main(String [] args) 4 { 5 ComparableRectangle2 rect1 = new ComparableRectangle2(7,5); 6 ComparableRectangle2 rect2 = new ComparableRectangle2(5,7); 7 8 System.out.println("Luas bidang1 : "+ rect1.area() ); 9 System.out.println("Luas bidang2 : "+ rect2.area() ); 10 11 if (rect1.compareTo(rect2)== true) 12 System.out.println("Luas kedua bidang sama"); 13 else 14 System.out.println("Luas kedua bidang tidak sama"); 16 } 17 }
Soal 6.1 Deklarasikan kelas selain kelas Fish yang mengimplementasikan interface Eatable.
Soal 6.2 Buatlah interface Colorable yang memiliki method dengan nama howToColor(). Kemudian implementasikan interface ini pada kelas Rectangle, dimana method howToColor() digunakan untuk memberikan warna dari bangun.
Soal 6.3 Buatlah program melakukan instansiasi kelas dari soal 6.1 dan soal 6.2.
Praktikum Pemrograman Lanjut
51
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
52
Praktikum Pemrograman Lanjut
53
Praktikum Pemrograman Lanjut
54
Praktikum Pemrograman Lanjut
55
Praktikum Pemrograman Lanjut
56
Praktikum Pemrograman Lanjut
57
Praktikum Pemrograman Lanjut
58
Praktikum Pemrograman Lanjut
59
Bab
7
Graphic User Interface
Dengan Java, memungkinkan untuk membuat tampilan User Interface dengan memanfaatkan paket-paket GUI yang telah disediakan. Salah satu paket yang biasa digunakan adalah AWT (Abstract Window Toolkit), dimana dengan AWT kita bisa membuat berbagai prasarana dasar sepeti tombol, field input,label dll dan kemudian membuat program interface untuk menanggapi berbagai event. Berikut adalah contoh program penggunaan paket java.awt untuk merancang form sederhana perhitungan Luas.
TFrame.java 1 import java.awt.*; 2 import java.awt.event.*; 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28
public class TFrame extends Frame { Label lbJudul; Label lbPanjang; Label lbLebar; Label lbLuas; TextField txtPanjang; TextField txtLebar; TextField txtLuas; Button btnOK;
public TFrame() { setLayout(null); lbJudul = new Label("Hitung Luas SegiEmpat"); lbJudul.setFont(new Font("Arial", 1, 14)); add(lbJudul); lbJudul.setBounds(100, 30, 170, 20); lbPanjang = new Label("Panjang :"); add(lbPanjang); lbPanjang.setBounds(100, 60, 62, 20);
Praktikum Pemrograman Lanjut
60
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
lbLebar = new Label ("Lebar :"); add(lbLebar); lbLebar.setBounds(100, 90, 70, 20); lbLuas = new Label("Hasil :"); add(lbLuas); lbLuas.setBounds(100, 120, 70, 20); txtPanjang = new TextField("0"); add(txtPanjang); txtPanjang.setBounds(200, 60, 60, 20); txtLebar= new TextField("0"); add(txtLebar); txtLebar.setBounds(200, 90, 60, 20); txtLuas= new TextField("0"); add(txtLuas); txtLuas.setBounds(200, 120, 60, 20); btnOK = new Button("Hitung"); add(btnOK); btnOK.setBounds(120,150,100,20); btnOK.addActionListener(new mainAction()); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } class mainAction implements ActionListener { public void actionPerformed( ActionEvent event) { int p1 = Integer.parseInt(txtPanjang.getText().trim()); int l1 = Integer.parseInt(txtLebar.getText().trim()); String luas = String.valueOf(p1*l1); txtLuas.setText(luas); } } }
Program berikut adalah contoh instansiasi dari kelas TFrame dimana window di-set dengan ukuran 350x200 piksel. mainLuas.java 1 public class mainLuas 2 { 3 public static void main(String args[]) 4 { 5 TFrame window = new TFrame(); 6 7 8 9 10 11
window.setTitle("Hitung Luas dengan GUI Java.awt"); window.setSize(350,200); window.show(); } }
Praktikum Pemrograman Lanjut
61
Jalankan program diatas. Amati penggunaan listener untuk buttonOK (baris 53) yang mengimplementasikan interface ActionListener untuk menjalankan event tertentu.
Contoh program dibawah adalah modifikasi program sebelumnya dengan memanfaatkan komponen checkbox untuk melakukan pemilihan aksi.
TFrame2.java 1 import java.awt.*; 2 import java.awt.event.*; 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
public class TFrame2 extends Frame { TextField txtPanjang, txtLebar,txtLuas; CheckboxGroup cbg; Checkbox cbL,cbK; Label lbJudul,lbPanjang,lbLebar,lbLuas; public TFrame2() { setLayout(null); lbJudul = new Label("Hitung Luas dan Keliling"); lbJudul.setFont(new Font("Arial", 1, 14)); add(lbJudul); lbJudul.setBounds(100, 30, 170, 20); lbPanjang = new Label("Panjang :"); add(lbPanjang); lbPanjang.setBounds(100, 80, 62, 20); lbLebar = new Label ("Lebar :"); add(lbLebar); lbLebar.setBounds(100, 120, 70, 20); lbLuas = new Label("Hasil :"); add(lbLuas); lbLuas.setBounds(100, 150, 70, 20); txtPanjang = new TextField("0"); add(txtPanjang); txtPanjang.setBounds(200, 80, 60, 20); txtLebar= new TextField("0"); add(txtLebar); txtLebar.setBounds(200, 120, 60, 20); txtLuas =
new TextField("0");
Praktikum Pemrograman Lanjut
62
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
add(txtLuas); txtLuas.setBounds(200, 150, 60, 20); cbg = new CheckboxGroup(); cbL = new Checkbox("Luas",cbg, false); this.add(cbL).setBounds(90, 190, 100, 20); cbK = new Checkbox("Keliling",cbg, false); this.add(cbK).setBounds(200, 190, 100, 20); cbL.addItemListener(new mainAction()); cbK.addItemListener(new mainAction());
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } //ItemListener class mainAction implements ItemListener { public void itemStateChanged(ItemEvent ev) { int p1 = Integer.parseInt (txtPanjang.getText().trim()); int l1 = Integer.parseInt (txtLebar.getText().trim());
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
Object source = ev.getItemSelectable(); if (source == cbL) { txtLuas.setText(String.valueOf(p1*l1)); } else if (source == cbK) { txtLuas.setText(String.valueOf(2* (p1+l1))); } } } }
mainLuas2.java 1 public class mainLuas2 2 { 3 public static void main(String args[]) 4 { 5 TFrame2 window2 = new TFrame2(); 6 7 8 9 10 11
window2.setSize(400,250); window2.setVisible(true); window2.show(); } }
Praktikum Pemrograman Lanjut
63
Soal 7.1 (HitungGaji.java) Buatlah program untuk menghitung gaji karyawan dengan tampilan seperti berikut.
Adapun ketentuan penghitungan bonus dan tunjangan adalah sebagai berikut : Gaji Pokok Staff : 1.000.000 Manager : 5.000.000 Direktur : 10.000.000 Bonus : Staff jika lama kerja < 1 th = 0 Jika lama kerja 1 – 10 th = 5% * gaji_pokok jika lama kerja > 10 th = lama_kerja/100 * gaji_pokok
Manager (5% + ((lama_kerja / 100 )) * gaji_pokok Direktur (10% + ((lama_kerja / 100 )) * gaji_pokok
Tunjangan : Staff Manager Direktur
: 0 : 5% * gaji_pokok : 10% * gaji_pokok
Praktikum Pemrograman Lanjut
64
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
65
Praktikum Pemrograman Lanjut
66
Praktikum Pemrograman Lanjut
67
Praktikum Pemrograman Lanjut
68
Praktikum Pemrograman Lanjut
69
Praktikum Pemrograman Lanjut
70
Praktikum Pemrograman Lanjut
71
Praktikum Pemrograman Lanjut
72
Bab
Graphic User Interface Lanjut
8
Selain dengan memanfaatkan paket java.awt, untuk membuat user interface di Java juga bisa memanfaatkan paket javax.swing. Pada contoh berikut merupakan pemanfaatan komponen jtable untuk membuat user interface untuk menampilkan data dalam bentuk tabel.
TableData.java 1 import javax.swing.*; 2 import javax.swing.table.AbstractTableModel; 3 import javax.swing.table.TableColumn; 4 import java.awt.*; 5 import java.awt.event.*; 6 7 8 9 10 11 12 13 14 16
public class TableData extends JFrame { public TableData() { super("Contoh penggunaan jtable"); MyTableModel myModel = new MyTableModel(); JTable table = new JTable(myModel); table.setPreferredScrollableViewportSize(new Dimension(500, 70));
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
JScrollPane scrollPane = new JScrollPane(table); getContentPane().add(scrollPane, BorderLayout.CENTER); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } } class MyTableModel extends AbstractTableModel { final String[] columnNames = {"ID", "Name","Address","Sex"}; final Object[][] data = { {"S001","Mariana","Malang",new Boolean(false)}, {"S002","Tatiana","Surabaya",new Boolean(false)}, {"S003","Harry","Jakarta",new Boolean(true)}, {"M001","Zakhy","Bandung",new Boolean(true)}, {"D001","Angela","Bogor",new Boolean(false)}
Praktikum Pemrograman Lanjut
73
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
}; public int getColumnCount() { return columnNames.length; } public int getRowCount() { return data.length; } public String getColumnName(int col) { return columnNames[col]; } public Object getValueAt(int row, int col) { return data[row][col]; } public Class getColumnClass(int c) { return getValueAt(0, c).getClass(); } public boolean isCellEditable(int row, int col) { if (col < 3) { return true; } else { return false; } } }
TableDataDemo.java 1 public class TableDataDemo 2 { 3 public static void main(String[] args) 4 { 5 TableData frame = new TableData(); 6 frame.pack(); 7 frame.setVisible(true); 8 } 9 }
Contoh berikut adalah pengembangan dari contoh diatas dengan menambahkan button untuk menambah dan menghapus baris. Pada saat dijalankan default table adalah null (tidak ada isi pada tabel).
Perhatikan keyword implements pada baris 8, dimana sebuah kelas bisa mengimplementasikan lebih dari satu interface. Hal ini mendekati fungsi pewarisan ganda.
Praktikum Pemrograman Lanjut
74
TableAdd.java 1 import javax.swing.*; 2 import java.awt.*; 3 import java.awt.event.*; 4 import javax.swing.table.*; 5 import java.util.*; 6 import javax.swing.event.*; 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
class {
TableAdd implements ActionListener, TableModelListener JFrame frame; JTable table; Vector rows,columns; DefaultTableModel tabModel; JScrollPane scrollPane; JLabel lblMessage; JButton cmdAdd,cmdDelete,cmdSetValue,cmdGetValue; JPanel mainPanel,buttonPanel; TableAdd() { rows=new Vector(); columns= new Vector(); String[] columnNames = { "ID", "Name", "Address", "Sex", }; addColumns(columnNames); tabModel=new DefaultTableModel(); tabModel.setDataVector(rows,columns); table = new JTable(tabModel); scrollPane= new JScrollPane(table); table.setRowSelectionAllowed(false); table.getModel().addTableModelListener(this); lblMessage=new JLabel(""); buttonPanel=new JPanel(); cmdAdd=new JButton("Add Row"); cmdDelete=new JButton("Delete") ; buttonPanel.add(cmdAdd); buttonPanel.add(cmdDelete); cmdAdd.addActionListener(this); cmdDelete.addActionListener(this); mainPanel=new JPanel(); frame=new JFrame("Simple Table Example"); frame.setSize(800,600); frame.setExtendedState(JFrame.MAXIMIZED_BOTH); mainPanel.setLayout(new BorderLayout()); mainPanel.add("Center",scrollPane); mainPanel.add("South",buttonPanel); mainPanel.setBackground(Color.white); buttonPanel.setBackground(Color.white); table.getParent().setBackground(Color.white); frame.getContentPane().add(mainPanel); frame.setVisible(true);
Praktikum Pemrograman Lanjut
75
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 222 123 124 125 126 127 128 129 130 131 132 133 134
} public void addColumns(String[] colName) { for(int i=0;i
Praktikum Pemrograman Lanjut
76
Soal 8.1 Modifikasi tabel contoh pada TableAdd.java sehingga tampilan awalnya adalah sebagai berikut :
Praktikum Pemrograman Lanjut
77
LEMBAR JAWABAN
Praktikum Pemrograman Lanjut
78
Praktikum Pemrograman Lanjut
79
Praktikum Pemrograman Lanjut
80
Praktikum Pemrograman Lanjut
81
Praktikum Pemrograman Lanjut
82
Praktikum Pemrograman Lanjut
83
Praktikum Pemrograman Lanjut
84
Praktikum Pemrograman Lanjut
85