China + Jawa + Sunda = Me :)

Masalah Saya Dengan Master-Detail di Bahasa Pemrograman Java

Posting baru artinya ada masalah baru :D , Kali ini berhubungan saya pemrograman Java, khususnya teknologi Swing (Salah satu teknologi Java GUI). Masalahnya sih sederhana aja. Yang biasa menggunakan bahasa Visual seperti Delphi, VB dan bahasa visual lainnya, mungkin akan bilang mudah untuk membuat Master Detail :D , sedangkan tidak dengan Java :D

So jadi intinya masalah yang saya hadapi adalah, gimana cara membuat sebuah master-detail di Java? Ada yang tau?

…..

*Berpikir Sejenak…

AHA!!!!!!!!!!! saya dapat ide :D , sepertinya kalo saya otak-atik di JTable akan sulit, jadi gimana kalo kita bermain dengan TableModel saya, sepertinya akan lebih mudah :D Anggap saja misal ada entitas Mahasiswa , dan setiap mahasiswa boleh mengambil MataKuliah lebih dari satu, tentunya :D Jadi disini, kita anggap Master-nya adalah Mahasiswa dan Detail-nya adalah MataKuliah. Kalo dibuat kelas entitasnya bisa seperti ini :

package khannedy.blogging.masterdetail.entity;

import java.io.Serializable;

public class MataKuliah implements Serializable {

 private String kode;
 private String nama;

 public String getKode() {
 return kode;
 }

 public void setKode(String kode) {
 this.kode = kode;
 }

 public String getNama() {
 return nama;
 }

 public void setNama(String nama) {
 this.nama = nama;
 }
}

package khannedy.blogging.masterdetail.entity;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Mahasiswa implements Serializable {

 public static enum JenisKelamin {
 LakiLaki, Perempuan
 }

 private String nim;
 private String namaDepan;
 private String namaBelakang;
 private Date tanggalLahir;
 private JenisKelamin jenisKelamin;
 private List<matakuliah> mataKuliahs = new ArrayList<matakuliah>();

 public boolean add(MataKuliah e) {
 return mataKuliahs.add(e);
 }

 public List getMataKuliahs() {
 return mataKuliahs;
 }

 public JenisKelamin getJenisKelamin() {
 return jenisKelamin;
 }

 public void setJenisKelamin(JenisKelamin jenisKelamin) {
 this.jenisKelamin = jenisKelamin;
 }

 public String getNamaBelakang() {
 return namaBelakang;
 }

 public void setNamaBelakang(String namaBelakang) {
 this.namaBelakang = namaBelakang;
 }

 public String getNamaDepan() {
 return namaDepan;
 }

 public void setNamaDepan(String namaDepan) {
 this.namaDepan = namaDepan;
 }

 public String getNim() {
 return nim;
 }

 public void setNim(String nim) {
 this.nim = nim;
 }

 public Date getTanggalLahir() {
 return tanggalLahir;
 }

 public void setTanggalLahir(Date tanggalLahir) {
 this.tanggalLahir = tanggalLahir;
 }
}

Sederhana saja, jangan terlalu kompleks, yang penting mengerti cara membuat Master-Detail di Java Swing. Dari kelas diatas, kita bisa liat kalo Mahasiswa dapat mengambil MataKuliah lebih dari satu, oleh karena itu, saya menggunakan List, agar MataKuliah dapat ditambah. Sekarang saatnya kita membuat TableModel nya, karena kita menggunakan 2 kelas entitas, yaitu kelas Mahasiswa dan kelas MataKuliah, jadi kita membaut 2 TableModel, yaitu TableModelMahasiswa dan TableModelMataKuliah, fungsinya tentunya sesuai namanya.

package khannedy.blogging.masterdetail.model;

import java.util.List;
import javax.swing.table.AbstractTableModel;
import khannedy.blogging.masterdetail.entity.Mahasiswa;

public class TableModelMahasiswa extends AbstractTableModel {

 private List<mahasiswa> list;

