检票口操纵 DefaultDataTable

wicket manipulating DefaultDataTable

我在 wicket 中创建了一个 Web 应用程序,并创建了一个 table 向用户显示一些信息。现在我想操纵这个 table 所以如果单元格包含 "N" 背景颜色将为红色,如果它包含 "Y" 背景颜色将为绿色。此刻我无法确定牢房内到底有什么。我通过以下方式创建我的 table:

dataTable = new DefaultDataTable<TableModalInt, String>("table", columns,
            new TableModalProvider(), 100000){
        @SuppressWarnings("rawtypes")
        @Override
        protected Item newCellItem(String id, int index, IModel model) {
            Item item = super.newCellItem(id, index, model); 
            if (id == "3"){
                item.add(AttributeModifier.replace("align", "center"));
            }
            return item;
        }
    };

我能够确定我现在想要检查显示给用户的内容的单元格。对我如何做到这一点有帮助吗?要更改颜色,我知道我必须添加 item.add(AttributeModifier.replace("bgcolor", "red")); 但不知道如何分辨单元格中的内容

Item 正在扩展列表项,因此您可以尝试 .getModelObject 并验证它是 "X" 还是 "Y"

http://wicket.apache.org/apidocs/1.5/org/apache/wicket/markup/repeater/Item.html

http://wicket.apache.org/apidocs/1.5/org/apache/wicket/markup/html/list/ListItem.html#getModelObject()

您应该在 IColumn 实现中进行检查。 https://github.com/apache/wicket/blob/24e9db6c8af85043ce36e4d25a0e8a2d8dc2f49e/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/PropertyColumn.java#L94 用标签填充项目。 Label需要添加AttributeModifier。

您也可以在客户端使用纯 JavaScript and/or CSS 来实现您的目标。

此示例在 Wicket 中单击单元格时提取单元格值 DataView。此 DataView 的模型是具有 String 键和 Integer 值的 MapMap<String,Integer>.

PropertyColumn 列表是使用 headers 列("ALPHA"、"BETA"、"GAMMA")和 属性 表达式:"alpha"、"beta"、"gamma"。 PropertyColumn 使用表达式从地图中检索值。

DataView 是使用 PropertyColumn 列表和 DataProvider 创建的。 DataView 在呈现 table 时使用 DataProvider 填充 PropertyColumn 并对点击做出反应以显示单元格值。

通过覆盖 newCellItem(String,int,IModel) 方法并调用 super-class 方法获取单元格来公开单元格。此示例添加一个行为以对 "onclick" 事件作出反应。在事件中,单元格的第一个 child 组件应该是用于显示单元格值的 Label

单元格 Label 的最内层模型是 PropertyColumn 中的 PropertyModel

  1. innerModel.getPropertyExpression():我们的数据映射键(String)。
  2. innerModel.getObject():数据值(Integer).
  3. innerModel.getInnermostModelOrObject(): 列表项 (Map<String,Integer>).

Wicket DataView:提取单元格值

