Membuat Custom JTable
January 31, 2008 33 Comments
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
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 :
<br />
public class NumberRenderer extends DefaultTableCellRenderer{<br />
public NumberRenderer() {<br />
super();<br />
setHorizontalAlignment(SwingConstants.RIGHT);<br />
}<br />
public void setValue(Object value) {<br />
if ((value != null) && (value instanceof Number)) {<br />
Number numberValue = (Number) value;<br />
NumberFormat formatter = NumberFormat.getIntegerInstance();<br />
value = formatter.format(numberValue.intValue());<br />
}<br />
super.setValue(value);<br />
}<br />
}<br />
Selanjutnya kita buat Custome renderer untuk Currency
<br />
public class CurrencyRenderer extends DefaultTableCellRenderer{<br />
public CurrencyRenderer() {<br />
super();<br />
setHorizontalAlignment(SwingConstants.RIGHT);<br />
}<br />
public void setValue(Object value) {<br />
if ((value != null) && (value instanceof Number)) {<br />
Number numberValue = (Number) value;<br />
NumberFormat formatter = NumberFormat.getNumberInstance();<br />
value = formatter.format(numberValue.doubleValue());<br />
}<br />
super.setValue(value);<br />
}<br />
}<br />
Berikutnya Custome renderer untuk Center dan Right align
<br />
public class CenterRenderer extends DefaultTableCellRenderer{<br />
public CenterRenderer() {<br />
super();<br />
setHorizontalAlignment(SwingConstants.CENTER);<br />
}<br />
}</p>
<p>public class RightRenderer extends DefaultTableCellRenderer{<br />
public RightRenderer() {<br />
super();<br />
setHorizontalAlignment(SwingConstants.RIGHT);<br />
}<br />
}<br />
Nah setelah semua custome renderernya selesai, tugas selanjutnya kita buatkan Custome JTable (extends JTable) yang akan menggunakan class-class Custome renderer di atas.
</p>
<p>public class CustomeTable extends JTable {</p>
<p>private DefaultTableModel model;<br />
private TableColumnModel tcm;<br />
private TableColumn tc;<br />
public static int CURRENCY = 0;<br />
public static int NUMBER = 1;<br />
public static int RIGHT = 2;<br />
public static int CENTER = 3;<br />
public static int DATE = 4;</p>
<p>/** Creates a new instance of CustomeTable */<br />
public CustomeTable(String title[], Object data[][]) {<br />
model = new DefaultTableModel(data, title);<br />
this.setModel(model);<br />
tcm = this.getColumnModel();</p>
<p>}</p>
<p>/**<br />
* Memformat column tertentu <br><br />
* @param column nomor column dimulai dari 0<br />
* @param format 0=currency format, 1=number format, 2=rata kanan, 3=rata kiri<br />
*/<br />
@SuppressWarnings("empty-statement")<br />
public void setColumnFormat(int column, int format) {<br />
tc = tcm.getColumn(column);<br />
switch (format) {<br />
case 0:<br />
tc.setCellRenderer(new CurrencyRenderer());<br />
break;<br />
case 1:<br />
tc.setCellRenderer(new NumberRenderer());<br />
break;<br />
case 2:<br />
tc.setCellRenderer(new RightRenderer());<br />
break;<br />
case 3:<br />
tc.setCellRenderer(new CenterRenderer());<br />
break;<br />
case 4:<br />
tc.setCellRenderer(new DateRenderer());<br />
break;<br />
}<br />
;</p>
<p>}</p>
<p>/**<br />
* Mengatur lebar column tertentu<br />
* @param column nomor column dimulai dari 0<br />
* @param width lebar column yang diinginkan<br />
*/<br />
public void setColumnWidth(int column, int width) {<br />
tc = tcm.getColumn(column);<br />
tc.setPreferredWidth(width);<br />
}</p>
<p>/**<br />
* Mengaktirfkan Table agar bisa dishortir<br />
*/<br />
public void activateShorter() {<br />
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);<br />
this.setRowSorter(sorter);<br />
}<br />
}</p>
<p>
OK sekarang saatnya kita coba gunakan class CustomerTable ini dalam aplikasi seperti di awal tulisan ini.
</p>
<p>public class Tester extends javax.swing.JFrame {</p>
<p>/** Creates new form Tester */<br />
public Tester() {<br />
initComponents();<br />
Object data[][] = {<br />
{"1", "Bambang Pamungkas", "Salatiga", 2000000000},<br />
{"2", "Ronaldo", "Brazil", 1000000000},<br />
{"3", "Kaka", "Brazil", 230000000},<br />
{"4", "Slamet", "Solo", 2000001}<br />
};<br />
String title[] = {"No.","Nama","Alamat","Pendapatan"};</p>
<p>this.table = new CustomeTable(title, data);</p>
<p>// mengubah lebar column<br />
table.setColumnWidth(0,10);</p>
<p>//rata tengah<br />
table.setColumnFormat(2, CustomeTable.CENTER);</p>
<p>//currency format</p>
<p>table.setColumnFormat(3, CustomeTable.CURRENCY);</p>
<p>// table dapat dishort<br />
table.activateShorter();</p>
<p>this.scroll.setViewportView(table);</p>
<p>}<br />
CustomeTable table;</p>
<p>//code-code program yang lain ....</p>
<p>}</p>
<p>
Perhatikan perubahan yang terjadi
sekarang kita memiliki Table yang lebih baik karena menampilkan format data sesuai dengan yang kita inginkan.
Maaf kalo source codenya berantakan..
happy coding


Recent Comments