Kamis, 25 Agustus 2011

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.

12 komentar:

  1. 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...

    BalasHapus
  2. 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;
    }
    });

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

    sekali lagi terima kasih...

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

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

    BalasHapus
  6. 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

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

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

      Terima Kasih

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

      Terima Kasih

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

    BalasHapus
    Balasan
    1. 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

      Hapus
  8. alhamdulillah terimakasih mas" ilmunya,,

    kalo ada metode yg lebih sempurna tolong share ya

    BalasHapus