Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Problem making JTableHeader transparent

939186May 23 2012 — edited May 23 2012
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.
This post has been answered by aterai on May 23 2012
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Jun 20 2012
Added on May 23 2012
2 comments
1,365 views