0
AID      BID    count1  count2
AID1    1   3   4
            2   4   5
            3       4   2
AID2    4   6   10   
            5   2   4
            6   4   6
AID3    7   4   5
            8        9  4

这是我试图显示的表格,它为 ObjA 中的每个 AID 显示 ObjB 的列表。

我想使用 Wicket DataTable 或 Listview 显示可排序数据。我使用了 SortableData 提供程序,它适用于简单的对象,例如

ObjA{
int a;
String b;
}

但是我有一个对象,其中包含对象列表作为字段,如下所示。

ObjA{
Long aId;
List<ObjB> listObjB;
}

@magomi 感谢您的回复。这是代码和相应的 Html 文件。我正在使用数据表。我不确定如何为每个 aID 呈现表中 listObjBs (bID,count,count2) 中的项目。在 ObjA 中为 listObjBs 添加列的正确方法是什么

***columns.add(new PropertyColumn<ObjA>(Model.of("B ID"), "ObjBCounts.bID",
                "ObjBCounts.BID"));
        columns.add(new PropertyColumn<ObjA>(Model.of(" Count"), "objBCounts.count"));
        columns.add(new PropertyColumn<ObjA>(Model.of("Count2”),"objBCounts.count2"));*** 

如何在迭代器方法中对列 bID 进行排序?

Public class HomePage extends Webpage
private static List<ObjB> listObjBs = Arrays.asList(
            new ObjB(15L,2,5),
            new ObjB(12L,7,10),
            new ObjB(13L,3,5),
            new ObjB(10L,6,5));

    private static List<ObjA> contacts = Arrays.asList( 
            new ObjA(1L,listObjBs),
            new ObjA(2L,listObjBs),
            new ObjA(3L,listObjBs),
            new ObjA(4L,listObjBs));

    public HomePage(final PageParameters parameters) {
        List<IColumn<ObjA>> columns = new ArrayList<IColumn<ObjA>>();
        columns.add(new PropertyColumn<ObjA>(Model.of("A ID"), "aID",
                "aID"));

        Public class HomePage extends Webpage
private static List<ObjB> listObjBs = Arrays.asList(
            new ObjB(15L,2,5),
            new ObjB(12L,7,10),
            new ObjB(13L,3,5),
            new ObjB(10L,6,5));

    private static List<ObjA> contacts = Arrays.asList( 
            new ObjA(1L,listObjBs),
            new ObjA(2L,listObjBs),
            new ObjA(3L,listObjBs),
            new ObjA(4L,listObjBs));

    public HomePage(final PageParameters parameters) {
        List<IColumn<ObjA>> columns = new ArrayList<IColumn<ObjA>>();
        columns.add(new PropertyColumn<ObjA>(Model.of("A ID"), "aID",
                "aID"));

        columns.add(new PropertyColumn<ObjA>(Model.of("B ID"), "ObjBCounts.bID",
                "ObjBCounts.BID"));
        columns.add(new PropertyColumn<ObjA>(Model.of(" Count"), "objBCounts.count"));
        columns.add(new PropertyColumn<ObjA>(Model.of("Count2”),"objBCounts.count2"));

        add(new DefaultDataTable<ObjA>("contacts", columns,
                new ContactsProvider(), 10));
    }
rivate static class ContactsProvider extends SortableDataProvider<ObjA> {
    public ContactsProvider() {
        setSort("aID", SortOrder.ASCENDING);
    }

    public Iterator<? extends ObjA> iterator(int first, int count) {
        List<ObjA> data = new ArrayList<ObjA>(contacts);
        Collections.sort(data, new Comparator<ObjA>() {

            public int compare(ObjA o1, ObjA o2) {
                int dir = getSort().isAscending() ? 1 : -1;

                if ("bID".equals(getSort().getProperty())) {
                    return dir * (o1.listObjB.get(0).getBID().compareTo(o2.listObjB.get(0).getBID()));
                } else {

                    return dir * (o1.getAID().compareTo(o2.getAID()));
                }
            }
        });
        return data.subList(first, Math.min(first + count, data.size()))
                .iterator();
    }

    public int size() {
        return contacts.size();
    }

    public IModel<ObjA> model(ObjA object) {
        return Model.of(object);
    }

}






<html>
<body>
<table border ="1" cellspacing = "1" wicket:id="contacts" class="contacts"></table>
</body>
</html>


        add(new DefaultDataTable<ObjA>("contacts", columns,
                new ContactsProvider(), 10));
    }
rivate static class ContactsProvider extends SortableDataProvider<ObjA> {
    public ContactsProvider() {
        setSort("aID", SortOrder.ASCENDING);
    }

    public Iterator<? extends ObjA> iterator(int first, int count) {
        List<ObjA> data = new ArrayList<ObjA>(contacts);
        Collections.sort(data, new Comparator<ObjA>() {

            public int compare(ObjA o1, ObjA o2) {
                int dir = getSort().isAscending() ? 1 : -1;

                if ("bID".equals(getSort().getProperty())) {
                    return dir * (o1.listObjB.get(0).getBID().compareTo(o2.listObjB.get(0).getBID()));
                } else {

                    return dir * (o1.getAID().compareTo(o2.getAID()));
                }
            }
        });
        return data.subList(first, Math.min(first + count, data.size()))
                .iterator();
    }

    public int size() {
        return contacts.size();
    }

    public IModel<ObjA> model(ObjA object) {
        return Model.of(object);
    }

}






<html>
<body>
<table border ="1" cellspacing = "1" wicket:id="contacts" class="contacts"></table>
</body>
</html>




ObjB{
Long bId;
int  count;
int count2;
}

它想显示来自 ObjA 的数据,其中包含可排序表中的 objB 列表 有人可以帮助我处理检票口标记以及如何填充列。

谢谢你。

4

1 回答 1

0

我不太确定,但看起来你正在以一种不可能的方式将 ObjA 和 ObjB 混合到一个表中。对不对,你想显示一个 ObjA 表(至少这是你的第一列)?还是要显示一个 ObjB 表(如第二列和第三列所示)?

只要一个表由一个列表支持,您就不能将另一个列表混合到该表中。

在我看来,您有以下选择:

  1. 您可以拥有一个 ObjA 表格,并且在表格单元格内您可以拥有一个带有 ObjB 表格的面板。但是没有对所有 ObjA 的所有 ObjB 行进行排序。
  2. 您可以定义某种类型的 DTO,该 DTO 具有混合了 ObjA 和 ObjB 的对象。像这样的东西:

    类数据() { int objAId; 整数 objBId;整数计数1;整数计数2;... }

  3. 您可以使用标准重复视图并将排序实现到您自己的数据提供程序中。

于 2012-04-22T14:44:36.700 回答