简体   繁体   中英

Change background color of jtable column heads

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());

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.

below is my solution in my Netbeans GUI project:

不同颜色的jtable列标题

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. 在此处输入图片说明 在此处输入图片说明

  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.

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();
                    }
                });
            }
        }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM