Можем ли мы расширить 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
.
Откуда эта ошибка?