 public TableModelMahasiswa(List list) {
 this.list = list;
 }

 public List getList() {
 return list;
 }

 public int getRowCount() {
 return list.size();
 }

 public int getColumnCount() {
 return 5;
 }

 @Override
 public String getColumnName(int column) {
 switch (column) {
 case 0:
 return "Nim";
 case 1:
 return "Nama Depan";
 case 2:
 return "Nama Belakang";
 case 3:
 return "Tanggal Lahir";
 case 4:
 return "Jenis Kelamin";
 default:
 return null;
 }
 }

 public Object getValueAt(int rowIndex, int columnIndex) {
 switch (columnIndex) {
 case 0:
 return list.get(rowIndex).getNim();
 case 1:
 return list.get(rowIndex).getNamaDepan();
 case 2:
 return list.get(rowIndex).getNamaBelakang();
 case 3:
 return list.get(rowIndex).getTanggalLahir();
 case 4:
 return list.get(rowIndex).getJenisKelamin();
 default:
 return null;
 }
 }
}

Untuk TableModelMahasiswa, kita menggunakan konstruktor yang harus langsung di inisialisasikan isi datanya public TableModelMahasiswa(List<Mahasiswa> list) , ini kita anggap karena memang Mahasiswa adalah Master, jadi datanya kita anggap tidak akan berubah-rubah, berbeda dengan data MataKuliah yang menjadi Detail-nya.

package khannedy.blogging.masterdetail.model;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import khannedy.blogging.masterdetail.entity.MataKuliah;

public class TableModelMataKuliah extends AbstractTableModel {

 private List<matakuliah> list = new ArrayList<matakuliah>();

 public void setList(List list) {
 this.list = list;
 fireTableDataChanged();
 }

 public int getRowCount() {
 return list.size();
 }

 public int getColumnCount() {
 return 2;
 }

 @Override
 public String getColumnName(int column) {
 switch (column) {
 case 0:
 return "Kode";
 case 1:
 return "Nama";
 default:
 return null;
 }
 }

 public Object getValueAt(int rowIndex, int columnIndex) {
 switch (columnIndex) {
 case 0:
 return list.get(rowIndex).getKode();
 case 1:
 return list.get(rowIndex).getNama();
 default:
 return null;
 }
 }
}

Untuk TableModelMataKuliah, cara mengubah datanya adalah menggunakan metode public void setList(List<MataKuliah> list) tidak menggunakan konstruktor, hal ini seperti yang dituliskan diatas, bahwa MataKuliah adalah Detail-nya, jadi akan sering sekali berubah, sehingga tidak disarankan datanya di set di konstruktor, karena jika di konstruktor, maka saat ada Detail baru yang akan ditampilkan, maka TableModelMataKuliah yang baru akan dibuat, dan semakin banyak TableModelMataKuliah yang dibuat, maka memori akan membengkak. Berbeda jika menggunakan kode diatas, memori tidak akan bertambah karena kita tidak perlu membuat TableModelMataKuliah jika akan menampilkan Detail-MataKuliah yang baru.

Sekarang tinggal tahap penerapan, anggap saja saya sudah membuat design tampilan aplikasinya, lalu saya membuat 2 JTable, pertama bernama tabelMahasiswa untuk menampilkan data Mahasiswa dan kedua tabelMataKuliah untuk menampilkan data MataKuliah. Sekarang tinggal set Model untuk tabelMahasiswa menjadi TableModelMahasiswa dan set Model untuk tabelMataKuliah menjadi TableModelMataKuliah :

modelMahasiswa = new TableModelMahasiswa(service.getAllMahasiswa(100));
modelMataKuliah = new TableModelMataKuliah();

tabelMahasiswa.setModel(modelMahasiswa);
tabelMataKuliah.setModel(modelMataKuliah);

Setelah itu kita beri aksi, saat pengguna menseleksi satu buat baris di tabelMahasiswa, maka tabelMataKuliah akan menampilkan data MataKuliah yang diambil oleh Mahasiswa yang terseleksi di tabelMahasiswa :

