-->

Mewarnai cell pada JTable

Oke langsung saja ke topik sudah lama tidak mengisi artikel lagi. Kali ini ane ingin memberikan sedikit pengalaman dalam memberikan warna pada JTable. Mewarnai pada JTable tidaklah sulit. Untuk membuatnya cukup mudah yaitu tinggal membuat Renderer yang mewarisi dari tabel TableCellRenderer. Nah untuk membuat sedikit modifikasi. Nah langsung saja ada beberapa cara yang dapat digunakan untuk memenuhi tujuan ini.Sebelumnya ane ingin memberikan sedikit gambaran bagaimana nanti hasil yang akan kita peroleh. Langsung saja lihat gambarnya..
Nah misalnya kita membunyai JTable dengan nama myTable langsung saja bagaimana cara kita membuatnya..
myTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

            @Override
            public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                if (row % 2 == 1) {
                    label.setBackground(Color.red);
                } else {
                    label.setBackground(Color.BLUE);
                }
                label.setOpaque(true);
                label.setText((String) value);
                return label;
            }
        });
Nah sedikit penjelasan yang bisa ane kasih. Fungsi setDefaultRenderer ini nanti akan memberikan aksi dalam mengganti object yang ada di cell jtable ke dalam object baru yang mengextends/mewarisi java.awt.Component. Nah caranya yaitu dengan mengganti isi cell dengan tipe tertentu dalam kasus ini adalah Object yang mengisi cell. Bisa juga renderer ini digunakan untuk tipe tertentu saja misalnya Integer ataupun String. Ataupun tipe data lainnya tinggal ganti aja dari Object.class menjadi Integer.class misalnya.
Nah dari component yang ada tersebut dari kode tersebut bisa dilihat bahwa cell tersebut nantinya akan diganti dengan object yang kita inginkan disini saya memakai JLabel. Jlabel ini harus kit set sesuai dengan isi dari cellnya yaitu value yang dapat kita casting ke dalam tipe yang sesungguhnya misalnya String.
Untuk memodifikasi mana saja baris atau kolom yang dapat perlakuan manfaatkan parameter row dan column. atau bisa juga melalui cara ini


myTable = new JTable() {

            public TableCellRenderer getCellRenderer(int row, int column) {
                if ((row == 3) && (column == 2)) {
                    return new DefaultTableCellRenderer() {

                        @Override
                        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                            JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                            if (row % 2 == 1) {
                                label.setBackground(Color.red);
                            } else {
                                label.setBackground(Color.BLUE);
                            }
                            label.setOpaque(true);
                            label.setText((String) value);
                            return label;
                        }
                    };
                }
                // else...
                return super.getCellRenderer(row, column);
            }
        };
Nah untuk kode yang kedua ini digunakan waktu mendefinisikan dalam membuat tabel. jadi langsung diberikan tablecellrenrernya. Object yang diganti bukan cuma JLabel saja bisa juga diberi JTextField atau yang lainnya.
Selamat mencoba
Oke silahkan modifikasi bila diperlukan. jika ada pertanyaan silahkan dikomen.
Facebook Comments

12 komentar

saya mau tanya bang...

kalo kita mau ngasih warna pada cell yang kita kehendaki gimana ?
misal saya ingin memberikan warna biru hanya pada cell (2,3) yaitu baris 2 dan kolom 3...itu bagaimana?
soalnya saya mau membuat gantt chart dari JTable...
trima kasih bang...
mohon pencerahannya...

Balas

Kode yang ini tinggal dimodifikasi sedikit :
myTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JLabel label = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (row== 2 && column==3)
label.setBackground(Color.BLUE)
label.setOpaque(true);
label.setText((String) value);
return label;
}
});

Balas

trima kasih banyak mas...
setelah akhirnya mempelajari kodenya, saya berhasil...

sekali lagi terima kasih...

Balas

mas klo isi tabelnya berasal dari Retrive tabel database, dan ada kondisi jika status = 1 (LUNAS) dan status = 2 (BELUM BAYAR)

Balas

coba baca ini ya..
http://stackoverflow.com/questions/14425364/swing-setting-the-color-of-a-cell-based-on-the-value-of-a-cell

Balas

oke lancar dan running...
maaf nih mas saya mau tanya lg klo isi tabelnya d ambil dr database gmana ya...?? karena yg saya praktekin ini menggunakan array data statis...

String data[][] = {{"01","Herman","programmer","1"},{"02","Arif","Multi Media","0"},{"03","Susan","Akuntansi","0"},{"04","Ali","Bahasa Indonesia","1"}};
String col[] = {"No","Nama","Jurusan","Status"};

maklum nih newbie bgt ttg java, ada referensikah untuk ambil datanya dari database dan menggunakan fungsi yg mas berikan...??

Terima Kasih

Balas

baca ini ya.. http://stackoverflow.com/questions/11983554/reading-data-from-database-and-storing-in-array-list-object

Balas

hadeuuhh... belum ngerti saya mas, ada contoh source codenya gak mas?? dengan menggunakan JTable yang isi datanya dari database...

Terima Kasih

Balas

maksud saya contoh source code JTable yang isi datanya dari database dan menggunakan fungsi warna seperti di atas.

Terima Kasih

Balas

wah gak ada nih kalau contoh... tinggal ganti data sourcenya doang.. pelajari aja database di java pasti bisa..

Balas

ini source yg saya buat, saya minta tolong dikoreksi...


package SekolahCrud;

import java.sql.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class tabelTest {

public static void main(String[] args) {
tabelTest saddingKolom = new tabelTest();
}

public tabelTest(){
JFrame frame = new JFrame("Contoh Sadding Kolom");
JPanel panel = new JPanel();

try{
Class.forName("com.mysql.jdbc.Driver");
Connection kon = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_latihan?user=root&password=");
String sql = "SELECT * FROM kamar";
Statement sta = kon.createStatement();
ResultSet rse = sta.executeQuery(sql);

while (rse.next()) {
Object[] model = new Object[6];
model[0] = rse.getString("id_kamar");
model[1] = rse.getString("nm_kamar");
model[2] = rse.getString("status");
}
}catch(Exception e){
e.printStackTrace();
}

DefaultTableModel model = new DefaultTableModel(data,col);

JTable table = new JTable(model);
for(int i=0;i<table.getColumnModel().getColumnCount();i++){
table.getColumnModel().getColumn(i).setCellRenderer(new TabelCellRenderer());
}

JTableHeader header = table.getTableHeader();
header.setBackground(Color.yellow);
JScrollPane pane = new JScrollPane(table);
panel.add(pane);
frame.add(panel);
frame.setSize(460,200);
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public class TabelCellRenderer extends DefaultTableCellRenderer{

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,boolean hasFocus, int row, int column) {
Component comp=super.getTableCellRendererComponent(table, value, isSelected, isSelected, row, column);
Object objek=table.getModel().getValueAt(row,3);
if(objek.equals("1")){
comp.setBackground(Color.green);
}
else{
comp.setBackground(null);
}return comp;
}
}

}


Terima Kasih

Balas

alhamdulillah terimakasih mas" ilmunya,,

kalo ada metode yg lebih sempurna tolong share ya

Balas