{Kurung Kurawal}

JTable dengan Custom Cell Editor dan Renderer

Post kali ini, saya ingin menyajikan sourcecode untuk membuat Jtable dengan Custom Cell Editor dan Renderer. Seperti screenshot di atas.

Berikut source code utamanya,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package jtablecustom;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
 
/**
 *
 * @author Konglie
 */
public class JTableCustom extends JFrame {
    // akan diakses dari CustomRenderer_Color
    // dibuat static agar lebih mudah
    // dalam kasus sebenarnya, bisa saja ambil dari database, atau datasource lainnya
    public static List<String> colorChoices;
    public static List<Color> colors;
 
    public JTableCustom(){
        super("JTable with custom elements");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        initComponents();
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }
 
    private JTable table;
    private DefaultTableModel model;
    private void initComponents(){
        // daftar pilihan warna, akan digunakan sebagai contoh combobox
        colorChoices = new ArrayList<String>();
        colorChoices.add("Merah");
        colorChoices.add("Biru");
        colorChoices.add("Pink");
        colorChoices.add("#00FF00");
 
        // korelasi nama warna dengan object warna sesungguhnya
        // urutan harus sama (secara logical) dengan colorChoices
        colors = new ArrayList<Color>();
        colors.add(Color.RED);
        colors.add(Color.BLUE);
        colors.add(Color.PINK);
        // contoh membuat warna dari kode hexa
        colors.add(new Color(0x00FF00));
 
        String[] columns = new String[]{"No.", "Teks", "ComboBox", "Spinner"};
        model = new DefaultTableModel(null, columns){
            @Override
            public boolean isCellEditable(int row, int column) {
                // kolom "No." tidak dapat diedit
                return column > 0;
            }
        };
        table = new JTable(model);
        table.setRowHeight(25);
 
        // combobox
        // misalnya, memilih warna
        table.getColumnModel().getColumn(2).setCellRenderer(new CustomRenderer_Color());
        table.getColumnModel().getColumn(2).setCellEditor(new CustomEditor_ComboBox());
 
        // JSpinner
        table.getColumnModel().getColumn(3).setCellEditor(new CustomEditor_Spinner());
 
        // isi data table
        Random r = new Random();
        for(int i = 1; i<= 10; i++){
            model.addRow(new Object[]{
                i,
                "Baris ke: " + i,
                colorChoices.get(r.nextInt(colorChoices.size())),
                1990 - i 
            });
        }
 
        JScrollPane sp = new JScrollPane(table);
        getContentPane().add(sp, BorderLayout.CENTER);
    }
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            @Override
            public void run(){
                new JTableCustom();
            }
        });
    }
 
}

Untuk me-render atau melukis cell nya, saya berikan contoh membuat warna latar cell tersebut menjadi sesuai dengan pilihan

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package jtablecustom;
 
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
 
/**
 *
 * @author Konglie
 */
public class CustomRenderer_Color extends DefaultTableCellRenderer {
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
        Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        // cell dengan index 2 adalah lokasi warna
        String warna = table.getValueAt(row, 2).toString();
        Color background = JTableCustom.colors.get(
                JTableCustom.colorChoices.indexOf(warna)
        );
        cell.setBackground(background);
 
        // warna text
        cell.setForeground(Color.WHITE);
 
        return cell;
    }
}

Kemudian, contoh editor dengan menggunakan JComboBox

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package jtablecustom;
 
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.TableCellEditor;
 
/**
 *
 * @author Konglie
 */
public class CustomEditor_ComboBox extends AbstractCellEditor implements TableCellEditor {
    JComboBox cmp = null;
    @Override
    public Object getCellEditorValue() {
        init();
        return JTableCustom.colorChoices.get(cmp.getSelectedIndex());
    }
 
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        init();
 
        // pilih warna saat ini
        cmp.setSelectedIndex(JTableCustom.colorChoices.indexOf(value.toString()));
 
        return cmp;
    }
 
    private void init(){
        // jika sudah pernah di-initialize, ya sudah biarkan saja
        if(cmp != null){
            return;
        }
 
        cmp = new JComboBox(JTableCustom.colorChoices.toArray());
        cmp.setEditable(false);
        cmp.setSelectedIndex(0);
    }
 
}

Terakhir, contoh editor dengan JSpinner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package jtablecustom;
 
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JSpinner;
import javax.swing.JTable;
import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel;
import javax.swing.table.TableCellEditor;
 
/**
 *
 * @author Konglie
 */
public class CustomEditor_Spinner extends AbstractCellEditor implements TableCellEditor {
    JSpinner cmp = null;
 
    @Override
    public Object getCellEditorValue() {
        init();
        return cmp.getModel().getValue().toString();
    }
 
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        init();
 
        try {
            // nilai saat ini
            cmp.getModel().setValue(Integer.parseInt(value.toString()));
        } catch(Exception e){}
 
        return cmp;
    }
 
    private void init(){
        // jika sudah pernah di-initialize, ya sudah biarkan saja
        if(cmp != null){
            return;
        }
 
        // contoh data spinner
        // mulai dari 1975, minimum 1950, max 2000, 
        // tambahkan/kurangi 1 untuk setiap kenaikan/penurunan
        SpinnerModel sm = new SpinnerNumberModel(1975, 1950, 2000, 1);
        cmp = new JSpinner(sm);
 
        // menghilang format angka ribuan
        cmp.setEditor(new JSpinner.NumberEditor(cmp, "#"));
    }
}

Demikian, semoga berguna untuk kita semua.