java - 具有可变列数的 Wicket 表

标签 java wicket

我一直在通过添加 ListView 创建表格(将我的数据作为 List<MyObject> 提供给它)到页面,并为 html 文件中的每一列分配相应的 ID。

但是现在我有一种情况,而不是简单的 List<MyObject>我有List<Map<String,MyObject>> .我还得到了一个列表,其中包含嵌套映射 ( List<String>) 的所有可能键。现在我需要创建一个表,其中 Map 的每个值应该在列中,键的名称指向该值。

假设我有以下数据:

keys = ['a', 'b']

data = [ { 'a' = 1, 'b' = 2 },
         { 'a' = 3, 'b' = 4 },
         { 'a' = 5, 'b' = 6}] 

我想创建表格:

<table>
    <tr>
        <th>a</th>
        <th>b</th>
    </tr>
    <tr>
        <td>1</td>
        <td>2</td>
    </tr>
    <tr>
        <td>3</td>
        <td>4</td>
    </tr>
    <tr>
        <td>5</td>
        <td>6</td>
    </tr>
</table>

知道嵌套 Map 中键的名称和数量可以更改,在 wicket 中实现它的最佳方法是什么?

最佳答案

下面是使用 DefaultDataTable 和嵌套 ListView 的示例。

请注意,虽然 DataTable 方法可能看起来不那么直接(好吧,这取决于旁观者的眼睛),但它实际上更清晰地将数据提取与可视化分开,并且您可以开箱即用地进行分页:尝试添加更多数据,或降低 rowsPerPage(DefaultDataTable 的最后一个构造函数参数)。

public class HomePage extends WebPage {

    static final String A = "a";
    static final String B = "b";

    public HomePage() {
        final List<String> keys = Arrays.asList(A, B);
        final List<Map<String, Integer>> data = Arrays.asList(
            map(A, 1).put(B, 11).toMap(),
            map(A, 2).put(B, 12).toMap(),
            map(A, 3).put(B, 13).toMap(),
            map(A, 4).put(B, 14).toMap(),
            map(A, 5).put(B, 15).toMap(),
            map(A, 6).put(B, 16).toMap(),
            map(A, 7).put(B, 17).toMap(),
            map(A, 8).put(B, 18).toMap(),
            map(A, 9).put(B, 19).toMap());

        // Using a DefaultDataTable
        ISortableDataProvider dataProvider = new SortableDataProvider() {
            public Iterator iterator(int first, int count) {
                int start = Math.min(0, first);
                int end = Math.min(data.size(), start + count);
                return data.subList(start, end).iterator();
            }
            public int size() {
                return data.size();
            }
            public IModel model(Object object) {
                return new CompoundPropertyModel(object);
            }
        };
        List columns = new ArrayList();
        for (String key : keys)
            columns.add(new PropertyColumn(Model.of(key), key));
        add(new DefaultDataTable("dataTable", columns, dataProvider, 20));

        // Using a nested ListViews
        add(new ListView("headers", keys) {
            @Override
            protected void populateItem(ListItem item) {
                item.add(new Label("header", String.valueOf(item.getModelObject())));
            }
        });
        add(new ListView("listView", data) {
            @Override
            protected void populateItem(ListItem item) {
                final Map rowMap = (Map) item.getModelObject();
                item.add(new ListView("nested", keys) {
                    @Override
                    protected void populateItem(ListItem item) {
                        Object value = rowMap.get(item.getModelObject());
                        item.add(new Label("value", String.valueOf(value)));
                    }
                });
            }
        });
    }

    // to 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;
        }
    }
}


<html xmlns:wicket="http://wicket.apache.org">
<body>

  <table wicket:id="dataTable"></table>

  <table>
    <tr>
      <th wicket:id="headers">
          <span wicket:id="header"></span>
      </th>
    </tr>
    <tr wicket:id="listView">
      <td wicket:id="nested">
        <span wicket:id="value"></span>
      </td>
    </tr>
  </table>

</body>
</html>

关于java - 具有可变列数的 Wicket 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5500308/

相关文章:

java - 如何将有序的整数列表划分为大小均匀的子列表?

java - 如何让 javac 找到 JAR 文件? (Eclipse 可以看到它们)

java - Wicket - 使用复选框禁用/启用文本字段

java - 本地主机上的 wicket 应用程序之间的 Wicket 交互

java - 如何从 URl 下载 ZIP 文件并将其仅存储为 Zip 文件

java - 将 java 对象从 .jsp 发送到 java

java - 如何使用代码在java wicket中打开新选项卡

java - ImageIcons 数组,通过拖放更改数组内容

java - 为什么使用Behavior渲染textField需要这么长时间