2014-04-15 30 views
0

我是新來的Wicket。在閱讀Wicket文檔之後,我決定使用數據表創建一個表。不過,我真的需要一些幫助。我怎樣才能使表中的行在數據表中可擴展?這是真的,這不能在數據表中完成,我必須切換到重複查看?如何在wicket數據表中啓用可擴展行?

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); 
    } 
} 

Java代碼UserProvider

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代碼從一些網上的例子。目標是默認表格,只顯示姓氏的第一個單詞和第一個名字的第一個單詞。點擊該行後,它將展開並顯示該行的整個名字和姓氏。

在此先感謝您的任何意見和建議。希望我不必從數據表中切換。

回答

1

如果我明白這是正確的,您基本上想要在用戶單擊該行時更改該行的內容。在這裏需要了解一件重要的事情:如果您想在客戶端或服務器端執行此操作。

如果你想純粹在客戶端做到這一點,那麼你必須使用JavaScript。我認爲這不是你想做的事情,所以我不會詳述太多,但是要點Behavior附加到DataTable中的每個Item,這將觸發執行擴展的javascript函數。我認爲這不是你想要做的事情,因爲它不是小門。

有多種方法可以在服務器端的wicket中執行此操作。您可以更改數據表示元素(例如,更改IColumns以使用可檢測點擊並隨後更改其顯示的內容填充數據表),或更改數據源(在這種情況下,PropertyColumn將會接收重新發生的更改)渲染)。

在這兩種情況下,您都可能必須將行爲附加到行項目。做這樣的事情:

覆蓋DataTable上的newRowItem()方法。運行超級方法和它返回Item,附加定製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; 
} 

當我剛寫//做一些事情,你將不得不採取這取決於適當的行動你採取的方法。我會做的是使用自定義模型,該模型會有一個標誌來跟蹤它是否被點擊。

然後,在任何你認爲最適合你的地方使用該標誌。如果您選擇影響顯示,請使用AbstractColumn並在覆蓋的填充方法中使用自定義標籤,該標籤可檢測標誌是否爲票據並顯示適當的值。或者,您可以在從模型返回對象時檢查標誌,而是返回實際對象的一個​​副本,並將其值設置爲您想要顯示的值;使用這種方法你的PropertyColumn實例將繼續工作,不做任何修改。

我留下了很多這個答案仍然如果你想我詳細說明,請留下評論。