Membuat TableModel yang Dinamis


Kalo temen-temen anggota Jug-Bandung, pasti sudah tau ini, soalnya kemaren dah di bahas di milis Jug-Bandung, kalo blon tau silahkan kunjungi disini :

http://groups.google.co.id/group/jug-bandung/t/a6a2717fca2a32ed

Sekalian juga yang belum join, silahkan join πŸ˜€

Ceritanya gini, biasanya kalo kita bikin table, maka kita juga bikin tablemodel, misal tabel mahasiswa, maka kita bikin tablemodel mahasiswa, trus kalo tabel anggota, maka bikin tablemodel anggota juga, dan seterusnya πŸ˜€ Bayangkan jika di aplikasi kita ada 50 table, berarti kita biki 50 tablemodel juga 😦 capedeh…

Nah gimana caranya kita bikin 1 tablemodel, dan bisa digunakan oleh semuany?

Gampang aja πŸ˜€ , ini tutorialnya….

Pertama bikin dulu @annotation, ini dibuat untuk mendeklarasikan kolom di table :

package khannedy.dynamictable;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Column {

    String name() default "";
}

Annotation @Column ini tar disisipkan di field yang akan dijadikan kolom:D Setelah itu tinggal kita bikin TableModel nya, kira-kira seperti ini :

package khannedy.dynamictable;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class DynamicTableModel<T> extends AbstractTableModel {

    private List<T> list;
    private List<Field> fields = new ArrayList<Field>();
    private List<Column> columns = new ArrayList<Column>();

    public DynamicTableModel(List<T> list, Class<T> class1) {
        this.list = list;
        for (Field field : class1.getDeclaredFields()) {
            Column column = field.getAnnotation(Column.class);
            if (column != null) {
                fields.add(field);
                columns.add(column);
            }
        }
    }

    public int getRowCount() {
        return list.size();
    }

    public int getColumnCount() {
        return fields.size();
    }

    @Override
    public String getColumnName(int column) {
        return columns.get(column).name();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        try {
            Field field = fields.get(columnIndex);
            field.setAccessible(true);
            return field.get(list.get(rowIndex));
        } catch (IllegalArgumentException ex) {
            return null;
        } catch (IllegalAccessException ex) {
            return null;
        }
    }
}

Setelai deh πŸ˜€ Lho kok? emang udah πŸ˜€ Sekarang tinggal Contoh…
Misal kita mau bikin tabel untuk mahasiswa, dan pertama kita bikin kelas mahasiswa, nah tar di field yang akan dijadikan colum tinggal kita tambah @Column :

package khannedy.dynamictable;

public class Mahasiswa {

    @Column(name = "Nim")
    private String nim;
    @Column(name = "Nama Depan")
    private String namaDepan;
    @Column(name = "Nama Belakang")
    private String namaBelakang;

    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;
    }
}

Sekarang tinggal contoh programnya πŸ˜€ ini contohnya :

package khannedy.dynamictable;

import java.awt.BorderLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class Main implements Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Main());
    }

    public void run() {
        JFrame frame = new JFrame("Eko Ganteng");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(new BorderLayout());

        List<Mahasiswa> mahasiswas = new ArrayList<Mahasiswa>();
        for (int i = 0; i < 100; i++) {
            Mahasiswa mahasiswa = new Mahasiswa();
            mahasiswa.setNim("10106031");
            mahasiswa.setNamaDepan("Eko Kurniawan");
            mahasiswa.setNamaBelakang("Khannedy");
            mahasiswas.add(mahasiswa);
        }

        DynamicTableModel<Mahasiswa> tableModel = new DynamicTableModel<Mahasiswa>(mahasiswas, Mahasiswa.class);
        JTable table = new JTable(tableModel);
        JScrollPane scrollPane = new JScrollPane(table);

        frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
        frame.setSize(500, 500);
        frame.setVisible(true);
    }
}

Screenshot nya? cobain aja sendiri, saya lagi males upload gambarnya πŸ˜€

Follow Me

Iklan

22 pemikiran pada “Membuat TableModel yang Dinamis

  1. nah w pernah tu bro buat aplikasi dgn 20 table, gila puyeng bgd w harus buat satu persatu table model nya,
    nah kepikirin w, w mw buat 1 table model dmn bisa di gunakan diseluruh table..
    tp yg w bingung kan setiap table field na berbeda..
    berrti di setiap class yg mendeklarasikan dari field dikch @column dan sesuai kan didatabase mysql na gitu ya,..

  2. Ping balik: Menggunakan iTextPDF « Launk's Informatika

  3. salam kenal mas eko… saya newbie d java. thanks dah sharing ilmunya.
    sy lg migrasi aplikasi bikinan sendiri k java. ada 50-an tabel. tutor dynamictable ini bisa sangat berarti untuk saya..

  4. punten ya kak jika pertanyaan saya terlalu mudah,,tapi saya benar2 ga tau
    “Pertama bikin dulu @annotation, ini dibuat untuk mendeklarasikan kolom di table :
    package khannedy.dynamictable;

    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Column {

    String name() default “”;
    }”
    ka, annotation ini dibuat dalam satu kelas tersendiri tau bisa code tersebut dimasukkan pada kelas DynamicTableModel extends AbstractTableModel
    mohon pencerahannya ya ka,,sy ucapakan terima kasih jika k2 bersedia memberikan jawabannya nya

  5. Aslm, tutorial yg bgus mas, jadi inti dari tutoral ni. Seandainya q bkn aplkasi database dmn tabelnya ada 20 msalnya, tapi di aplikasi yg q bkn hnya menampilkan join 2 buah tabel. Jad q g ush repot2 mendeklaraskan semua tabel, ckup mendeklarasikan 1 buah tabelmodel yang bersi join tabel tersebut atau gmn mas, mhn bntuannya.mksh

  6. assalamualaikum. terimakasih untuk mas eko. karena sangat membantu sekali unuk saya xp, tapi saya punya pertanyaan sedikit. kalo dari tutorial ini bisa ga ya di kasih checkbox di tablenya???.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s