Swing/ColumnHeaderHighlight のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ColumnHeaderHighlight へ行く。
- title: JTableHeaderのハイライト表示 tags: [JTable, JTableHeader, TableCellRenderer, ListSelectionModel] author: aterai pubdate: 2014-12-29T00:02:59+09:00 description: JTableのセルが選択されている場合、そのセルが存在するカラムヘッダにフォーカスを設定します。
概要
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解説
上記のサンプルでは、リードインデックスがある場合はフォーカスありで自身を描画するヘッダセルレンダラーを作成し、これをTableColumn#setHeaderRenderer(...)
ですべてのカラムに設定しています。
通常セル選択の変更でJTableHeader
は再描画されないため、TableColumnModel
から取得したSelectionModel
に、ListSelectionListener
を追加して、リードインデックスのフォーカス変更を描画し直しています。
TableColumnModel cm = table.getColumnModel();
cm.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override public void valueChanged(ListSelectionEvent e) {
header.repaint();
}
});