---
category: swing
folder: TransparentTableHeader
title: JTableのヘッダを透明化
tags: [JTable, JTableHeader, Transparent, JScrollPane, JViewport, TableCellRenderer, TableCellEditor]
author: aterai
pubdate: 2011-04-04T16:49:46+09:00
description: JTableのヘッダ背景、セル間の垂直罫線を非表示にします。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TZl3Ci_GNnI/AAAAAAAAA40/wSbo6ySTlz0/s800/TransparentTableHeader.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2011/04/transparent-jtableheader.html
    lang: en
---
* 概要 [#summary]
`JTable`のヘッダ背景、セル間の垂直罫線を非表示にします。

#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TZl3Ci_GNnI/AAAAAAAAA40/wSbo6ySTlz0/s800/TransparentTableHeader.png)

* サンプルコード [#sourcecode]
#code(link){{
class TransparentHeader extends JLabel implements TableCellRenderer {
  private final Border b = BorderFactory.createCompoundBorder(
      BorderFactory.createMatteBorder(0, 0, 1, 0, Color.BLACK),
      BorderFactory.createEmptyBorder(2, 2, 1, 2));
  private final Color alphaZero = new Color(0x0, true);
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus,
      int row, int column) {
    this.setText(Objects.toString(value, ""));
    this.setHorizontalAlignment(SwingConstants.CENTER);
    this.setOpaque(false);
    this.setBackground(alphaZero);
    this.setForeground(Color.BLACK);
    this.setBorder(b);
    return this;
  }
}
}}

* 解説 [#explanation]
- `JTableHeader`
-- `JTableHeader`とヘッダセルレンダラーの背景を透明:`setOpaque(false)`、かつ背景色:`Color(0x0, true)`に設定
- `JTable`、`JScrollPane`(`Viewport`、`ColumnHeader`)の背景も透明:`setOpaque(false)`、かつ背景色:`Color(0x0, true)`に設定
-- 背景パターンは`JScrollPane#paintComponent(...)`をオーバーライドして描画
--- [[JTableを半透明にする>Swing/TransparentTable]]は`JViewport#paintComponent(...)`をオーバーライド
- `VerticalLine`
-- セル間の垂直線を`table.setShowVerticalLines(false)`で非表示に設定 
-- セル間の幅を`table.setIntercellSpacing(new Dimension(0, 1))`で`0`に設定して選択時に罫線の跡を非表示化
- `Boolean.class`の`DefaultRenderer`
-- 透明化した`BooleanCellRenderer`や`BooleanCellEditor`を設定
- 注:
-- `ColumnHeader`には`scroll.setColumnHeader(new JViewport())`のように適当な空
`JViewport`などを設定しておかないと`NullPointerException`が発生する
#code{{
scroll.setOpaque(false);
scroll.setBackground(alphaZero);
scroll.getViewport().setOpaque(false);
scroll.getViewport().setBackground(alphaZero);
scroll.setColumnHeader(new JViewport()); // Dummy JViewport
scroll.setColumnHeader(new JViewport()); // Empty JViewport
scroll.getColumnHeader().setOpaque(false);
scroll.getColumnHeader().setBackground(alphaZero);
}}

-- レンダラーとして使用している`JCheckBox`の揃えを`updateUI()`メソッドをオーバーライドして`setHorizontalAlignment(SwingConstants.CENTER)`で中央に変更していたが無効になっている?
--- 何時からなのか不明
--- `getTableCellRendererComponent(...)`中で`setHorizontalAlignment(SwingConstants.CENTER)`を毎回設定して回避

* 参考リンク [#reference]
- [[JTableを半透明にする>Swing/TransparentTable]]
- [[JTableHeaderを非表示にする>Swing/RemoveTableHeader]]
-- `JTable`のヘッダ自体を非表示にする場合のサンプル
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JTable.html#setShowVerticalLines-boolean- JTable#setShowVerticalLines(boolean) (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment