Java 如何在wicket数据表中启用可扩展行?
我对维克特不熟悉。在阅读了wicket文档之后,我决定使用datatable创建一个表。不过,我确实需要一些帮助。如何使表中的行在datatable中可展开?这是否真的不能在datatable中完成,我必须切换到repeatingview HTML代码Java 如何在wicket数据表中启用可扩展行?,java,datatable,wicket,wicket-6,Java,Datatable,Wicket,Wicket 6,我对维克特不熟悉。在阅读了wicket文档之后,我决定使用datatable创建一个表。不过,我确实需要一些帮助。如何使表中的行在datatable中可展开?这是否真的不能在datatable中完成,我必须切换到repeatingview HTML代码 <!DOCTYPE html> <html lang="en" xml:lang="en" xmlns:wicket="http://wicket.apache.org> <head&g
<!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>
要在Wicket中实现这一点,我将尝试ApacheWicket烹饪书中的“使细胞可点击”一词:
您将更改模型对象,而不是创建链接。要快速获取字符串的第一个单词,您可以使用ApacheCommons,如果我理解正确,您基本上希望在用户单击该行时更改该行的内容。这里需要了解一件重要的事情:如果您想在客户端或服务器端执行此操作
如果您想纯粹在客户端执行此操作,那么必须使用javascript。我假设这不是您想要做的,所以我不会详细介绍,但重点是在DataTable
中的每个项
上附加一个,这将触发执行扩展的javascript函数。我想这并不是你想做的,因为这不是一个很好的方法
在服务器端的wicket中有多种方法可以做到这一点。您可以更改数据表示元素(即,更改以使用能够检测单击并更改其显示的内容填充数据表),也可以更改数据源(在这种情况下,将在重新渲染时拾取更改)
在任何一种情况下,您都可能必须将行为附加到行项目。这样做:
重写DataTable上的方法。运行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;
}
@覆盖
受保护项newRowItem(最终字符串id、最终整数索引、最终IModel模型)
{
Item rowItem=super(id、索引、模型);
添加(新的AjaxEventBehavior(“onclick”){
受保护的void onEvent(AjaxRequestTarget目标){
//做点什么
}
}
返回行项目;
}
在我刚刚写的//do something中,您必须根据所采用的方法采取适当的操作。我要做的是使用自定义模型,该模型将有一个标记来跟踪是否单击了它
然后,在您认为最适合您的位置使用该标志。如果您选择影响显示,则使用,并在您覆盖的填充方法中,使用自定义标签,该标签将检测标志是否为票证并显示适当的值。或者,您可以在将对象从模型返回inst时检查标志ead返回真实对象的副本,其中的值设置为您希望显示的值;使用此方法,您的PropertyColumn实例将继续工作,而不进行任何修改
我在这个答案中仍然留下了很多,如果你想让我详细说明,请留下评论
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;
}
}
}
@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;
}