public class MessageLogStatus
    extends WebPage
{
    /** Represents serialVersionUID. */
    private static final long serialVersionUID = 20150701L;
    private static final Logger log = LoggerFactory.getLogger(MessageLogStatus.class);

    static final String A = "alpha";
    static final String B = "beta";
    static final String C = "gamma";

    public MessageLogStatus()
    {
        super();

        final List<String> keys = Arrays.asList(A, B, C);

        final List<Map<String,Integer>> data = Arrays.asList
        (
            map(A, 1).put(B, 11).put(C, 21).toMap(),
            map(A, 2).put(B, 12).put(C, 22).toMap(),
            map(A, 3).put(B, 13).put(C, 23).toMap(),
            map(A, 4).put(B, 14).put(C, 24).toMap(),
            map(A, 5).put(B, 15).put(C, 25).toMap(),
            map(A, 6).put(B, 16).put(C, 26).toMap(),
            map(A, 7).put(B, 17).put(C, 27).toMap(),
            map(A, 8).put(B, 18).put(C, 28).toMap(),
            map(A, 9).put(B, 19).put(C, 29).toMap()
        );

        // Using a DefaultDataTable
        ISortableDataProvider<Map<String,Integer>,String> dataProvider = new SortableDataProvider<Map<String,Integer>,String>()
        {
            private static final long serialVersionUID = MessageLogStatus.serialVersionUID;

            public Iterator<Map<String,Integer>> iterator(long first, long count)
            {
                int start = Math.max(0, (int) first);
                int end = Math.min(data.size(), start + (int) count);
                return data.subList(start, end).iterator();
            }

            public long size()
            {
                return data.size();
            }

            public IModel<Map<String,Integer>> model(Map<String,Integer> object)
            {
                return new CompoundPropertyModel<Map<String,Integer>>(object);
            }
        };

        List<PropertyColumn<Map<String,Integer>,String>> columns = new ArrayList<PropertyColumn<Map<String,Integer>,String>>();
        for (String key : keys)
        {
            columns.add
            (
                new PropertyColumn<Map<String,Integer>, String>(Model.of(key.toUpperCase()), key)
                {
                    private static final long serialVersionUID = MessageLogStatus.serialVersionUID;

                    @Override
                    public void populateItem(Item<ICellPopulator<Map<String, Integer>>> item, String componentId,
                        IModel<Map<String, Integer>> rowModel)
                    {
                        super.populateItem(item, componentId, rowModel);
                        Map<String, Integer> entity = rowModel.getObject();
                        String px = getPropertyExpression();
                        PropertyModel<Object> propModel = new PropertyModel<Object>(rowModel, px);
                        log.info("Add Label to Cell: PropEx="+px+", Value="+propModel.getObject()+", entity="+entity);
                    }
                }
            );
        }    

        //
        // Wicket: <table wicket:id="dataTable"></table>
        //
        DataTable<Map<String,Integer>,String> dataTable = 
            new DataTable<Map<String,Integer>,String>("dataTable", columns, dataProvider, 5)
            {
                private static final long serialVersionUID = MessageLogStatus.serialVersionUID;

                @Override
                protected Item<IColumn<Map<String, Integer>, String>> newCellItem(final String id, final int index,
                    final IModel<IColumn<Map<String, Integer>, String>> model)
                {
                    final Item<IColumn<Map<String,Integer>, String>> cell = super.newCellItem(id, index, model);
                    cell.add
                    (
                        new AjaxEventBehavior("onclick")
                        {
                            private static final long serialVersionUID = MessageLogStatus.serialVersionUID;
                            @SuppressWarnings("unchecked")
                            @Override
                            protected void onEvent(AjaxRequestTarget target)
                            {
                                if ( (cell.size() > 0) && (cell.get(0) instanceof Label) )
                                {
                                    Label cellLabel = (Label) cell.get(0);
                                    PropertyModel<Integer> cellLabelModel = (PropertyModel<Integer>) cellLabel.getInnermostModel();
                                    String property = cellLabelModel.getPropertyExpression();
                                    Integer value = cellLabelModel.getObject(); 
                                    Map<String, Integer> entity = (Map<String,Integer>) cellLabelModel.getInnermostModelOrObject();

                                    log.info("OnClick: Index="+index+", PropEx="+property+", Value="+value+", Entity="+entity);
                                }
                            }
                        }
                    );
                    return cell;
                }
            };
        dataTable.addBottomToolbar(new NavigationToolbar(dataTable));
        dataTable.addTopToolbar(new HeadersToolbar<String>(dataTable, null));
        add(dataTable);
    }

    // Make building the data structure a little more fun :)
    private MapBuilder<String, Integer> map(String key, Integer value)
    {
        return new MapBuilder<String, Integer>().put(key, value);
    }

    private static class MapBuilder<K, V>
    {
        Map<K, V> map = new HashMap<K, V>();

        MapBuilder<K, V> put(K key, V value)
        {
            map.put(key, value);
            return this;
        }

        Map<K, V> toMap()
        {
            return map;
        }
    }

}

输出

OnClick: Index=0, PropEx=alpha, Value=5, Entity={gamma=25, alpha=5, beta=15}
OnClick: Index=1, PropEx=beta, Value=15, Entity={gamma=25, alpha=5, beta=15}
OnClick: Index=2, PropEx=gamma, Value=25, Entity={gamma=25, alpha=5, beta=15}