Masalah Saya Dengan Master-Detail di Bahasa Pemrograman Java


Posting baru artinya ada masalah baru πŸ˜€ , 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 πŸ˜€ , sedangkan tidak dengan Java πŸ˜€

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 πŸ˜€ , sepertinya kalo saya otak-atik di JTable akan sulit, jadi gimana kalo kita bermain dengan TableModel saya, sepertinya akan lebih mudah πŸ˜€ Anggap saja misal ada entitas Mahasiswa , dan setiap mahasiswa boleh mengambil MataKuliah lebih dari satu, tentunya πŸ˜€ 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

Iklan