添加指向wicket中表的链接

The*_*Fox 2 java wicket

我使用Apache Wicket中的DefaultDataTable对象打印了一个表.
现在我想添加一个到每个表格单元格的链接.

我找到了解释其中一些内容的链接,但我对第一种方法有疑问.

    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);
    }
Run Code Online (Sandbox Code Playgroud)

什么是交易以及交易的作用是什么?什么是LinkPanel类?如果有更简单的方法,我很乐意知道!

jro*_*tte 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
 }
};
Run Code Online (Sandbox Code Playgroud)

但我建议保留内部面板(如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
    }
  });
}
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助