Как получить данные Apache Wicket PropertyColumn для динамического изменения класса CSS на основе содержимого?

У меня есть страница Apache Wicket, на которой есть DataTable со столбцом, в котором должны отображаться статусы: красный, желтый, зеленый. Если содержимое столбца красное, я хочу изменить класс CSS на красный статус, если желтый желтый статус, иначе зеленый статус. Кажется, я не могу получить данные так, как вы можете из столбца свойства, доступного для щелчка. Как вы получаете данные в PropertyColumn или есть другой способ сделать это в DataTable? Спасибо!

ОБНОВИТЬ

Спасибо, Мартин. Вот что я придумал:

@Override
public void populateItem(Item<ICellPopulator<T>> cellItem, String componentId, final IModel<T> rowModel) {
    Label label = new Label(componentId, getDataModel(rowModel));
    cellItem.add(label);
    LOGGER.debug("populateItem: label DefaultModelObject: {}", (String) label.getDefaultModelObject());

    label.add(new AttributeModifier("class", new AbstractReadOnlyModel<String>() {
        private static final long serialVersionUID = 1L;

        ProcessingTime  processingTime = (ProcessingTime) rowModel.getObject();
        @Override
        public String getObject() {
            String cssClass = null;
            if (StringUtils.equals("Red", processingTime.getStatus())) {
                cssClass = "red-status";
            } else if (StringUtils.equals("Yellow", processingTime.getStatus())) {
                cssClass = "yellow-status";
            } else if (StringUtils.equals("Green", processingTime.getStatus())) {
                cssClass = "green-status";
            } else {
                cssClass = "process-status";
            }
            return cssClass;
        }
    }));
}

Таблица с динамическим CSS в ячейках


person Barry Wadsworth    schedule 09.11.2013    source источник


Ответы (1)


Прежде всего, посмотрите на populateItem PropertyColumn, как выглядит реализация в Wicket 6 (аналогично другим версиям):

public class PropertyColumn<T, S> extends AbstractColumn<T, S> implements IExportableColumn<T, S, Object>
...
    @Override
    public void populateItem(final Item<ICellPopulator<T>> item, final String componentId,
        final IModel<T> rowModel)
    {
        item.add(new Label(componentId, createLabelModel(rowModel)));
    }
...
}

Вы должны изменить внутренний компонент, который создается как метка столбца.

Первый способ: создайте свой собственный компонент (также ваш компонент может содержать свой собственный механизм создания класса или стиля css вместо добавления сюда AttributeModifier):

@Override
public void populateItem(final Item<ICellPopulator<T>> item, final String componentId,
    final IModel<T> rowModel)
    {
    super.populateItem(item, componentId, rowModel);
    MarkupContainer c = item.get(componentId);
    c.add(new AttributeModifier("class", new AbstractReadonlyModel<String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String getObject() {
        // some logic how to which css you want to apply
        return "MY-CSS-CLASS";
    }



}));

}

или вы можете позволить Wicket создать сам компонент Label, и вы просто добавляете AttributeModifier:

@Override
public void populateItem(final Item<ICellPopulator<T>> item, final String componentId, final IModel<T> rowModel) 
    {
    super.populateItem(item, componentId, rowModel);
    Label l = new Label(componentId, createLabelModel(rowModel));
    item.add(l);
    l.add(new AttributeModifier("class", new AbstractReadonlyModel<String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String getObject() {
        // some logic how to which css you want to apply
        return "MY-CSS-CLASS";
    }



}));

}

ПРИМЕЧАНИЕ. метод createLabelModel устарел в Wicket 6, вместо него используется getDataModel.

person Martin Strejc    schedule 09.11.2013
comment
Мартин, спасибо за ваши предложения. Я пробовал это, и CSS устанавливается для столбца, но не для ячейки. Я пробовал разные подходы, но цвет шрифта в CSS всегда применяется ко всему столбцу. - person Barry Wadsworth; 12.11.2013
comment
Если вы добавите некоторое условие в AttributeModifier, вы его получите. У вас есть модель строки, которая должна быть отображена, поэтому вы можете реализовать что-то вроде «return rowModel.getObject.isMyRow()»? мой-красный-css-класс: по умолчанию-css-класс'; - person Martin Strejc; 13.11.2013