технически вам нужно это состояние для компонента рендеринга, а не для самого JTableHeader:
@Override
public void mousePressed( MouseEvent e ) {
JComponent source = (JComponent)e.getComponent();
source.putClientProperty( "Nimbus.State", "Pressed" );
if (source instanceof JTableHeader) {
((JComponent) ((JTableHeader) source).getDefaultRenderer())
.putClientProperty("Nimbus.State", "Pressed");
}
}
Проблема в том, что один и тот же экземпляр (компонента рендеринга) используется для всех столбцов, поэтому при перетаскивании столбца все отображаются нажатыми ...
Редактировать: не удержался, чтобы немного покопаться ... Нимб оооочень ... не хватает, мягко говоря, -)
Оказывается, что в настройках по умолчанию действительно есть стили для нажатия, чего не хватает, так это логики для его установки. Вероятно, не совсем тривиально, потому что логика (aka: MouseListener) находится в BasicTableHeaderUI, который не знает о состояниях рисования подкласса. Единственная вещь, которую поддерживает логика («горячая фиксация иглы»), это распознавание опрокидывания, но не нажатие.
Хотя мы не можем подключиться к логике (ну, мы могли бы ... но это еще одна хитрость :-), мы можем искать вторичные изменения состояния, такие как свойства draggingColumn / resizingColumn (not-bound) в JTableHeader, и позволить рендер обновляет себя по мере необходимости. Вот линейка с практическими рекомендациями:
public static class WrappingRenderer implements TableCellRenderer {
private DefaultTableCellHeaderRenderer delegate;
private JTableHeader header;
public WrappingRenderer(JTableHeader header) {
this.header = header;
this.delegate = (DefaultTableCellHeaderRenderer) header.getDefaultRenderer();
header.setDefaultRenderer(this);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
Component comp = delegate.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
TableColumn draggedColumn = table.getTableHeader().getDraggedColumn();
if (draggedColumn != null) {
if (table.convertColumnIndexToModel(column) == draggedColumn.getModelIndex()) {
setNimbusState("Pressed");
} else {
setNimbusState(null);
}
} else {
setNimbusState(null);
}
// do similar for resizing column
return comp;
}
public void setNimbusState(String state) {
delegate.putClientProperty("Nimbus.State", state);
}
}