一个细微的变化:当我阅读问题时,主要问题是标题没有更新column选择改变。有一个自定义标头监听row选择更改对于这种情况没有多大帮助。
事实上,JTableHeader 已经is监听 ColumnModel 和模型的更改通知包括选择更改。只是故意实现了 columnSelectionChange 方法而不执行任何操作:
// --Redrawing the header is slow in cell selection mode.
// --Since header selection is ugly and it is always clear from the
// --view which columns are selected, don't redraw the header.
自定义标头可以简单地实现重新绘制(这里懒惰的我在表的工厂方法中这样做只是为了省去与表的连接,您可以轻松地将其设为独立的类:-)。
final JTable table = new JTable(new AncientSwingTeam()) {
@Override
protected JTableHeader createDefaultTableHeader() {
// subclassing to take advantage of super's auto-wiring
// as ColumnModelListener
JTableHeader header = new JTableHeader(getColumnModel()) {
@Override
public void columnSelectionChanged(ListSelectionEvent e) {
repaint();
}
};
return header;
}
};
table.setCellSelectionEnabled(true);
table.getTableHeader().setDefaultRenderer(new ColumnHeaderRenderer());
还使用 table api 对 Mad 的渲染器进行了一些调整:
/**
* Slightly adjusted compared to @Mad
* - use table's selectionBackground
* - use table's isColumnSelected to decide on highlight
*/
public static class ColumnHeaderRenderer extends DefaultTableCellHeaderRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean selected,
boolean focused, int row, int column) {
super.getTableCellRendererComponent(table, value, selected, focused, row, column);
if (table.isColumnSelected(column)) {
setBackground(table.getSelectionBackground());
}
return this;
}
}
至于观察:
总是说 isSelected 为 false
原因是 BasicTableHeaderUI 中的一个小怪癖:
ui.selected != columnModel.selected
uiSelected 是键绑定可以访问的列 - 如果 laf 支持它并且标题是 focusOwner。对我来说确实没有意义,但是完全定义 ui 和 columnModel 选择的语义陷入了对新 babe fx 的兴奋之中,这被遗忘了;-)