This discussion is archived
2 Replies Latest reply: May 23, 2012 9:04 AM by 939186 RSS

Problem making JTableHeader transparent

939186 Newbie
Currently Being Moderated
Hi,

I have a problem with JTables, in particular the JTableHeader. I can't seem to make it transparent. I have a JTable placed on top of a panel with a gradient color, and I want the table to be transparent so the gradient will be visible through the table's content.

I have used setOpaque(false) on both the JTable and its header, and I have made a transparent TableCellRenderer which I use for both the table's cells and its header. Although it works for the table's content area, the header still gets painted as a solid rectangle. I have even tried overriding the look and feel for the JTable and JTableHeader, but nothing I do seems to have any effect.

When googling the problem i find a lot of information about making JTable transparent, but I can't seem to find any relevant information about the table header in particular.

Heres a SSCCE to better illustrate what I've tried so far (no changes are made to the look and feel in this example):

import java.awt.Color;
import java.awt.Component;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableColumnModel;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;

public class Main {

    private static TransparentRenderer transparentCellRenderer = new TransparentRenderer();

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setSize(800, 600);

        //Creating the content pane with a gradient painted background
        JPanel gradientBackgroundPanel = new JPanel() {
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setPaint(new GradientPaint(0f, 0f, Color.green, 0f, getHeight(), Color.blue));
                g2d.fillRect(0, 0, getWidth(), getHeight());
            }
        };
        frame.setContentPane(gradientBackgroundPanel);

        //Initializing the table
        JTable table = createTable();

        //Adding the table to a transparent scroll pane
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setBorder(new EmptyBorder(10, 10, 10, 10));
        scrollPane.setOpaque(false);
        scrollPane.getViewport().setOpaque(false);

        //Adding the scroll pane to the content pane and setting the frame visible
        frame.getContentPane().add(scrollPane);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static JTable createTable() {

        //Creating the table column model with a single column using a transparent renderer
        DefaultTableColumnModel columnModel = new DefaultTableColumnModel();
        TableColumn column = new TableColumn();
        column.setHeaderValue("Header");
        column.setCellRenderer(transparentCellRenderer);
        columnModel.addColumn(column);

        //Creating the table header with a transparent renderer
        JTableHeader tableHeader = new JTableHeader(columnModel);
        tableHeader.setDefaultRenderer(transparentCellRenderer);
        
        //Creating a table model
        DefaultTableModel tableModel = createTableModel();

        //Creating the JTable
        JTable table = new JTable(tableModel);
        table.setTableHeader(tableHeader);
        table.setColumnModel(columnModel);
        table.setShowGrid(false);
        table.setRowHeight(40);

        //Making both the table and the table header transparent
        table.setOpaque(false);
        tableHeader.setOpaque(false);

        return table;
    }

    protected static DefaultTableModel createTableModel() {
        DefaultTableModel tableModel = new DefaultTableModel(5, 1);
        tableModel.setValueAt("Entry 1", 0, 0);
        tableModel.setValueAt("Entry 2", 1, 0);
        tableModel.setValueAt("Entry 3", 2, 0);
        tableModel.setValueAt("Entry 4", 3, 0);
        tableModel.setValueAt("Entry 5", 4, 0);
        return tableModel;
    }

    private static class TransparentRenderer extends JLabel implements TableCellRenderer {

        public TransparentRenderer() {
            setHorizontalAlignment(SwingConstants.CENTER);
            setOpaque(false);
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {
            setText(value.toString());
            return this;
        }
    }
}
Any help would be very much appreciated.

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points