4

我有一个 Apache Wicket 页面,该页面有一个 DataTable,其中有一列需要显示状态,Red、Yellow、Green。如果列的内容是红色,我想将 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 的表格

4

1 回答 1

4

首先,看一下 PropertyColumn 的 populateItem,它的实现是怎样的,在 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 自己创建标签组件,然后添加一个 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";
    }



}));

}

注意: Wicket 6 中不推荐使用“createLabelModel”方法,而是使用“getDataModel”。

于 2013-11-09T12:49:28.337 回答