我使用Apache Wicket中的DefaultDataTable对象打印了一个表 现在我想添加一个到每个表格单元格的链接。
我发现this link解释了其中一些,但我对第一种方法有疑问。
columns[0] = new TextFilteredPropertyColumn(new Model("Id"), "id", "id") {
// add the LinkPanel to the cell item
public void populateItem(Item cellItem, String componentId, IModel model) {
final Transaction transaction = (Transaction) model.getObject(cellItem);
cellItem.add(new TransactionList.LinkPanel(componentId, transaction));
}
};
private class LinkPanel extends Panel {
public LinkPanel(String id, Transaction transaction) {
super(id);
final String name = transaction.getId();
PageParameters param = new PageParameters("id=" + name);
BookmarkablePageLink link = new BookmarkablePageLink("link", TransactionDetail.class, param);
link.add(new Label("label", name));
add(link);
}
什么是交易以及交易有何作用?什么是LinkPanel类?如果有更简单的方法,我很乐意知道!
答案 0 :(得分:5)
“交易”是单元格模型中的对象(它可能来自示例,因为它不是来自wicket)。 “LinkPanel”类是一个内部类,也不是wicket。此类的目的是创建一个包含Link的面板。您可以直接在单元格中添加链接,而无需像LinkPanel这样的面板
columns[0] = new TextFilteredPropertyColumn(new Model("Id"), "id", "id") {
// add the LinkPanel to the cell item
public void populateItem(Item cellItem, String componentId, IModel model) {
cellItem.add(new Link<String>(componentId) {
@Override
public void onClick() {
setResponsePage(aPage.class);
//or do what you want when the link is clicked
}
@Override
public IMarkupFragment getMarkup() {
// display the content you like - access the properties of your object
return Markup.of("<div wicket:id='cell'>" + model.getObject() + "</div>");
}
});
// Populate your item here
}
};
但我建议保留内部面板(如LinkPanel)方法,因为我认为这是一种更好的做法,然后直接添加链接。通过使用内部面板,您可以非常轻松地向链接添加标签或图像,如果直接添加链接会更加困难。
当我需要在表中添加链接时,我通常会这样做(请注意,CallDetailRecord不是来自wicket,它只是我在这种情况下使用的对象):
...
columns.add(new UserActionsColumn(new Model<String>(" ")));
...
private class UserActionsColumn extends AbstractColumn<CallDetailRecord> {
private static final long serialVersionUID = 1L;
public UserActionsColumn(IModel<String> displayModel) {
super(displayModel);
}
@Override
public void populateItem(Item<ICellPopulator<CallDetailRecord>> cellItem,
String componentId,
final IModel<CallDetailRecord> rowModel)
{
cellItem.add(new UserActionPanel(componentId, rowModel));
}
}
private class UserActionPanel extends Panel {
private static final long serialVersionUID = 1L;
public UserActionPanel(String id, final IModel<CallDetailRecord> model) {
super(id);
add(new AjaxLink<CallDetailRecord>("viewLink", model) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
//actions to do when link is clicked
}
});
}
}
希望这个帮助
答案 1 :(得分:0)
交易只是一个Model类。这是一个例子,Wicket没有提供任何东西。这同样适用于LinkPanel类。它是模型的内部类,扩展了Wickel Panel类。需要Panel类来为链接提供标记。
另一种选择是使用这样的东西:
columns[0] = new TextFilteredPropertyColumn(new Model("Id"), "id", "id") {
// add the LinkPanel to the cell item
public void populateItem(Item cellItem, String componentId, IModel model) {
cellItem.add(new AjaxEventBehaviour("onclick") {
protected void onEvent(final AjaxRequestTarget target) {
// Put Link logic here
}
});
// Populate your item here
}
};
使整个单元格可单击(但需要Ajax)......