Расширение Wicket DataTable - PullRequest
       12

Расширение Wicket DataTable

0 голосов
/ 01 июля 2011

Можем ли мы расширить DataTable в другом DataTable?

Мой сценарий - я хотел бы построить DataTable с именем BaseTable, который содержит три столбца: id, name, color. Я хочу построить еще две таблицы с именем Table1, которые расширяют BaseTable и имеют другой столбец: size; и Table2, который также расширяет BaseTable и имеет другой столбец флажка.

Возможно ли сделать что-то подобное? Если возможно, не могли бы вы привести пример или руководство?

Обновление

Спасибо за вашу помощь! Кажется, это ответ, который я хочу, но я сделал именно то, что вы сказали, но я в итоге получил эту ошибку:

WicketMessage: The component(s) below failed to render. A common problem is that you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered).

1. [MarkupContainer [Component id = dt_basecontract_list]]
2. [MarkupContainer [Component id = body]]
3. [MarkupContainer [Component id = rows]]
4. [MarkupContainer [Component id = 1]]
5. [MarkupContainer [Component id = cells]]
6. [MarkupContainer [Component id = 1]]
7. [Component id = cell]
8. [MarkupContainer [Component id = 2]]
9. [Component id = cell]
10. [MarkupContainer [Component id = 3]]
11. [MarkupContainer [Component id = cell]]
12. [MarkupContainer [Component id = detail]]
13. [MarkupContainer [Component id = delete]]

На случай, если вам понадобится информация ..

Базовый класс: ContractBasePanel

// A Base Contract DataTable Panel
public class ContractBasePanel extends Panel  {

    // Inject the ApplicationFacade
    @EJB(name="applicationFacade")
    private ApplicationFacadeLocal applicationFacade;

    public ContractBasePanel(String id, ApplicationFacadeLocal applicationFacade) {
        super(id);
        add(new DefaultDataTable<Contract>("dt_basecontract_list", getColumns(), new ContractProvider(applicationFacade), 10));
    }

    protected List<IColumn<Contract>> getColumns(){
        List<IColumn<Contract>> columns = new ArrayList<IColumn<Contract>>();
        columns.add(new PropertyColumn<Contract>(new Model<String>("ContractIdentifier"), "contractIdentifier"));
        columns.add(new PropertyColumn<Contract>(new Model<String>("Assigned To"), "customer.name"));
        return columns;
    }
}

Inherited Class : ContractModelRootPanel

// A Panel which displays a DataTable of contract
public class ContractModelRootPanel extends ContractBasePanel  {

    // Inject the ApplicationFacade
    @EJB(name="applicationFacade")
    private ApplicationFacadeLocal applicationFacade;

    // Represent the Contract Object selected by clicking "detail" or "delete" link
    private Contract contractSelected;

    public ContractModelRootPanel(String id, ApplicationFacadeLocal applicationFacade) {
        super(id, applicationFacade);
        add(new DefaultDataTable<Contract>("dt_contract_list", getColumns(), new ContractProvider(applicationFacade), 10));
    }

    class ActionPanel extends Panel
    {
        public ActionPanel(String id, IModel<Contract> model)
        {
            super(id, model);
            add(new Link("detail")
            {
                @Override
                public void onClick()
                {
                    // get Contract object which contains only contract identifier
                    contractSelected = (Contract)getParent().getDefaultModelObject();
                    PageParameters pageParameters = new PageParameters();
                    pageParameters.add("contractIdentifier", contractSelected.getContractIdentifier());

                    // handle the displays message if the contract has no owner
                    if(contractSelected.getCustomer() != null)  {
                        pageParameters.add("customerName", contractSelected.getCustomer().getName());
                    }
                    else  {
                        pageParameters.add("customerName", "-Not Bound to Any Customer-");
                    }
                    setResponsePage(ContractDetail.class, pageParameters);
                }
            });

            add(new Link("delete")
            {
                @Override
                public void onClick()
                {
                    // get Contract object which contains only contract identifier
                    contractSelected = (Contract)getParent().getDefaultModelObject();
                    applicationFacade.deleteContract(contractSelected.getContractIdentifier());
                    RequestCycle rc = RequestCycle.get();
                    rc.setResponsePage(HomePage.class);
                }
            });
        }
    }

    @Override
    protected List<IColumn<Contract>> getColumns() {
        List<IColumn<Contract>> columns = super.getColumns();
        // column for "detail" and "delete" link
        columns.add(new AbstractColumn<Contract>(new Model<String>("Edits"))
                {
                    public void populateItem(Item<ICellPopulator<Contract>> cellItem, String componentId,
                        IModel<Contract> model)
                    {
                        cellItem.add(new ActionPanel(componentId, model));
                    }
                });
        return columns;
    }
}

HTML обоих классов одинаков за исключением идентификатора калитки, который равен dt_basecontract_list и dt_contract_list.

Откуда эта ошибка?

1 Ответ

0 голосов
/ 03 июля 2011

Вот пример для вас:

BaseDataTable.java:

private DataTable<T> table;
private SortableDataProvider<T> provider;

public BaseDataTable(String id, IModel model){
super(id, model);
provider = new ....;
table = new DataTable<T>("datatable", getColumns(), provider, rowsPerPage);
add(table);
}

protected IColumn<T>[] getColumns(){
return new IColumn[]{
new PropertyColumn<Account>(new StringResourceModel("id",
                        null), null, "id"),
new PropertyColumn<Account>(new StringResourceModel("name",
                        null), null, "name"),
new PropertyColumn<Account>(new StringResourceModel("color",
                        null), null, "color")
}
}

В других таблицах, расширяющих BaseDataTable, необходимо переопределить метод getColumns () и вызвать super.getColumns () в первой строке переопределенного метода.

Надеюсь, я помог!

...