---
title: JTableHeaderのハイライト表示
tags: [JTable, JTableHeader, TableCellRenderer, ListSelectionModel]
author: aterai
pubdate: 2014-12-29T00:02:59+09:00
description: JTableのセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。
---
* 概要 [#v7039c16]
`JTable`のセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。

#download(https://lh6.googleusercontent.com/-g01DwekSNRs/VKAYFMHxxEI/AAAAAAAANtw/OwiMQuJ3gQY/s800/ColumnHeaderHighlight.png)

* サンプルコード [#n699171a]
#code(link){{
class ColumnHeaderRenderer implements TableCellRenderer {
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    TableCellRenderer r = table.getTableHeader().getDefaultRenderer();
    ListSelectionModel csm = table.getColumnModel().getSelectionModel();
    boolean f = csm.getLeadSelectionIndex() == column ? true : hasFocus;
    return r.getTableCellRendererComponent(table, value, isSelected, f, row, column);
  }
}
}}

* 解説 [#n0ed0326]
上記のサンプルでは、リードインデックスがある場合はフォーカスありで自身を描画するヘッダセルレンダラーを作成し、これを`TableColumn#setHeaderRenderer(...)`ですべてのカラムに設定しています。

通常セル選択の変更で`JTableHeader`は再描画されないため、`TableColumnModel`から取得した`SelectionModel`に、`ListSelectionListener`を追加して、リードインデックスのフォーカス変更を描画し直しています。

#code{{
TableColumnModel cm = table.getColumnModel();
cm.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
  @Override public void valueChanged(ListSelectionEvent e) {
    header.repaint();
  }
});
}}

//* 参考リンク
* コメント [#b36d5f33]
#comment
#comment