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

Masalah Saya Dengan Video Dan Koneksi Internet Di Kosan


Hari ini banyak sekali masalah πŸ˜€

Setelah sebelumnya bermasalah dengan Musik, sekarang saya punya masalah lagi dengan Video dan Koneksi Internet. Lha apa hubungannya Video dan koneksi internet? Jelas ada! Begini masalahnya…

Saya bukan orang kaya, yang bisa berlangganan internet menggunakan paket yang 1 juta satu bulan πŸ˜€ Tapi kenyataannya saat ini saya berlangganan koneksi internet yang harga paketnya 1 juta πŸ˜€ Lho kok? Tenang-tenang… Saya mengambil paket 1 juta karena memang yang menggunakan internet bukan cuma saya, ada sekitar 9 orang, itu berarti 1 orang tidak akan membayar sampai 200 ribu πŸ˜€

Kembali lagi ke masalah! Kebiasaan anak mahasiswa saat ini kalo gak download lagu pastinya download video, bisa download dari youtube atau juga kalo mo cepet dari indowebster. Dan dikarenakan koneksi internet di kosan saya tidak menggunakan router, jadi pastinya bandwitdh nya rebutan, siapa cepat dia dapat πŸ˜€ Termasuk setiap ada yang download video dari indowebster, maka semua koneksi pasti DOWN

Masalah gak? Gak juga sih… πŸ˜€ Tapi bermasalah saat ada lebih dari 1 orang yang mengunduh video yang sama. Anggap saja, saya mengunduh video "Ayat-ayat setan", satu jam kemudian teman saya juga mengunduh "Ayat-ayat setan". Hmm itu artinya banyak bandwidth yang terbuang, padahal teman saya itu bisa ngambil berkas video yang sudah saya unduh, sehingga koneksi yang sudah lemot, tidak akan bertambah lemot πŸ˜€

Sekarang masalahnya bagaimana caranya supaya file video yang telah diunduh oleh salah satu orang, tidak akan terunduh lagi oleh orang lain agar bandwith tidak terbuang sia-sia?

Masalah Saya Dengan Musik


Saya punya masalah lagi πŸ˜€

Ceritanya begini. Saya punya banyak sekali berkas-berkas musik di laptop saya, mungkin kalo diitung dah nyampe ribuan berkas, dan pastinya dah nyampe bergiga-giga total besar berkas musiknya πŸ˜€ Saya bukan orang pecinta semua aliran musik, jadi hanya lagu-lagu yang saya suka yang ada di laptop saya, artinya yang orang lain suka tapi saya tidak suka, pastinya tidak ada di laptop saya.

Saya dan teman sekosan saya punya ketertarikan di musik yang berbeda. Saya senang mendengarkan musik yang beraliran keras, sedangkan teman kosan saya senang mendengarkan musik beraliran melo πŸ˜› Trus masalahnya kenapa? Begini masalahnya…

Suatu saat saya harus mengerjakan tugas kelompok, dan kebetulan tugas itu dikerjakan di kamar teman kosan saya. Dari pada saya hanya mengerjakan tugas, ada baiknya saya mainkan lagu-lagu yang saya suka. Setelah saya buka pemutar audio, dan ternyata ohmaigad, ternyata lagu-lagunya gak ada yang saya suka! Pastilah, ini kan laptop teman saya, bukan laptop saya πŸ˜€

Trus bagaimana saya mau mendengarkan lagu-lagu yang saya suka? Sedangkan ini laptop teman saya? Dan karena berbeda ketertarikan di bidang musik, ya pastinya lagu yang saya suka tidak ada di laptop teman saya itu 😦 Jadi bagaimana caranya supaya saya bisa mendengarkan lagu-lagu yang saya suka? Sedangkan sekarang saya menggunakan laptop teman saya?

Masalah Saya Dengan Milis Group


Mulai saat ini, blog ini adalah blog yang berisikan masalah saya di kehidupan sehari-hari, namun masalah ini mungkin bisa saya pecahkan mungkin juga gak bisa saya pecahkan. Ini adalah permasalahan pertama, tentang saya dan milis group πŸ˜€

