Swing/ColumnHeaderHighlight のバックアップ(No.6)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ColumnHeaderHighlight へ行く。
- 1 (2014-12-29 (月) 00:04:25)
- 2 (2015-01-09 (金) 16:34:09)
- 3 (2016-06-25 (土) 21:24:12)
- 4 (2017-09-23 (土) 13:52:20)
- 5 (2019-03-08 (金) 19:31:20)
- 6 (2020-12-20 (日) 01:38:13)
- 7 (2023-04-21 (金) 02:35:06)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- category: swing
folder: ColumnHeaderHighlight
title: JTableHeaderのハイライト表示
tags: [JTable, JTableHeader, TableCellRenderer, ListSelectionModel]
author: aterai
pubdate: 2014-12-29T00:02:59+09:00
description: JTableのセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。
image:
概要
JTable
のセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。
Screenshot

Advertisement
サンプルコード
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);
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTable
のセルが選択されてリードインデックスが存在する(-1
ではない)場合はフォーカスありで自身を描画するヘッダセルレンダラーを作成し、これをTableColumn#setHeaderRenderer(...)
ですべてのカラムに設定しています。
JTable
内にあるセルの選択状態が変更されても、JTableHeader
の描画には影響しない- このため、
TableColumnModel
から取得したSelectionModel
にListSelectionListener
を追加して、リードインデックスの移動イベントが発生するたび、JTableHeader#repaint()
を呼び出してJTableHeader
のフォーカス変更を描画し直すように設定
- このため、
table.getColumnModel().getSelectionModel().addListSelectionListener(e -> {
header.repaint();
});