Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在wicket数据表中启用可扩展行?_Java_Datatable_Wicket_Wicket 6 - Fatal编程技术网

Java 如何在wicket数据表中启用可扩展行?

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

我对维克特不熟悉。在阅读了wicket文档之后,我决定使用datatable创建一个表。不过,我确实需要一些帮助。如何使表中的行在datatable中可展开?这是否真的不能在datatable中完成,我必须切换到repeatingview

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>


要在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;
}