我是Wicket的新手。在阅读了wicket文档后,我决定使用datatable创建一个表。但是,我真的需要一些帮助。如何使表中的行在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代码来自一些在线示例。目标是默认表只显示姓氏的第一个单词和名字的第一个单词。单击该行后,它将展开并显示该行的整个名称和姓氏。
提前感谢任何意见和建议。希望我不必转离数据表。
答案 0 :(得分:1)
如果我理解这是正确的,那么当用户点击它时,你基本上想要更改行的内容。这里有一件重要的事情要理解:如果你想在客户端或服务器端执行此操作。
如果你想纯粹在客户端这样做,那么你必须使用javascript。我认为这不是你想要做的,所以我不会详细介绍,但重点是Item
DataTable
Item
附加Behavior
触发执行扩展的javascript函数。我认为这不是你想要做的事情,因为它不是那个检票口。
在服务器端的wicket中有多种方法可以做到这一点。您可以更改数据表示元素(即更改Behavior
以使用可检测点击的内容填充数据表,然后更改其显示),或更改数据源(在这种情况下IColumn
s会在重新渲染时获取更改。)
在任何一种情况下,您可能都必须将行为附加到行项目。做这样的事情:
覆盖DataTable上的PropertyColumn
方法。运行super方法,然后在返回的@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;
}
上附加自定义{{1}},其中包含以下内容:
{{1}}
我刚刚写了//做某事,你必须采取适当的行动取决于你采取的方法。我要做的是使用一个自定义模型,它会有一个标志来跟踪它是否被点击。
然后,在您认为最适合您的地方使用该标志。如果您选择影响显示,请使用newRowItem()
并在您覆盖的populate方法中使用自定义标签,该标签将检测该标志是否为故障单并显示适当的值。或者,您可以在从模型返回对象时检查标志,而是返回真实对象的副本,并将其上的值设置为您要显示的内容;使用此方法,您的PropertyColumn实例将继续工作而不进行任何修改。
我还是留下了很多答案,如果你想详细说明,请发表评论。
答案 1 :(得分:0)
要在Wicket中执行此操作,我会尝试&#34;使单元格可点击&#34;来自 Apache Wicket Cookbook 的方法:http://www.packtpub.com/sites/default/files/1605OS-Chapter-5-Displaying-Data-Using-DataTable.pdf
您将不使用链接更改模型对象。要快速获取字符串的第一个单词,您可以使用Apache Commons StringUtils.substringBefore(contact.getName(), "")