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.