tabelMahasiswa.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

 public void valueChanged(ListSelectionEvent e) {
  int selected = tabelMahasiswa.getSelectedRow();
   if (selected != -1) {
     Mahasiswa mahasiswa = modelMahasiswa.getList().get(selected);
     List<matakuliah> list = mahasiswa.getMataKuliahs();
     modelMataKuliah.setList(list);
   }
 }
});

Selesai, sekarang tinggal jalankan aplikasinya. Dibawah ini adalah tampilan dari aplikasinya :

Master-Detail

Master-Detail Java Programming

Silahkan download sourcecode lengkapnya disini :

http://bit.ly/9N5Jgb

Comments on: "Masalah Saya Dengan Master-Detail di Bahasa Pemrograman Java" (13)

  1. mantab juragan nambah ilmu plus nambah ide dalam penerapan aplikasi,.
    kekekkee :D
    lanjutgan

    • sama2 gan, semuga ilmu lo dan gw bertambah :D

  2. [...] baru Master-detail ! TableCellRenderer! Salah satu teman saya yaitu si echo punya masalah dan telah berhasil menyelesaikannya. Kalau gak salah masalah yang dihadapi adalah master-detail di [...]

  3. gan ajarin php donk

  4. Ada yg ingin saya tanyakan, ttg implementasi sebuah interface.
    pada class MataKuliah dan Mahasiswa mengimplementasi inteface Serializeable

    public class MataKuliah implements Serializable {
    }

    public class Mahasiswa implements Serializable {
    }

    dan, setelah saya lihat dari atas mpe bawah kedua class tersebut tdk ada method yg mengimplementasi method2 dari interface Serializeable. Maaf, mungkin saya kurang teliti melihatnya.

    Mengapa kita harus implements sebuah interface jika kt tdk membuat method2 dari interface yg kt implementasikan? Tp, sepertinya programnya jalan ya.. buktinya ada screenshotnya.

    Terimakasih :)

    • emang gak ada :D Serializable itu buat Serialization, kalo dah pernah belajar Sistem Basis Data pasti tau apa maksudnya :D

  5. Jempol buat mas Eko.
    mbahsomo punya; motto “Aku Bisa” :D

  6. thank you gan… nambah ilmu. saya lagi bingung klo data-nya Null gimana cara nanganinya. atau misalkan ada mahasiswa pernah ambil mata kuliah. sedangkan mungkin d sistem mata kuliah itu terhapus krn suatu hal (mungkin programnya yg jelek gak bs detect dependency… kekekek :) ). padahal kita bth tuh program ttp running. yg udah2 pas di run muncul gini:
    Exception in thread “AWT-EventQueue-0″ java.lang.NullPointerException

    dari pengalaman pribadi :) masih newbie di Java…
    ajarin untuk ngecek dependency, misal untuk hapus data tadi dan cara menangani Null. makasih.

  7. asahisoft said:

    Ini adalah Halaman Curhat.

    • tapi kan bermanfaat buat orang lain :D

  8. blog nya bagus mas, jangan lupa mampir ya di website saya.

  9. mas mau tanya ne..
    kalo mau bikin table yang bisa di kasih action gimana ya kaya aplikasi yang pake vb gitu..
    misal ada tabel barang di kolom nama barang kita ketikkan nama brang trus dienter bisa panggil data barang yang namanya mengandung string nama yg kita input…

    ..eh satu lagi mas..??
    ko button yang udah ditruh actionperformed ga ngelakuin action pass ditekan ENTER pdhal udah diset fokus ke button
    tersebut…

  10. Klo contoh simpan data yang master detail spt di atas ada ga yah, maklum masih hijau di java

Tinggalkan Balasan

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Ubah )

Twitter picture

You are commenting using your Twitter account. Log Out / Ubah )

Facebook photo

You are commenting using your Facebook account. Log Out / Ubah )

Connecting to %s