Repost dari artikel saya di PC Mild 19/2010
Biasanya, ketika akan menghapus sebuah baris pada jTable, langkah yang dilakukan adalah menseleksi baris tersebut, lalu tekan Delete atau klik tombol hapus. Lalu bagaimana jika ingin menghapus beberapa baris yang bahkan letaknya terpisah-pisah?
Salah satu caranya adalah dengan menambahkan sebuah kolom, yang jika bernilai TRUE, maka baris tersebut akan dihapus. Tip kali ini adalah bagaimana memanfaatkan jCheckBox untuk mengubah dari sekedar tampilan TRUE atau FALSE, menjadi lebih user friendly.
- Misalkan ada sebuah class Buku, yang merepresentasikan data buku di sebuah perpustakaan.
public class Buku { // *******variables area****** // private long id; private String judul; private int nomorRak; private boolean select; // ********methods area******* // public long getId() { return id; } public void setId(long id) { this.id = id; } public String getJudul() { return judul; } public void setJudul(String judul) { this.judul = judul; } public int getNomorRak() { return nomorRak; } public void setNomorRak(int nomorRak) { this.nomorRak = nomorRak; } public boolean isSelect() { return select; } public void setSelect(boolean select) { this.select = select; } }
- Untuk menampilkan dalam jTable, langkah kedua adalah membuat terlebih dahulu TableModel-nya dari class tersebut.
import java.util.ArrayList; import javax.swing.table.AbstractTableModel; public class BukuTableModel extends AbstractTableModel { private ArrayList<Buku> list; public BukuTableModel() { list = new ArrayList<Buku>(); } public int getRowCount() { return list.size(); } public int getColumnCount() { return 4; } public Object getValueAt(int rowIndex, int columnIndex) { switch(columnIndex) { case 0: return list.get(rowIndex).getId(); case 1: return list.get(rowIndex).getJudul(); case 2: return list.get(rowIndex).getNomorRak(); case 3: return list.get(rowIndex).isSelect(); default: return null; } } @Override public String getColumnName(int column) { switch(column) { case 0: return "Id"; case 1: return "Judul Buku"; case 2: return "Nomor Rak"; case 3: return "Selected"; default: return null; } } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { if(columnIndex == 3) { return true; } else { return false; } } @Override public Class getColumnClass(int columnIndex) { if(columnIndex == 3) { return Boolean.class; } else { return super.getColumnClass(columnIndex); } } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { super.setValueAt(aValue, rowIndex, columnIndex); if(aValue != null && aValue instanceof Boolean && columnIndex == 3) { boolean select = (Boolean) aValue; list.get(rowIndex).setSelect(select); } } public void add(Buku buku) { list.add(buku); fireTableRowsInserted(getRowCount() - 1, getRowCount() - 1); } public void remove() { ArrayList<Buku> newBuku = new ArrayList<Buku>(); for(Buku buku : list) { if(!buku.isSelect()) { newBuku.add(buku); } } list = newBuku; fireTableDataChanged(); } }
Bagian yang penting adalah pada method isCellEditable(int rowIndex, int columnIndex). Method ini digunakan untuk mengecek apakah sel pada baris dan kolom tersebut dapat diubah langsung melalui jTable. Kolom select pada model berada di index ke-3 (index dimulai dari nol), maka khusus untuk kolom tersebut harus dapat diubah langsung melalui event dari jTable. Karena itu, method harus di-override menjadi:
@Override public boolean isCellEditable(int rowIndex, int columnIndex) { if(columnIndex == 3) { return true; } else { return false; } }
Selanjutnya, karena kolom ke-4 berisi nilai boolean, maka jTable harus diberi tahu bahwa kolom keempat adalah Boolean. Dengan demikian, secara otomatis jTable akan menampilkan jCheckBox pada kolom tersebut, tanpa perlu mendeklarasikan jCheckBox di setiap baris kolom tersebut. Untuk memberitahu jTable, maka method getColumnClass(int columnIndex) harus di-override menjadi:
@Override public Class getColumnClass(int columnIndex) { if(columnIndex == 3) { return Boolean.class; } else { return super.getColumnClass(columnIndex); } }
Setelah jTable dapat mendeteksi bahwa kolom select dapat diubah, method untuk mengatur perubahannya juga perlu di-override. Method tersebut adalah setValueAt(Object aValue, int rowIndex, int columnIndex) dengan perubahan menjadi:
@Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { super.setValueAt(aValue, rowIndex, columnIndex); if(aValue != null && aValue instanceof Boolean && columnIndex == 3) { boolean select = (Boolean) aValue; list.get(rowIndex).setSelect(select); } }
Terakhir, membuat method untuk menghapus semua baris yang terseleksi.
public void remove() { ArrayList<Buku> newBuku = new ArrayList<Buku>(); for(Buku buku : list) { if(!buku.isSelect()) { newBuku.add(buku); } } list = newBuku; fireTableDataChanged(); }
- Untuk melihat hasilnya, langkah terakhir adalah membuat tampilannya dengan menggunakan jForm. Pembuatan bisa dengan IDE seperti NetBeans maupun secara manual. Berikut ini adalah contoh tampilan secara manual.
/** * DO NOT REMOVE THIS LICENSE * * This source code is created by Muhammad Fauzil Haqqi. * You can use and modify this source code freely but * you are forbidden to change or remove this license. * * Nick : Haqqi * YM : xp_guitarist * Email : fauzil.haqqi@gmail.com * Blog : http://fauzilhaqqi.net * Company : http://mimicreative.net */ package pcmild.edisi19; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** * * @author Haqqi */ public class Main extends javax.swing.JFrame { public static void main(String[] args) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new Main().setVisible(true); } }); } public Main() { initComponents(); tableModel = new BukuTableModel(); // coba data for(int i = 0; i < 100; i++) { Buku buku = new Buku(); buku.setId(i); buku.setJudul("Buku " + i); buku.setNomorRak(i * 2); buku.setSelect(false); tableModel.add(buku); } table.setModel(tableModel); } private void initComponents() { setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); setTitle("http://fauzilhaqqi.net"); setLayout(new java.awt.BorderLayout()); hapus = new javax.swing.JButton(); hapus.setPreferredSize(new java.awt.Dimension(70, 30)); hapus.setText("Hapus"); hapus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { hapusPerformed(e); } }); scroll = new javax.swing.JScrollPane(); scroll.setPreferredSize(new java.awt.Dimension(500, 300)); table = new javax.swing.JTable(); scroll.setViewportView(table); this.add(scroll, BorderLayout.CENTER); this.add(hapus, BorderLayout.SOUTH); pack(); setLocationRelativeTo(null); } private void hapusPerformed(ActionEvent e) { tableModel.remove(); } javax.swing.JScrollPane scroll; javax.swing.JButton hapus; javax.swing.JTable table; BukuTableModel tableModel; }
Tombol hapus akan melakukan action menghapus data pada table yang memiliki tanda cek pada kolom keempatnya. Untuk lebih mudahnya, tombol tersebut memanggil action berikut.
private void hapusPerformed(ActionEvent e) { tableModel.remove(); }
- Setelah dijalankan, maka hasilnya akan seperti berikut ini.
jCheckBox telah tampil dalam jTable
- Selamat mencoba 🙂
Download source code keseluruhan.
Artikel ini telah dipublikasikan di media cetak tabloid PC Mild edisi 19 tahun 2010 lalu.
Sumber artikel ini dari sini
mas haqqi, selamat pagi….no comment dah sama ‘maenannya’ sukses aja lah dr si sayah 8)…
gan mau nanya kalau misalkan menggunakan mysqlnya bagaimana ya ?. terus kalau misalkan ingin mngubah data yang di contreg ke dalam mysql bagaimana ya thank u
izin download gan, makasih ya …. 🙂
mohon di lengkapi dengan gambar yang jelas pada setiap langkahnya gan..
bagi para newbie seperti saya merasa kesusahan :'(
kalo menghapus data yang dicentang pada tabel tersebut dari database gimana caranya gan ??
makasih mas tutorialnya yang sangat lengkap plus source codenya sangat membantu buat yang newbie pemprograman java…