---
category: swing
folder: HeaderColumnBackground
title: JTableHeaderのヘッダカラムセルの背景色を変更
title-en: Change background color of header column cells in JTableHeader
tags: [JTableHeader, TableColumn, JTable, Calendar]
author: aterai
pubdate: 2025-11-10T01:52:22+09:00
description: JTableHeaderの各カラムにHeaderRendererを設定し、その曜日に応じた文字列と背景色でヘッダセルを描画します。
summary-jp: JTableHeaderの各カラムにHeaderRendererを設定し、その曜日に応じた文字列と背景色でヘッダセルを描画します。
summary-en: A HeaderRenderer is set for each column of the JTableHeader, and the header cell is drawn with a string and background color corresponding to the day of the week.
image: https://drive.google.com/uc?id=1hcp49rSXDEEH28l4SI8mj4AUso4EjZNe
---
* Summary [#summary]
JTableHeaderの各カラムにHeaderRendererを設定し、その曜日に応じた文字列と背景色でヘッダセルを描画します。
`JTableHeader`の各カラムに`HeaderRenderer`を設定し、その曜日に応じた文字列と背景色でヘッダセルを描画します。

#download(https://drive.google.com/uc?id=1hcp49rSXDEEH28l4SI8mj4AUso4EjZNe)

* Source Code Examples [#sourcecode]
#code(link){{
class MonthTable extends JTable {
  @Override public void updateUI() {
    super.updateUI();
    JTableHeader header = getTableHeader();
    header.setResizingAllowed(false);
    header.setReorderingAllowed(false);
    updateWeekHeaderRenderer();
  }

  @Override protected JTableHeader createDefaultTableHeader() {
    return new JTableHeader(columnModel) {
      @Override public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        JTable tbl = getTable();
        int rowCount = tbl.getModel().getRowCount() + 1;
        Class<JViewport> clz = JViewport.class;
        d.height = Optional.ofNullable(SwingUtilities.getAncestorOfClass(clz, tbl))
            .filter(clz::isInstance).map(clz::cast)
            .map(JViewport::getExtentSize)
            .map(dim -> dim.height / rowCount).orElse(24);
        return d;
      }
    };
  }

  @Override public void setModel(TableModel dataModel) {
    super.setModel(dataModel);
    EventQueue.invokeLater(this::updateWeekHeaderRenderer);
  }

  private void updateWeekHeaderRenderer() {
    TableColumnModel cm = getColumnModel();
    TableCellRenderer r = new WeekHeaderRenderer();
    for (int i = 0; i < cm.getColumnCount(); i++) {
      cm.getColumn(i).setHeaderRenderer(r);
    }
    getTableHeader().repaint();
  }
// ...
}

class WeekHeaderRenderer extends DefaultTableCellRenderer {
  public static final Color SUNDAY_BGC = new Color(0xB0_12_1A);
  public static final Color SATURDAY_BGC = new Color(0x1A_12_B0);
  private final WeekFields weekFields = WeekFields.of(Locale.getDefault());

  @Override 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);
    DayOfWeek week = weekFields.getFirstDayOfWeek().plus(column);
    if (week.equals(DayOfWeek.SUNDAY)) {
      c.setForeground(table.getSelectionForeground());
      c.setBackground(SUNDAY_BGC);
    } else if (week.equals(DayOfWeek.SATURDAY)) {
      c.setForeground(table.getSelectionForeground());
      c.setBackground(SATURDAY_BGC);
    } else {
      c.setForeground(table.getForeground());
      c.setBackground(table.getTableHeader().getBackground());
    }
    if (c instanceof JLabel) {
      JLabel l = (JLabel) c;
      l.setHorizontalAlignment(CENTER);
      Color gridColor = UIManager.getColor("Table.gridColor");
      Border border = BorderFactory.createMatteBorder(0, 0, 1, 1, gridColor);
      Border b = BorderFactory.createCompoundBorder(border, l.getBorder());
      l.setBorder(b);
    }
    return c;
  }
}
}}

* Description [#description]
- `DefaultTableCellRenderer`を継承する曜日表示用のセルレンダラーを作成
-- `DefaultTableCellRenderer#getTableCellRendererComponent(...)`をオーバーライドして、現在描画する列が土曜、日曜、それ以外かを`WeekFields.of(Locale.getDefault()).getFirstDayOfWeek().plus(column)`で調査して背景色を設定
-- カレンダーの曜日表示用の`JTableHeader`から`TableColumn`を取得し、すべてに上記のセルレンダラーを設定
--- このサンプルの`JTable`では`autoCreateColumnsFromModel`が`true`で、表示する月や`LookAndFeel`の変更でモデル変更されるとそれに合わせて列モデルも新規作成するため、`JTable#setModel(...)`をオーバーライドしてその内部で上記のセルレンダラーを再設定している
--- 土日平日用に`3`種類の`TableCellRenderer`を作成して対応する`TableColumn`に設定する方法もある

* Reference [#reference]
- [[JTableにLocaleを考慮したLocalDateを適用してカレンダーを表示する>Swing/CalendarViewTable]]

* Comment [#comment]
#comment
#comment