Ever wanted to change the color of a JCheckBox in a JTable to the table's foreground color? Now you can!

Example Screenshot:
Lower Table has a white check instead of a black check!

This is a renderer for Booleans in a JTable.

JAVA:
  1. import java.awt.Color;
  2. import java.awt.Component;
  3. import java.awt.Graphics;
  4.  
  5. import javax.swing.JCheckBox;
  6. import javax.swing.JTable;
  7. import javax.swing.table.TableCellRenderer;
  8.  
  9. /**
  10. * This class implements a boolean renderer for a JTable.  It overrides the icon for the CheckBox to draw in the
  11. * foreground color.
  12. */
  13. public class BooleanRenderer extends JCheckBox implements TableCellRenderer {
  14.    public BooleanRenderer() {
  15.        super();
  16.        setHorizontalAlignment(JCheckBox.CENTER);
  17.        setIcon(new ColorableMetalCheckBoxIcon());
  18.    }
  19.  
  20.    public Component getTableCellRendererComponent(JTable table, Object value,
  21.                                                   boolean isSelected, boolean hasFocus, int row, int column) {
  22.        if (isSelected) {
  23.            setForeground(table.getSelectionForeground());
  24.            super.setBackground(table.getSelectionBackground());
  25.        } else {
  26.            setForeground(table.getForeground());
  27.            setBackground(table.getBackground());
  28.        }
  29.        setSelected((value != null && ((Boolean) value).booleanValue()));
  30.        return this;
  31.    }
  32.  
  33.    /**
  34.     * Changes the check box check mark to be the foreground color.<br/>
  35.     * <b>NOTE:</b>This was found here http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4449413 .
  36.     */
  37.    static class ColorableMetalCheckBoxIcon extends javax.swing.plaf.metal.MetalCheckBoxIcon {
  38.        protected void drawCheck(Component c, Graphics g, int x, int y) {
  39.            final Color old = g.getColor();
  40.            g.setColor(c.getForeground());
  41.            super.drawCheck(c, g, x, y);
  42.            g.setColor(old);
  43.        }
  44.    }
  45. }

This is the corresponding Editor.

JAVA:
  1. import java.awt.Component;
  2.  
  3. import javax.swing.DefaultCellEditor;
  4. import javax.swing.JCheckBox;
  5. import javax.swing.JTable;
  6.  
  7. /**
  8. * This class implements a boolean editor for a JTable.  It overrides the icon for the CheckBox to draw in the
  9. * foreground color.
  10. */
  11. public class BooleanEditor extends DefaultCellEditor {
  12.  
  13.    public BooleanEditor() {
  14.        super(new JCheckBox());
  15.        JCheckBox c = (JCheckBox) getComponent();
  16.        c.setHorizontalAlignment(JCheckBox.CENTER);
  17.        c.setIcon(new BooleanRenderer.ColorableMetalCheckBoxIcon());
  18.    }
  19.  
  20.    public Component getTableCellEditorComponent(JTable table,
  21.                                                 Object value,
  22.                                                 boolean isSelected,
  23.                                                 int row,
  24.                                                 int column) {
  25.        JCheckBox c = (JCheckBox) getComponent();
  26.        if (isSelected) {
  27.            c.setForeground(table.getSelectionForeground());
  28.            c.setBackground(table.getSelectionBackground());
  29.        } else {
  30.            c.setForeground(table.getForeground());
  31.            c.setBackground(table.getBackground());
  32.        }
  33.        c.setSelected((value != null && ((Boolean) value).booleanValue()));
  34.        return c;
  35.    }
  36. }

Quick and Dirty Tester Program!

JAVA:
  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.FlowLayout;
  4.  
  5. import javax.swing.*;
  6. import javax.swing.table.AbstractTableModel;
  7. import javax.swing.table.DefaultTableModel;
  8.  
  9. /**
  10. * shows how to use the BooleanEditor and the BooleanRenderer.
  11. */
  12. public class JTableBooleanTester extends JFrame{
  13.     public JTableBooleanTester(){
  14.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  15.        
  16.         Dimension dim = new Dimension(200,75);
  17.        
  18.        
  19.         TestTableModel ttm = new TestTableModel();
  20.        
  21.         JTable table1 = new JTable(ttm);
  22.         table1.setForeground(Color.WHITE);
  23.         table1.setBackground(Color.DARK_GRAY);
  24.         JScrollPane sp1 = new JScrollPane(table1);
  25.         sp1.setPreferredSize(dim);
  26.        
  27.         JTable table2 = new JTable(ttm);
  28.         table2.setForeground(Color.WHITE);
  29.         table2.setBackground(Color.DARK_GRAY);
  30.         table2.setDefaultEditor(Boolean.class, new BooleanEditor());
  31.         table2.setDefaultRenderer(Boolean.class, new BooleanRenderer());
  32.         JScrollPane sp2 = new JScrollPane(table2);
  33.         sp2.setPreferredSize(dim);
  34.        
  35.         getContentPane().setLayout(new BoxLayout(getContentPane(),BoxLayout.Y_AXIS));
  36.         getContentPane().add(sp1);
  37.         getContentPane().add(sp2);
  38.        
  39.         pack();
  40.     }
  41.  
  42.     public static void main(String[] args) throws Exception {
  43.         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  44.         SwingUtilities.invokeLater(new Runnable(){
  45.             public void run() {
  46.                 JFrame frame = new JTableBooleanTester();
  47.                 frame.setVisible(true);
  48.             }
  49.            
  50.         });
  51.     }
  52.    
  53.     static class TestTableModel extends AbstractTableModel{
  54.         Object[][] data = {{Boolean.TRUE, "Testing 1!"},{Boolean.FALSE,"Testing 2!"}};
  55.         Object[] names = {"Bool", "Something!"};
  56.        
  57.         public int getRowCount() {
  58.             return data.length;
  59.         }
  60.  
  61.         public int getColumnCount() {
  62.            
  63.             return names.length;
  64.         }
  65.  
  66.         public Object getValueAt(int rowIndex, int columnIndex) {
  67.             return data[rowIndex][columnIndex];
  68.         }
  69.        
  70.         public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  71.             switch(columnIndex){
  72.             case 0:
  73.                 data[rowIndex][columnIndex] = aValue;
  74.             }
  75.             fireTableDataChanged();
  76.         }
  77.        
  78.         public boolean isCellEditable(int rowIndex, int columnIndex) {
  79.             return 0 == columnIndex;
  80.         }
  81.  
  82.         public Class getColumnClass(int columnIndex){
  83.             return data[0][columnIndex].getClass();
  84.         }
  85.     }
  86. }