概要

JTableのセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。

サンプルコード

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から取得したSelectionModelListSelectionListenerを追加して、リードインデックスの移動イベントが発生するたびにJTableHeader#repaint()を呼び出してJTableHeaderのフォーカス変更を描画し直すように設定
table.getColumnModel().getSelectionModel().addListSelectionListener(e -> {
  header.repaint();
});

参考リンク

コメント