Search code examples
javaswingjtabletablecellrendererjtableheader

JTable header background color


I'm trying to put background color on the JTable header but it seems that it doesnt change the header's color this is my code for my JTable.. what am I doing wrong?

Color headerColor = new Color(25, 78, 132);
        itemTable = new JTable(){

        public boolean isCellEditable(int row, int column) {                
            return false;               
        };
        Color rowColor1 = new Color(99, 154, 206);
        Color rowColor2 = new Color(148, 186, 231);
        public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
            Component stamp = super.prepareRenderer(renderer, row, column);
            if (row % 2 == 0)
                stamp.setBackground(rowColor1);
            else
                stamp.setBackground(rowColor2);
            return stamp;
        }
        };
        JTableHeader Header =  itemTable.getTableHeader();
        Header.setBackground(headerColor);
        Header.setReorderingAllowed(false);
        itemTable.setFont(fpanelItemTable);
        itemTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
        //itemTable.setPreferredScrollableViewportSize(new Dimension(200,200));
        //itemTable.setFillsViewportHeight(true);
        itemTable.setAutoCreateRowSorter(true);

Solution

  • where should I put it? I want my header and rows to have color

    • for example, one of three possible ways

    enter image description here

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class SelectedTableHeader {
    
        private JFrame frame = new JFrame("Table Demo");
        private JTableHeader header;
        private Object selectedColumn = null;
        private String[] columnNames = {"String", "Integer", "Float", "Double", "Locale & Double", "Boolean"};
        private Object[][] data = {
            {"aaa", new Integer(12), new Float(12.15), new Double(100.05), new Double(12.05), true},
            {"bbb", new Integer(5), new Float(7.154), new Double(6.1555), new Double(417.55), false},
            {"CCC", new Integer(92), new Float(0.1135), new Double(3.1455), new Double(11.05), true},
            {"ddd", new Integer(12), new Float(31.15), new Double(10.05), new Double(23.05), true},
            {"eee", new Integer(5), new Float(5.154), new Double(16.1555), new Double(17.55), false},
            {"fff", new Integer(92), new Float(4.1135), new Double(31.1455), new Double(3.05), true}};
        private TableModel model = new DefaultTableModel(data, columnNames) {
            private static final long serialVersionUID = 1L;
    
            @Override
            public Class<?> getColumnClass(int column) {
                return getValueAt(0, column).getClass();
            }
        };
        private JTable table = new JTable(model) {
    
                private static final long serialVersionUID = 1L;
    
                @Override
                public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
                    Component c = super.prepareRenderer(renderer, row, column);
                    int firstRow = 0;
                    int secondRow = 0;
                    int lastRow = table.getRowCount() - 1;
                    if (row == lastRow) {
                        ((JComponent) c).setBackground(Color.GREEN);
                    } else if (row == firstRow) {
                        ((JComponent) c).setBackground(Color.YELLOW);
                    } else {
                        ((JComponent) c).setBackground(table.getBackground());
                    }
                    return c;
                }
            };
    
        public SelectedTableHeader() {
            header = table.getTableHeader();
            header.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    JTableHeader h = (JTableHeader) e.getSource();
                    int i = h.columnAtPoint(e.getPoint());
                    Object o = h.getColumnModel().getColumn(i).getHeaderValue();
                    if (i < 0) {
                        selectedColumn = null;
                        return;
                    }
                    selectedColumn = o;
                    h.requestFocusInWindow();
                }
            });
            final TableCellRenderer hr = table.getTableHeader().getDefaultRenderer();
            header.setDefaultRenderer(new TableCellRenderer() {
                private JLabel lbl;
                @Override
                public Component getTableCellRendererComponent(
                        JTable table, Object value, boolean isSelected, boolean hasFocus, 
                        int row, int column) {
                    if (selectedColumn == value) {
                        lbl = (JLabel) hr.getTableCellRendererComponent(table, value, 
                                true, true, row, column);
                        lbl.setBorder(BorderFactory.createCompoundBorder(
                                BorderFactory.createEmptyBorder(1, 1, 1, 1), 
                                BorderFactory.createLineBorder(Color.red, 1)));
                        lbl.setHorizontalAlignment(SwingConstants.LEFT);
                        lbl.setBackground(lbl.getBackground());
                    } else {
                        lbl = (JLabel) hr.getTableCellRendererComponent(table, value, 
                                false, false, row, column);
                        lbl.setBorder(BorderFactory.createCompoundBorder(
                                lbl.getBorder(), 
                                BorderFactory.createEmptyBorder(1, 1, 1, 1)));
                        lbl.setHorizontalAlignment(SwingConstants.CENTER);
                        lbl.setBackground(Color.ORANGE);
                    }
                    if (column == 0) {
                        lbl.setForeground(Color.red);
                    } else {
                        lbl.setForeground(header.getForeground());
                    }
                    /*return (value == selectedColumn) ? hr.getTableCellRendererComponent(
                     table, value, true, true, row, column) : hr.getTableCellRendererComponent(
                     table, value, false, false, row, column);*/
                    return lbl;
                }
            });
            table.setRowHeight(20);
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scroll = new JScrollPane(table);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(scroll);
            frame.pack();
            frame.setLocation(150, 150);
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    SelectedTableHeader sTH = new SelectedTableHeader();
                }
            });
        }
    }