0

我是 Wicket 的新手。在阅读了 wicket 文档后,我决定使用 datatable 创建一个表。但是,我真的需要一些帮助。如何使表中的行在数据表中可扩展?这真的不能在数据表中完成,我必须切换到重复视图吗?

HTML 代码

<!DOCTYPE html>
<html lang="en"
      xml:lang="en"
      xmlns:wicket="http://wicket.apache.org>
   <head>
      <title> Wicket test </title>
   </head>
   <body>
      <table cellspacing="0" wicket:id="table"></table>
   </body>
</html>

Java 代码

import java.util.ArrayList;
import java.util.List;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.extensions.markup.html.repeater.data.table.DefaultDataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.model.Model;

public class TestPage extends WebPage {
    public TestPage() {
        final UserProvider userProvider = new UserProvider();
        List<IColumn<UserProvider.Contact, String>> columns = new ArrayList<IColumn<UserProvider.Contact, String>>(2);
        columns.add(new PropertyColumn<UserProvider.Contact, String>(new Model<String>("First Name"), "name.first", "name.first"));
        columns.add(new PropertyColumn<UserProvider.Contact, String>(new Model<String>("Last Name"), "name.last", "name.last"));
        DefaultDataTable<UserProvider.Contact, String> dataTable = new DefaultDataTable<UserProvider.Contact, String>("table", columns, userProvider, 10);
        add(dataTable);
    }
}

UserProvider 的 Java 代码

import java.util.*;
import java.io.Serializable;

import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;

public Class UserProvider extends SortableDataProvider {
    class SortableDataProviderComparator implements Comparator<Contact>, Serializable {
        public int compare(final Contact o1, final Contact o2) {
            PropertyModel<Comparable> model1 = new PropertyModel<Comparable>(o1, (String) getSort().getProperty());
            PropertyModel<Comparable> model2 = new PropertyModel<Comparable>(o2, (String) getSort().getProperty());
            int result = model1.getObject().compareTo(model2.getObject());
            if (!getSort().isAscending()) {
                result = -result;
            }
            return result;
        }
    }

    private List<Contact> list = new ArrayList<Contact>();
    private SortableDataProviderComparator comparator = new SortableDataProviderComparator();

    public UserProvder() {
        setSort("name.first", SortOrder.ASCENDING);
        list.add(new Contact(new Name("Abbie", "Zed LaBlanc Kayle Garcia")));
        list.add(new Contact(new Name("Benny", "Yellen")));
        list.add(new Contact(new Name("Charles", "Wukong Mike Alistar")));
        list.add(new Contact(new Name("Dennis Woody Tresh", "Rose")));
        list.add(new Contact(new Name("Elaine", "Poppy")));
        list.add(new Contact(new Name("Peter Jose Brian", "Jax")));
    }

    public Iterator<Contact> model(long first, long count) {
        List<Contact> newList = new ArrayList<Contact>(list);
        Collections.sort(newList, comparator);
        return newList.subList((int) first, (int) (first + count)).iterator();
    }

    public IModel<Contact> model(final Object object) {
        return new AbstractReadOnlyModel<Contact>() {
            @Override
            public Contact getObject() {
                return (Contact) object;
            }
        };
    }

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

    class Contact implements Serializable {
        private final Name name;
        public Contact(final Name name) {
            this.name = name;
        }
        public Name getName() {
            return name;
        }
    }

    class Name implements Serializable {
        private String firstName;
        private String lastName;
        public Name(final String fName, final String lName) {
            firstName = fName;
            lastName = lName;
        }
        public String getFirst() {
            return firstName;
        }
        public String getLast() {
            return lastName;
        }
        public setFirst(final String firstName) {
            this.firstName = firstName;
        }
        public setLast(final String lastName) {
            this.lastName = lastName;
        }
    }
}

上面的 Java 代码来自一些在线示例。目标是默认表只显示姓氏的第一个单词和名字的第一个单词。单击该行后,它将展开并显示该行的整个名字和姓氏。

提前感谢您的任何意见和建议。希望我不必离开数据表。

4

2 回答 2

1

如果我理解正确,那么您基本上想在用户单击该行时更改该行的内容。这里有一件重要的事情要理解:如果您想在客户端或服务器端执行此操作。

如果您想纯粹在客户端执行此操作,那么您必须使用 javascript。我认为这不是您想要做的,所以我不会详细介绍,但重点是将 a 附加Behavior到每个Item中,DataTable这将触发执行扩展的 javascript 函数。我认为这不是您想要做的,因为它不是很检票口。

在服务器端的检票口中有多种方法可以做到这一点。您可以更改数据表示元素(即更改IColumns以使用可以检测点击的内容填充数据表,然后更改其显示),或更改数据源(在这种情况下,PropertyColumn将在重新渲染时获取更改)。

在任何一种情况下,您都可能必须将行为附加到行项目。做这样的事情:

覆盖newRowItem()DataTable 上的方法。运行 super 方法并在Item它返回时附加一个 custom Behavior,类似于以下内容:

@Override
protected Item<T> newRowItem(final String id, final int index, final IModel<T> model)
{
    Item rowItem = super(id, index, model);
    rowItem.add(new AjaxEventBehavior("onclick") {
         protected void onEvent(AjaxRequestTarget target) {
             //do something
         }
     }
     return rowItem;
}

在我刚刚写了 //do something 的地方,你必须根据你采取的方法采取适当的行动。我要做的是使用自定义模型,它有一个标志来跟踪它是否被点击。

然后,在您认为最适合您的地方使用该标志。如果您选择影响显示,则使用AbstractColumnand 在您覆盖的填充方法中,使用自定义标签,该标签将检测标志是否为票据并显示适当的值。或者,您可以在从模型返回对象时检查标志,而不是返回真实对象的副本,并将其上的值设置为您想要显示的值;使用此方法,您的 PropertyColumn 实例将继续工作而无需修改。

我仍然在这个答案中留下了很多东西,如果您想让我详细说明,请发表评论。

于 2014-04-16T10:45:49.453 回答
0

要在 Wicket 中做到这一点,我会尝试Apache Wicket Cookbook中的“使单元格可点击”方法:http : //www.packtpub.com/sites/default/files/1605OS-Chapter-5-Displaying-Data-Using-DataTable .pdf

您将不会创建链接来更改模型对象。要快速获取字符串的第一个单词,您可以使用 Apache CommonsStringUtils.substringBefore(contact.getName(), "")

于 2014-04-16T05:40:52.647 回答