Menampilkan jCheckBox dalam jTable

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.

  1. 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;
      }
    }
  2. 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();
      }
  3. 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();
      }
  4. Setelah dijalankan, maka hasilnya akan seperti berikut ini.

    jCheckBox telah tampil dalam jTable

  5. 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

6 Comments

  1. mohon di lengkapi dengan gambar yang jelas pada setiap langkahnya gan..
    bagi para newbie seperti saya merasa kesusahan :'(

    Reply

Leave a Comment.