0

I have a table with four columns, and I would like each column head to be a different color. I only want the column head to have color, not the rest of the cells in the column. I tried using the DefaultTableCellRenderer, but it made every cell red except for the column heads. What could I change in my code (below) to individually assign a color to each column head?

class CustomRenderer extends DefaultTableCellRenderer{

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
{
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, 3, 3);
    c.setBackground(new java.awt.Color(255,72,72));
    return c;
}

}

    table.setDefaultRenderer(Object.class, new CustomRenderer());
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
davidVee
  • 61
  • 3
  • 13

3 Answers3

1

You can't set each individual color easily I'm afraid.

// Get the column header for your specific column
JTableHeader th = table.getTableHeader();
TableColumnModel tcm = th.getColumnModel();
TableColumn tc = tcm.getColumn(column);

/* Create a new renderer for column headers, and
pass in the column number so you can differntiate
which column will be which color. */
tc.setCellRenderer(new headerCellRenderer(column));

This should suit your needs though.

Rob Wagner
  • 4,391
  • 15
  • 24
  • Sorry I'm kind've new to java. I'm getting an error "The method setCellRenderer(TableCellRenderer) in the type TableColumn is not applicable for the arguments (headerCellRenderer)". What does that mean? – davidVee Jul 19 '12 at 19:36
  • You have to implement headerCellRenderer yourself, as you did with customRenderer. – Rob Wagner Jul 19 '12 at 19:38
  • Let me make sure I understood you correctly, I need to make another class, similar to CustomRenderer. Except this new class will need to be able to take a column as a parameter? – davidVee Jul 19 '12 at 19:51
  • I guess what I'm trying to ask is will that be the only difference between CustomRenderer and HeaderCellRenderer? – davidVee Jul 19 '12 at 19:52
  • Yup, except you'll need to add the logic of choosing which color based on the column number. – Rob Wagner Jul 19 '12 at 20:06
  • Sorry for all the questions. I can figure out the logic part once I am able to change the colors of one of column headings. I tried changing the "int row, int column" parameters in the getTableCellRendererComponent, but it isn't changing which cell is being accessed. Where do I specify which cell/column head I'm trying to change? – davidVee Jul 19 '12 at 20:17
  • Its the column parameter that is coming in. – Rob Wagner Jul 19 '12 at 20:25
  • Right so I put that in as a parameter, but where in the class do I use the parameter? – davidVee Jul 19 '12 at 20:25
  • You don't, it calls this function as it renders each cell. – Rob Wagner Jul 19 '12 at 20:28
0

below is my solution in my Netbeans GUI project:

jtable column header with different color

Make column header with different color ,i have 3 steps below: 1.build a class in my project package. for example i made "blueHeaderRender.java" in my project package. enter image description here enter image description here

  1. use this class in your project. my GUI project code below:

    private void sqquery1ActionPerformed(java.awt.event.ActionEvent evt) {
    //refresh jtable data DefaultTableModel model = (DefaultTableModel) jtps.getModel(); model.setRowCount(0); DefaultTableModel model02 = (DefaultTableModel) jtsc.getModel(); model02.setRowCount(0); Connection conn = getConnection(); String date1=getdate01.getText(); String date2=getdate02.getText(); DateFormat df= new SimpleDateFormat("yyyy-MM-dd"); if(jDateChooser1.getDate()!=null&jDateChooser2.getDate()!=null){ getdate01.setText(df.format(jDateChooser1.getDate())); getdate02.setText(df.format(jDateChooser2.getDate())); } else{ getdate01.setText(""); getdate02.setText(""); }

    if(!"".equals(getdate01.getText())&!"".equals(getdate02.getText())){
        String query001 =" SELECT * FROM pscard_in_out WHERE CAST(datetime AS date) BETWEEN '"+getdate01.getText()+"' AND '"+getdate02.getText()+"'  ";
    
        String query002 =" SELECT * FROM sccard_in_out WHERE CAST(datetime AS date) BETWEEN '"+getdate01.getText()+"' AND '"+getdate02.getText()+"'  ";
        try {
            pstmt = (PreparedStatement) conn.prepareStatement(query001);
            rs = pstmt.executeQuery();
    
            jtps.setModel(DbUtils.resultSetToTableModel(rs));  //neen import rs2xml.jar  in libraries
            jtps.getColumnModel().getColumn(2).setHeaderRenderer(new blueHeaderRenderer());
            jtps.getColumnModel().getColumn(4).setHeaderRenderer(new blueHeaderRenderer());
            jtps.getColumnModel().getColumn(3).setHeaderRenderer(new redHeaderRenderer());
            jtps.getColumnModel().getColumn(5).setHeaderRenderer(new redHeaderRenderer());
            // resizing the column width
            jtps.getColumnModel().getColumn(0).setPreferredWidth(40);
            jtps.getColumnModel().getColumn(1).setPreferredWidth(190);
            jtps.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
    
            while (rs.next()){}
    
            pscardSum();
            pstmt.close();
            rs.close();
            conn.close();
    
        } catch (SQLException ex) {
        }
    
    }
    

    }

