2

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

トランザクションとは何ですか?トランザクションは何をしますか?LinkPanelクラスとは何ですか?もっと簡単な方法があれば、私はそれを知りたいです!

4

2 に答える 2

5

「トランザクション」は、セルのモデル内のオブジェクトです (これは、改札からではなく、おそらく例から来ています)。「LinkPanel」クラスも改札以外の内部クラスです。このクラスの目的は、リンクを含むパネルを作成することです。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 は改札からのものではなく、この場合に使用したオブジェクトにすぎないことに注意してください)。

...

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

この助けを願っています

于 2012-08-14T12:19:12.573 に答える
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 が必要)...

于 2012-08-14T08:05:08.307 に答える