Membuat Custom JTable

January 31, 2008

Pasti semua yang udah pengalaman buat aplikasi Destop atau Swing pernah menggunakan JTable. Mmmmm… tau sendirikan bagaimana susahnya ngatur tampilan datanya? Atau mungkin yang baru belajar Java dan coba-coba pake JTable pasti langsung kecewa. Apalagi kalo mereka yang udah terbiasa dengan Visual basic pasti lebih kecewa lagi, karena Table di VB jauh lebih mudah digunakan.

Pada JTable swing kita akan kesulitan mengatur tampilan seperti untuk perataan teksnya (KIRI, TENGAH, KANAN). Atau mungkin kalo kebetulan data berupa currency (uang) yang butuh pemisah ribuan di JTable agak susah kita lakukan :(

jtable.png

Nah pada tulisan saya kali ini akan mencoba menunjukan bagaimana membuat Custome JTable yang dapat kita format datanya (Rata kiri/kanan/tengah) dan format untuk menampilkan data currency.

JTable cell dirender oleh cell renderer yang merupakan class-class yang mengimplementasikan interface TableCellRenderer. Interface ini mendefinisikan sebuah method yang akan mengembalikan referensi komponen yang akan melakukan operasi render/drawing. Nah untuk membuat custome renderer tentunya kita harus mengimplement interface ini atau mengextends class DefaultTableCellRenderer.

Membuat Custom Render
Berikut ini adalah class customer renderer untuk Number :

public class NumberRenderer extends DefaultTableCellRenderer{
public NumberRenderer() {
super();
setHorizontalAlignment(SwingConstants.RIGHT);
}
public void setValue(Object value) {
if ((value != null) && (value instanceof Number)) {
Number numberValue = (Number) value;
NumberFormat formatter = NumberFormat.getIntegerInstance();
value = formatter.format(numberValue.intValue());
}
super.setValue(value);
}
}

Selanjutnya kita buat Custome renderer untuk Currency

public class CurrencyRenderer extends DefaultTableCellRenderer{
public CurrencyRenderer() {
super();
setHorizontalAlignment(SwingConstants.RIGHT);
}
public void setValue(Object value) {
if ((value != null) && (value instanceof Number)) {
Number numberValue = (Number) value;
NumberFormat formatter = NumberFormat.getNumberInstance();
value = formatter.format(numberValue.doubleValue());
}
super.setValue(value);
}
}

Berikutnya Custome renderer untuk Center dan Right align

public class CenterRenderer extends DefaultTableCellRenderer{
public CenterRenderer() {
super();
setHorizontalAlignment(SwingConstants.CENTER);
}
}

public class RightRenderer extends DefaultTableCellRenderer{
public RightRenderer() {
super();
setHorizontalAlignment(SwingConstants.RIGHT);
}
}

Nah setelah semua custome renderernya selesai, tugas selanjutnya kita buatkan Custome JTable (extends JTable) yang akan menggunakan class-class Custome renderer di atas.


public class CustomeTable extends JTable {

private DefaultTableModel model;
private TableColumnModel tcm;
private TableColumn tc;
public static int CURRENCY = 0;
public static int NUMBER = 1;
public static int RIGHT = 2;
public static int CENTER = 3;
public static int DATE = 4;

/** Creates a new instance of CustomeTable */
public CustomeTable(String title[], Object data[][]) {
model = new DefaultTableModel(data, title);
this.setModel(model);
tcm = this.getColumnModel();

}

/**
* Memformat column tertentu <br>
* @param column nomor column dimulai dari 0
* @param format 0=currency format, 1=number format, 2=rata kanan, 3=rata kiri
*/
@SuppressWarnings("empty-statement")
public void setColumnFormat(int column, int format) {
tc = tcm.getColumn(column);
switch (format) {
case 0:
tc.setCellRenderer(new CurrencyRenderer());
break;
case 1:
tc.setCellRenderer(new NumberRenderer());
break;
case 2:
tc.setCellRenderer(new RightRenderer());
break;
case 3:
tc.setCellRenderer(new CenterRenderer());
break;
case 4:
tc.setCellRenderer(new DateRenderer());
break;
}
;

}

/**
* Mengatur lebar column tertentu
* @param column nomor column dimulai dari 0
* @param width lebar column yang diinginkan
*/
public void setColumnWidth(int column, int width) {
tc = tcm.getColumn(column);
tc.setPreferredWidth(width);
}

/**
* Mengaktirfkan Table agar bisa dishortir
*/
public void activateShorter() {
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
this.setRowSorter(sorter);
}
}

OK sekarang saatnya kita coba gunakan class CustomerTable ini dalam aplikasi seperti di awal tulisan ini.


public class Tester extends javax.swing.JFrame {

/** Creates new form Tester */
public Tester() {
initComponents();
Object data[][] = {
{"1", "Bambang Pamungkas", "Salatiga", 2000000000},
{"2", "Ronaldo", "Brazil", 1000000000},
{"3", "Kaka", "Brazil", 230000000},
{"4", "Slamet", "Solo", 2000001}
};
String title[] = {"No.","Nama","Alamat","Pendapatan"};

this.table = new CustomeTable(title, data);

// mengubah lebar column
table.setColumnWidth(0,10);

//rata tengah
table.setColumnFormat(2, CustomeTable.CENTER);

//currency format

table.setColumnFormat(3, CustomeTable.CURRENCY);

// table dapat dishort
table.activateShorter();

this.scroll.setViewportView(table);

}
CustomeTable table;

//code-code program yang lain ....

}

custome-table.png

Perhatikan perubahan yang terjadi :D sekarang kita memiliki Table yang lebih baik karena menampilkan format data sesuai dengan yang kita inginkan.

Maaf kalo source codenya berantakan..

happy coding :D

Entry Filed under: Java Beginer. .

22 Comments Add your own

  • 1. astawan  |  February 27, 2008 at 8:19 am

    kalau saya bukannya kecewa, tapi kecewa banget.. beda banget dengan datagrid punya vb.
    he.. he.., tapi ya namanya juga barang beda, tentu beda juga design nya. jadi butuh kerja keras.
    dan menurut saya, kesulitan ini harusnya menjadi PR nya Sun, begitu juga dengan binding data.

  • 2. Hendro Steven  |  February 27, 2008 at 8:43 am

    yap betul sekali.. tapi kita juga harus terima kasih ke SUN udah buatin barang gratis ini walaupun belum sempurna :) kabar baiknya adalah bahwa release Java selanjutnya Swing dan Binding akan menjadi salah satu perhatian dari SUN

    :)

  • 3. agianto  |  March 5, 2008 at 4:40 pm

    setelah saya kunjungin situs ini saya tertarik dengan pembahsan2 terutama pemrograman java.

    Ingin saya tanyakan, saya kan senang dgn pemrograman java, tp saya susah memahaminya, ada dak tips & trik untuk menguasai java dgn cepat. katanya gampang pake NETBEANS.
    atas jawabanya thank’s

  • 4. Hendro Steven  |  March 6, 2008 at 3:16 am

    Halo Agianto :D
    Betul sekali! belajar Java menyenangkan dan kalo sudah dikuasai akan terasa produktifitas kita meningkat :)
    Tapi tentunya namanya belajar gak mungkin langsung bisa. Kita harus investasi waktu :D
    Untuk menguasai Java yang pertama ya kamu harus pelajari sintaks bahasanya misalnya loop, kondisi, tipe data, dan lain-lainnya. Setelah itu pelajari tentang konsep OOP(Object Oriented Programming). Nah OOP ini nih yang agak sulit :) apalagi kalo anda sudah terbiasa dengan bahasa pemrograman struktural atau event-driven seperti Visual Basic. Java tanpa OOP tidak apa-apanya :D
    Setelah menguasai dasar Java+OOP baru anda terserah mau pilih Java yang Enterprise atau yang Mobile.
    Netbeans adalah salah satu IDE untuk Java yang memang gampang penggunaannya. Selain Netbeans ada juga Eclipse yang cukup populer. Saran saya kalo anda baru belajar Java, khususnya OOP sebaiknya pakai editor standard saja. Bahkan jika perlu pake Notepad dan compile pake console/dos promt.

  • 5. FARA  |  April 6, 2008 at 9:39 am

    Pak Hendro saya mau tanya mengenai java,semisalkan program diatas menggunakan database access dan pada saat saya tekan enter pada cell pertama (no(anggap ini primary key)) dan saya ketik 2 pada cell pertama kemudian cell kedua (nama) tampil(fungsi untuk mencari records),dan kemudian cursor focus di cell ke tiga untuk mengisi data lagi itu source code nya bagaimana ya pak,cuma saya mau buat aplikasi desktop seperti contoh di bawah ini :

    ================================
    product id Descp Price qty total
    ================================
    123 Kopi 200 2 400
    ================================

    tolong dong pak saya lagi belajar java,nyari-nyari kagak dapet-dapet….?
    tolong dong kirimi contoh source code nya,tolong ya kirimi via email…please…

  • 6. Reza MD  |  April 9, 2008 at 3:56 am

    Mo tanya donk.
    Saya develop applikasi dengan jtable yang berfungsi menampilkan data dari DB.
    Gmn ya caranya setiap kali ada perubahan data pada DB, jtable akan selalu menampilkan data terbaru dari DB(jika data pada db berubah).
    Sy dah buat tablemodel yang custom, tetapi cuma bisa sebaliknya, yaitu jika data pada jtable berubah maka data pada DB berubah.
    thnks…

  • 7. Hendro Steven  |  April 9, 2008 at 7:56 am

    Hallo Reza :)
    mmm.. sepengetahuan saya tidak ada cara mengupdate isi dari sebuah table selain kita baca lagi datanya dari database kemudian update tablenya. Mungkin supaya isi dari table tetap up to date ya.. aplikasi harus sering-sering baca lagi data dari table misalnya kita kasih waktu setiap 10 detik. Untuk kebutuhan ini bisa baca di http://www.ibm.com/developerworks/web/library/j-schedule.html
    Tapi mungkin aplikasi akan sangat lambat karena harus sering membaca table, apalagi kalau recordnya buaaanyak :(

    semoga membantu..

  • 8. ulo  |  April 10, 2008 at 8:10 am

    Bagaimana menyimpan data dari JTable ke database. saya menggunakan Netbeans.

    Thank’s
    ulo

  • 9. Kusno  |  April 14, 2008 at 9:41 am

    Mas, saya ada 2 pertanyaan :
    1. Bagaimana cara men-validasi cell jTable agar yang diisi hanya berupa numerik aja?

    2. Misalnya cell value kita berupa currency (85,000). Bagaimana kalau user enter di cell itu formatnya berubah jadi 85000

    Thanks

  • 10. Rosevelt  |  July 8, 2008 at 4:48 am

    Mas Hendro saya ada pertanyaan :
    Setalah data ditampilkan di JTable, bagaimana caranya user bisa memilih dengan cara double click mouse atau meng-enter di row yang terpilih, kemudian isi row tersebut pindah ke JText yang tersedia.

    Thanks

  • 11. Ghe  |  August 21, 2008 at 6:38 pm

    sama kaya “Rosevelt” mas, gimana ya caranya?
    punya saya jtextfield nya di class yg berbeda.

  • 12. ayif  |  October 17, 2008 at 1:14 am

    mas boleh minta contoh untuk nge display data dari database ke objek table…
    dan contoh untuk melihat pemasukan data yang kita masukan via text field kedalam database dan d disply kedalam objek table

  • 13. marina  |  November 14, 2008 at 1:43 pm

    mas hendro saya ada pertanyaan nhe ttg JTable..
    yang di atas khan datanya permanen tuch, klo buat Jtable data dari user n pake array gimana caranya??
    bingung nhe biz baru nyoba belajar java nhe!!
    thanx a lot b4..

  • 14. Hendro Steven  |  November 17, 2008 at 2:47 am

    halo marina,
    contoh di atas kan udah pake array :)
    tapi memang datanya masih statik belum dinamik.
    Yang dinamik misalnya dibaca dari database atau yang diinput oleh user. Nah caranya baca aja data dari tabel (liat tutorial saya tentang database) trus kalo dari input juga tinggal baca aja yang diinput user. Trus datanya dikonversi jadi array dan kalo udah jadi array tinggal ditampilin aja datanya di table seperti di atas.

  • 15. Rendra  |  January 30, 2009 at 1:26 am

    HEBAT!!!

    Tapi aku ngga pake buat new class lagi. Repot. Langsung aja pake DefaultTableCellRenderer nya di instantiate. Dari dulu aku cari2 ini fitur. Ketemu di sini. Bule2 kok jarang ngebahas ini ya.

    Boleh kenalan ngga nih?

    Senang menambah teman yang jago Java. Saya di rendrabasuki@gmail.com

    Salam Kenal
    Rendra

  • 16. Hendro Steven  |  January 31, 2009 at 1:35 am

    Hallo Rendra.. salam kenal juga :)

  • 17. Taufan  |  April 21, 2009 at 11:46 am

    wah keren juga.. xo bsa saya diberi tau bagaimana menyimpan data dari jtable langsung ke database.. yang saya gunakan di sini mysql..

  • 18. Hendro Steven  |  April 27, 2009 at 4:08 am

    halo Taufan, pelajari Beans Binding ;)

  • 19. Fitriadi  |  June 20, 2009 at 3:15 pm

    Mungkin cara diatas terlalu sulit yang baru belajar java.Cara simpelnya dapat dilihat disini Lihat Cara Simpel Disini

  • 20. Adit  |  July 17, 2009 at 4:14 am

    Untuk DateRenderer nya mana mas ?????

  • 21. hida2000  |  July 25, 2009 at 7:10 am

    Salam kenal mas Hendro, kenapa kq class Currency dgn class Number sama???Trus dah saya coba class Currency, kq td kyk contoh diatas y???

  • 22. hida2000  |  July 27, 2009 at 3:41 am

    Udah bisa kq mas Hendro

Leave a Comment

Required

Required, hidden

Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback this post  |  Subscribe to the comments via RSS Feed


 

January 2008
M T W T F S S
« Nov   Feb »
 123456
78910111213
14151617181920
21222324252627
28293031  

a

Recent Posts

Recent Comments

Zulfikar on Java Video Tutorial
indra on Java Video Tutorial
Hendro Steven on Membuat Aplikasi Database…
Hendro Steven on Simple JPA Application with…
Deathlock on Simple JPA Application with…

Top Posts

Archives

Blogroll

Blog Stats

Tags

catch demo java exception jamu Java pengunjung selamat seminar java throws try tulisan java tutorial java