by the way ,if u want another color in different column header,u can make more class in your project to be used in your project.

0

The above code marked with the green check mark is correct, but only to set the properties of non-header cells. Note that there is a difference between TableColumn class methods setCellRenderer() and setHeaderRenderer().

Resulting table with header cells of multiple colors and non-header yellow cells

/********************* FULL WORKING IMPLEMENTATION. *************************
  -Table with custom header (multiple colors) and custom non-header cells.
  -Cells' manipulated properties are colors, font, opacity and border types.*/

        import java.awt.Color;
        import java.awt.Component;
        import java.awt.Dimension;
        import java.awt.Font;
        import java.awt.GridLayout;
        import javax.swing.BorderFactory;
        import javax.swing.JComponent;
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JPanel;
        import javax.swing.JScrollPane;
        import javax.swing.JTable;
        import javax.swing.border.Border;
        import javax.swing.table.AbstractTableModel;
        import javax.swing.table.TableCellRenderer;
        import javax.swing.table.TableColumn;

        public class CustomHeaderTable  extends JPanel
        {
            CustomHeaderTable()
            {
                super(new GridLayout(1,0));

                JTable table = new JTable(new MyTableModel());
                table.setPreferredScrollableViewportSize(table.getPreferredSize());
                table.setFillsViewportHeight(true);
                table.setPreferredScrollableViewportSize(new Dimension(500, 70));

                //Setting header cells
                CustomCellRenderer customHeaderCellRenderer = 
                        new CustomCellRenderer(Color.white,
                                               Color.red,
                                               new Font("Consolas",Font.BOLD,14),
                                               BorderFactory.createEtchedBorder(),
                                               true);

                for(int columnIndex = 0; columnIndex < table.getTableHeader().getColumnModel().getColumnCount(); columnIndex++)
                {
                    TableColumn tc = table.getTableHeader().getColumnModel().getColumn(columnIndex);    
                    tc.setHeaderRenderer(customHeaderCellRenderer);
                }

                //Setting non-heather's cells colors, font, borders, and opacity
                CustomCellRenderer customNonHeaderCellRenderer = 
                        new CustomCellRenderer(Color.blue,
                                               Color.yellow,
                                               new Font("Courier",Font.PLAIN,12),
                                               BorderFactory.createLineBorder(Color.gray),
                                               true);

                for(int columnIndex = 0; columnIndex < table.getTableHeader().getColumnModel().getColumnCount(); columnIndex++)
                {
                    TableColumn tc = table.getTableHeader().getColumnModel().getColumn(columnIndex);    
                    tc.setCellRenderer(customNonHeaderCellRenderer);
                }

                JScrollPane scrollpane = new JScrollPane(table);
                add(scrollpane);
            }

            public class CustomCellRenderer extends JLabel implements TableCellRenderer
            {
                public CustomCellRenderer(Color foregroundColor, Color backgroundColor, Font font, Border border, boolean isOpaque)
                {
                    setFont(font);
                    setOpaque(isOpaque);
                    setForeground(foregroundColor);
                    setBackground(backgroundColor);
                    setBorder(border); 
                }

                @Override
                public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) 
                {
                    setText(value.toString());
                    return this;
                }
            }

            class MyTableModel extends AbstractTableModel 
            {
                private String[] columnNames = {"First Name",
                                                "Last Name",
                                                "Sport",
                                                "# of Years",`enter code here`
                                                "Vegetarian"};
                private Object[][] data = {
                {"Kathy", "Smith",
                 "Snowboarding", new Integer(5), false},
                {"John", "Doe",
                 "Rowing", new Integer(3), true},
                {"Sue", "Black",
                 "Knitting", new Integer(2), false},
                {"Jane", "White",
                 "Speed reading", new Integer(20), true},
                {"Joe", "Brown",
                 "Pool", new Integer(10), false}
                };

                public int getColumnCount() 
                {
                    return columnNames.length;
                }

                public int getRowCount() 
                {
                    return data.length;
                }

                public String getColumnName(int col) 
                {
                    return columnNames[col];
                }

                public Object getValueAt(int row, int col) 
                {
                    return data[row][col];
                }

                public Class getColumnClass(int c) 
                {
                    return getValueAt(0, c).getClass();
                }

                public boolean isCellEditable(int row, int col) 
                {
                    if (col < 3) 
                    {
                        return false;
                    } 
                    else 
                    {
                        return true;
                    }
                }
            }

            public static void createAndShowGUI()
            {
                JFrame frame = new JFrame("CustomHeaderTable");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                JComponent newContentPane = new CustomHeaderTable();
                newContentPane.setOpaque(true);
                frame.setContentPane(newContentPane);

                frame.pack();
                frame.setLocationRelativeTo( null );
                frame.setVisible(true);
            }

            public static void main(String[] args) {
                javax.swing.SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        createAndShowGUI();
                    }
                });
            }
        }