JTableHeaderのハイライト表示
Total: 4445, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JTableのセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。
Screenshot

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