Membuat JTable; Kasus Spesial: Tidak Bisa Di-Edit Tapi Bisa Dipilih

Oke… hari ini lanjutan dari postingan kemaren tentang ngejadiin jtable gak bisa diedit tapi bisa dipilih. Gimana caranya?! Yaaa… kalo cara gw c… gw ngubah di model table-nya c… Jadi kalo gw tuh diajarinnya gini ama dosen gw, jtable tuh terdiri dari 2 bagian, objek dari class JTable sebagai wadah, dan objek dari class model tabel (bisa apapun… bisa DefaultTableModel, AbstractTableModel atau apapun) sebagai pengisi dari objek JTable tersebut.

Gitu kira2…

Sekarang target kita, kita bakal punya suatu form kayak gini pake netbeans gui builder:

1. Hasil Akhir 1

Kalo tekan “Tambahkan”, masuk ke tabel

2. Hasil AKhir 2

3. Hasil Akhir 3

Kalo salah satu baris tabel dipilih, terus tekan “Hapus Tabel”, bakal ngehapus isi dari tabel terpilih.

4. Hasil Akhir 4

5. Hasil Akhir 5

Dan kalo belum ada tabel terpilih tapi udah langsung tekan “Hapus Tabel”, bakal keluar kayak gini:

6. Hasil AKhir 6

Oke… cukup udah berlama2nya…

Langkah pertama…. Bikin project baru, ama sebuah package baru (yang ini optional c). Di package yang kamu inginkan, klik kanan, pilih “JFrame Form”.

7. Langkah Pertama

Kalo gak nemu, klik kanan di package yang kamu mau, pilih “Other”, muncul kan 1 window baru, di sebelah kiri, pilih “Swing GUI Forms”, di sebelah kanan, pilih “JFrame Form”.

8. Langkah Kedua

Klik “Next”, kasi nama sesuai yang kamu mau. Usahain namanya Cuma pake alphabet ajah yah, gak usah pake karakter selain A-Z. Kalo gw, namainnya “FormTable”.

9. Langkah Ketiga

Muncul satu buah canvas “JFrame” untuk di desain. Sekarang, di bagian palette, Tarik “Panel” ke canvas, lebarin sesuai ukuran JFrame. Ini gak musti kamu lakuin, kebiasaan ajah c ini…

10. Langkah Keempat

Kalo udah, masukin beberapa komponen (2 text field & label, 1 button, 1 table) dari palette ke canvas dan atur di canvas itu jadi kayak gini:

11. Langkah Kelima

Pilih table, di bagian “properties”, pilih “model” klik eclipse button-nya (eclipse button yang gw maksud itu tombol kecil yang ada titik2nya 3 biji). Sebenernya ini gak harus dilakukan, tapi lagi2 masalah kebiasaan ajah.

12. Langkah Keenam

Model di sini, maksutnya yaaa model buat ngisi objek dari JTable yang udah kita bikin. Di sini segala2nya kita masukin. Kalo udah nekan eclipse button di model, bakal keliatan “isi” dari tabel itu apa aja.

13. Langkah Ketujuh

Lihat kan yah?! Di tab table setting, itu yang nampil header table yang diinginkan. Sedangkan di tab “Default Values”, yang nampil isi dari table tersebut. Sekarang, karena gw mau table-nya kosong, jadiin rows ama columns nilainya 0. Jadi pas di-run jadi muncul kayak gini:

14. Hasil 1-1

Oke, langkah sebelumnya gak harus dilakukan. Itu cuma masalah kebiasaan gw ajah. Tapi langkah berikut kamu harus lakukan. Di sini, gw bakal bikin 1 objek model untuk menggantikan objek model default bawaan netbeans gui (matisse) builder.

Langkah2nya, pergi ke bagian source, lalu deklarasikan sebuah objek dari kelas “DefaultTableModel”. Gw tulisin di atas konstruktor class.

    private DefaultTableModel dtm = new DefaultTableModel();

    public FormTable() {
        initComponents();      
    }

Si objek model table ini punya informasi nama header table yang bisa kita tambahkan dan kurangi. Karena defaultnya kosong, kita bakal nambahin dulu header table dari objek model. Caranya pake method addColumn().

    private DefaultTableModel dtm = new DefaultTableModel();

    public FormTable() {
        initComponents();
        dtm.addColumn("Nama");
        dtm.addColumn("Pengarang");
    }

Terus, set objek jtable supaya model yang dipake jtable itu model yang udah kita bentuk sebelumnya (dtm). Untuk ngakses objek jtable, kamu bisa pergi ke bagian “Design”, klik kanan di table, pilih “Change Variable Name”. Muncul 1 window yang menyatakan nama dari si objek jtable. Kalo gw munculnya “jtable1”. Nama ini bisa diganti, dan nantinya, nama inilah yang kita gunakan buat ngakses objek jtable.

Jadi di konstruktor tambahin gini:

    private DefaultTableModel dtm = new DefaultTableModel();

    public FormTable() {
        initComponents();
        dtm.addColumn("Nama");
        dtm.addColumn("Pengarang");
        jTable1.setModel(dtm);
    }

Kalo udah gini, tinggal dijalanin ajah, dan bakal muncul hasil kayak gini:

15. Hasil 1-2

Lihat kan?! Di tabel udah muncul header tabel yang dimasukin dari objek model table yang udah kita bikin sebelumnya.

Sekarang, waktunya nambahin isi. Pas tekan “tambahkan”, kita isi tabel sesuai nilai dari text field. Saat menekan tombol, yang perlu kita tambahin adalah suatu event. Event pas nekan tombol. Di sini, gw tambahin event-nya berupa action performed. Caranya, pergi ke bagian “Design”, klik kanan di button, pilih “Events”–>”Action”–>”actionPerformed”.

