У меня есть NatTable и несколько цветных строк через ярлык «mylabel».
mylabel назначается ConfigLabelAccumulator:

final AggregateConfigLabelAccumulator labelAccumulator = new AggregateConfigLabelAccumulator();
labelAccumulator.add(new ColumnLabelAccumulator());
labelAccumulator.add(new IConfigLabelAccumulator() {
    @Override
    public void accumulateConfigLabels(final LabelStack configLabels, final int columnPosition, final int rowPosition) {
        if (<my condition>) configLabels.addLabelOnTop("mylabel");
    }
});

Стили для mylabel назначаются через ConfigRegistry, «ЖЕЛТЫЙ» - для невыделенных строк, «ТЕМНЫЙ_ЖЕЛТЫЙ» - для выбранных строк:

final ConfigRegistry configRegistry = new ConfigRegistry();
final Style style = new Style();
style.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, GUIHelper.COLOR_YELLOW);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, style, DisplayMode.NORMAL, "mylabel");

final Style styleSelected = new Style();
styleSelected.setAttributeValue(CellStyleAttributes.BACKGROUND_COLOR, Display.getDefault().getSystemColor(SWT.COLOR_DARK_YELLOW));
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, styleSelected, DisplayMode.SELECT, "mylabel");

(сноска) После изменения условия (см. <my condition>) я делаю natTable.doCommand(new VisualRefreshCommand());, чтобы мгновенно обновить таблицу.

Это работает как шарм, но с одной стороны: выбранная ячейка!
Как я могу сказать, что выбранная ячейка имеет другой цвет, если <my condition> равен true?

Примеры картинок:
Обе строки выделены на обоих изображениях (=> темно-желтый), отличается только привязка выделения.

хочу раскрасить это
Ячейка, содержащая 529 ..., должна иметь другой стиль при выборе.

хочу остаться, как есть
Ячейка, содержащая / E0001, должна остаться прежней.

Большое спасибо, Дирк !!!

Я пришел к этому решению, настроив SelectionLayer DefaultSelectionLayerConfiguration и DefaultSelectionStyleConfiguration:

this.selectionLayer = new SelectionLayer(glazedListsEventLayer, false);
this.selectionLayer.addConfiguration(new DefaultSelectionLayerConfiguration() {
    @Override
    protected void addSelectionStyleConfig() {
        final DefaultSelectionStyleConfiguration dssc = new DefaultSelectionStyleConfiguration();
        dssc.anchorBgColor = null;
        dssc.anchorFgColor = null;
        dssc.anchorBorderStyle = new BorderStyle(1, GUIHelper.COLOR_RED, LineStyleEnum.SOLID);
        addConfiguration(dssc);
    }
});

В моем случае не работает только стиль границы, но я использую HierarchicalTreeLayer поверх SelectionLayer, может это вызывает проблемы ?!

1
floh.mueller 5 Ноя 2021 в 14:22

1 ответ

Лучший ответ

IIUC, вы говорите о ячейке, которая имеет фокус в выбранной строке / столбце. Это называется привязкой выбора. И привязка выбора имеет особый стиль с помощью метки SelectionStyleLabels.SELECTION_ANCHOR_STYLE, чтобы отличать выбранную ячейку, которая имеет фокус, от других выбранных ячеек в сценарии множественного выбора.

Тем не менее, вам необходимо дополнительно настроить стиль для привязки выбора. Но поскольку настроить стили для нескольких меток невозможно, единственный известный мне подход - это удалить стиль фона для привязки выделения, чтобы цвет фона унаследовал от общего стиля выбора. И если вы хотите выделить привязку выбора, используйте другой бит стиля, например установка границы.

IStyle anchorStyle = new Style();
anchorStyle.setAttributeValue(
        CellStyleAttributes.BORDER_STYLE,
        new BorderStyle(1, GUIHelper.COLOR_RED, LineStyleEnum.SOLID));
configRegistry.registerConfigAttribute(
        CellConfigAttributes.CELL_STYLE,
        anchorStyle,
        DisplayMode.SELECT,
        SelectionStyleLabels.SELECTION_ANCHOR_STYLE);
1
Dirk Fauth 5 Ноя 2021 в 15:43
Привет, Дирк, спасибо, что попали в тему !! :) Да, я нашел SELECTION_ANCHOR_STYLE где-то в DefaultSelectionStyleConfiguration и SelectionLayer.getConfigLabelsByPosition(...), но разве это не установило бы стиль для всех строк / ячеек, а не только для тех, которые мне нужны (где <my condition> равно true)?
 – 
floh.mueller
5 Ноя 2021 в 14:51
Я обновил свой ответ. Невозможно изменить привязку выбора в соответствии с дополнительной меткой. Подход, который следует использовать здесь, заключается в том, чтобы избавиться от конфигурации цвета фона для привязки выделения и позволить ей наследовать цвет фона выделения.
 – 
Dirk Fauth
5 Ноя 2021 в 15:44
Большое тебе спасибо!!! Я принял и проголосовал за ваш ответ, а также отредактировал свой вопрос, включив в него решение, которое я использую сейчас.
 – 
floh.mueller
5 Ноя 2021 в 17:16