Search code examples
javaswingjtabletablecellrendererjtableheader

Set JTable Background Header Image


Is there an easy way to set the background of a JTable header to an image? I have currently have a class that extends DefaultTableCellRenderer to change the formatting for alternate rows (and the header just as a test):

public class CustomTable extends DefaultTableCellRenderer{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public CustomTable() {
        super();
        setHorizontalAlignment(JLabel.LEFT);
        setFont(new Font("Apple Casual", 1, 12));

    }

    public Component getTableCellRendererComponent(JTable table, Object value, boolean   isSelected, boolean hasFocus, int row, int column) { 
        Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 

        JTableHeader header = table.getTableHeader();
          header.setBackground(Color.black);
          header.setForeground(Color.yellow);

        if (! table.isRowSelected(row)) {
            if(!((row%2) == 0)) {
                c.setBackground(Color.GRAY);
                c.setForeground(Color.WHITE);
            }
            else {
                c.setBackground(table.getBackground());
                c.setForeground(table.getForeground());
            }
        }
        return c; 
    } 
}

I'm doing something similar (which works as I want it to) for JButtons:

public class CustomButton extends JButton {

     /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private Image img;

    public CustomButton(String a){
        super(a);
        try{
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            InputStream inputStream = classLoader.getResourceAsStream("lightWoodTexture.jpg");
            img = ImageIO.read(inputStream);
            this.setPreferredSize(new Dimension(100,50));
            this.setBackground(new Color(1,1,1, (float) 0.01));
            this.setFont(new Font("Apple Casual", 1, 12));
            this.setForeground(Color.WHITE);
        } catch(IOException e) {
            System.out.println(e.toString());
        }
    }

     @Override
        protected void paintComponent(Graphics g) {
            g.drawImage(img,0,0,null);
            super.paintComponent(g);
        }
}

Solution

  • table.getTableHeader().setDefaultRenderer(new ImageHeaderRenderer());
    

    This code is setting your renderer to the table header. And in renderer you can draw your image to a JLabel.

    Image cell renderer:

    class ImageHeaderRenderer extends DefaultTableCellRenderer {
      JLabel label = new JLabel();
    
      ImageIcon icon = new ImageIcon(getClass().getResource("image.png"));
    
      public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
          boolean hasFocus, int row, int column) {
        label.setText("");
        label.setIcon(icon);
        return label;
      }
    }