Setelah muncul lagi di bagian source (dengan 1 method tambahan actionPerformed), taruh kode berikut sebagai aksi “algoritma” yang dikerjakan saat menekan tombol:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        try {
            String a = jTextField1.getText().trim();
            String b = jTextField2.getText().trim();
            Object[] o = {a,b};
            dtm.addRow(o);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, ex.getMessage(),
                    "Kesalahan", JOptionPane.ERROR_MESSAGE);
        }
    }

Buat kode di atas, gw pake fungsi trim() dan di-blok pake try-catch. Fungsinya, kamu baca dokumentasi java di situs oracle ajah ya. Males jelasin… tapi intinya sesimple yagn gw warnain merah, yaitu nge-get teks dari textfield pake method getText(), terus teks tersebut dimasukin ke table pake method “addRow” dari objek model table.

Coba deh dijalanin aplikasi-nya, terus teks filed-nya diisi sesuatu, sama tekan tombol “tambahkan”, bakal bisa gini jadinya:

16. Hasil 1-3

Sekarang, coba kamu klik 2 kali di salah satu cell table. Jadi bisa diubah kan tulisannya?! Nah.. sekarang gw mau cell table itu gak bisa di-klik 2x, tapi bisa di-select (ada highlight-nya). Caranya gimana?!

Caranya… balik lagi ke atas, pas deklarasi objek model table, bikin deklarasinya jadi kayak gini:

    private DefaultTableModel dtm = new DefaultTableModel() {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };    public FormTable() {
        initComponents();
        dtm.addColumn("Nama");
        dtm.addColumn("Pengarang");
        jTable1.setModel(dtm);
    }

Tambahin kode yang gw kasi warna biru. Di sini, kita meng-override method isCellEditable jadi mengembalikan nilai false apapun yang terjadi. Defaultnya, yang dikembalikan true. Tapi karena kita maunya si cell gak bisa di-edit, jadilah yang dikembaliin itu nilai false. Jalanin lagi deh aplikasinya, coba klik 2x di cell table. Seharusnya c gak bisa diubah… kalo masi bisa, artinya ada langkah yang kamu skip dari langkah2 yang seharusnya kamu lakuin.

Terus sekarang buat ngehapus isi dari table sebanyak 1 row yang dipilih. Ngehapus baris di tabel, seharusnya bisa dijalanin kalo nekan tombol “Hapus Tabel”. Karena itu kita butuh event. Caranya, klik kanan di tombol yang ada, pilih “Events” –> “Action” –> “actionPerformed”. Atau kalo kamu males ngeklik2 banyak gitu, cukup nge-klik 2x di tombol “Hapus Tabel”

Setelah muncul “source” dengan 1 method tambahan,  tambahin kode gini di method tersebut:

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        try {
            int x = jTable1.getSelectedRow();
            dtm.removeRow(x);
        } catch (ArrayIndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog(this, "Tabel Belum Dipilih", 
                    "Kesalahan", JOptionPane.WARNING_MESSAGE);
        }
    }

Kode tersebut pake try-catch jugak, tapi intinya sesimple yang gw kasi warna merah, yaitu ambil indeks baris yang sedang dipilih di table pake method getSelectedRow(), terus hapus isi dari indeks baris yang sudah didapat sebelumnya dengan menggunakan method removeRow(). Yang perlu diperhatikan, getSelectedRow itu dipanggilnya dari objek table, sedangkan removeRow itu dipangil dari objek model table.

Sekarang, kalo dijalanin bakal sesuai kondisi yang kita inginkan. Tekan tombol “tambahkan” bakal muncul di table, tekan tombol “hapus tabel” bakal ngehapus data dari 1 baris tabel terpilih. Dan kalo kita belum milih barisnya, bakal keluar hasil peringatan kayak yang udah ditampilin sebelumnya.

Dan begitulaaahhh~~ Gampang kan?! Haa?? Panjang?! Emang… tapi kan yang penting gampil lhah ngerjainnya 😀

PS: Buat yang penasaran, contoh project Netbeans-nya gw taroh di sini. Berhubung itu gratis, jangan komplain kalo tiba2 link broken. Masa berlaku file cuma 30 hari sejak aktifitas terakhir dari file tersebut. O iya, FYI… gw pake Nb 7.2, java 1.7 update 21. Silahkan nyesuaiin sendiri….

Sumber: Pribadi <asumsi, dosen gw adalah hak milik gw sepenuhnya :p>
Valid: Gw c iya…
Masa Kadaluarsa: Sampe method2 terkait dinyatakan deprecated ama oracle
Status Kadaluarsa:
Antara ya dan enggak! Ini old style banget (kalo gak bikin model tabel sendiri)! Buat ngehasilin kayak gini, tinggal uncentang pilihan “editable” di bagian “model” (gambar 13). Tapi kalo gak bikin model sendiri, yaaaa masih berlaku ajah.

Advertisements

3 thoughts on “Membuat JTable; Kasus Spesial: Tidak Bisa Di-Edit Tapi Bisa Dipilih

    • Seperti yang udah ditulisin di atas, Neng Dita…
      “Gw tulisin di atas konstruktor class.”

      Bisa di mana aja sebenernya, yang penting deklarasiin sebagai atribut…
      bukan dalam method tertentu.
      Jadi, kalo ngikutin cara di atas, cari ajah baris:

      public FormTable() {
              initComponents();      
      }

      tulisin deklarasi model tabel di atasnya.

Leave a Reply

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 / Change )

Twitter picture

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

Facebook photo

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

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s