Masalahnya seperti ini. Apa itu milis group? Bagi saya milis group adalah tempat konsultasi yang gratis πŸ˜€ , tempat berbagi info baik itu baik ataupun buruk, tempat ribut, tempat berantem dan lain sebagainya πŸ˜€ Ok, tapi kebanyakan, saya menjadikan milis sebagai tempat konsultasi, oleh karena itu banyak sekali milis yang saya ikuti, walaupun pasif tapi setidanya jika sewaktu-waktu ada masalah, saya bisa gampang bertanya πŸ˜€

Masalahnya apa nih? Ok, anggap saja saya punya masalah, misal seperti ini. Saya gak tau gimana cara melakukan proses INSERT data ke MySQL, trus saya Googling, tapi tetep gak ketemu-ketemu (misalnya πŸ˜€ ). Akhirnya saya tanyakan ke milis group MySQL Indonesia. Lantas saya tanyakan deh masalah yang sedang saya hadapi :

teman-teman, saya punya masalahnih
gimana caranya y, insert data ke database MySQL
thanks atas jawabannya…

Dan senangnya beberapa saat kemudian posting permasalahan saya ada yang menjawab, ternyata jawabannya :

Sepertinya banyak deh yang bertanya gitu coba search lagi di posting-posting sebelumnya πŸ˜›

Haha… ternyata pernah ada yang punya permasalahan seperti itu, jadi pasti sudah terjawab. Ok, no problem, tinggal search di milisnya pake kata kunci “Insert data ke MySQL“. Tekan ENTER, dan akhirnya keluar hasilnya NO RESULT πŸ˜€ Lho kok? katanya sudah ada yang pernah bertanya seperti itu, tapi kok di cari di milisnya gak ada. Apa harus dibuka 1 pesan 1 pesan sampai halaman akhir? Sedangkan total pesannya lebih dari 100.000 😦 hmmm….. Sepertinya ini mulai menyebalkan.

Kenapa bisa seperti ini y? Bisa saja, biasanya banyak orang yang saat menulis judul pesan, tidak mencerminkan isi dari pesannya, misal “Tolongin donk!!”, “Ada masalah nih”, dan sebagainya yang memang dari judulnya sangat tidak mencerminkan isi pesannya. Atau bisa juga menggunakan bahasa yang tidak baku seperti, “Nambahin data ke MySQL” dan sebagaimnya. Hal ini tentu saya membuat fasilitas pencarian di milis tidak akan bisa menemukan data yang dicari 😦

Lantas bagaimana solusinya?

Tempat Hosting di Indonesia yang Bagus?


kayaknya lama2 bosen juga kalo selalu hosting di wordpress πŸ˜€
pengen punya domain sendiri ah…
kira2 tau tempat hosting yang bagus di Indonesia?

Beli Buku Baru


Baru saja saya beli buku-buku baru, sebenarnya dah lama mo beli buku-buku ini, hanya saja dana baru ada sekarang πŸ˜€ , bukunya ini :

kok gak ada yang berhubungan dengan java? ato bahasa pemrograman πŸ˜€ hihi emang. Sepertinya saya sudah mulai jenuh koding mulu πŸ˜€ Sekarang saatnya belajar ilmu-ilmu komputer yang menurut saya menarik, khususnya ke matematika. Tadinya saya nyari buku tentang Riset Operasional, tapi gak nemu, kira-kira ada yang tau buku Riset Operasional yang bagus?

Factorial di Java


factorial? kalo ingin mengerti tentang apa itu factorial silahkan mengunjungi tempat ini [0]. untuk implementasinya di java sangat gampang, namun yang menjadi kendala adalah jangkauan tipe data numerik di java. jika kita menggunakan tipe data integer, maka cakupannya hanya mencapai kurang lebih 2 milyar, dan untuk long cakupannya kurang lebih 9 triliun. sedangkan untuk faktorial 22 saja, sudah lebih dari jangkauan tipe data long sehingga long hanya dapat mencapai faktorial 20. untuk mengakali hal ini kita bisa menggunakan tipe data BigInteger.

public BigInteger factorial(long i) {
   if (i == 0 || i == 1)
      return new BigInteger("1");
   else
      return new BigInteger(String.valueOf(i)).multiply(factorial(i - 1));
}

note :
[0] http://mathworld.wolfram.com/Factorial.html