您可以覆盖MarkupContainer#add(Behavior... behaviors)
包装组件的方法。这当然意味着包装组件永远不会收到任何行为:
public class MyWrappingComponent extends Panel {
private TextField<?> field;
// Constructors and stuff..
@Override
public Component add(Behavior... behaviors) {
field.add(behaviors);
return this;
}
}
一种选择是将包装组件分离为 a Border
,它可用于用内容包围组件。然而,这会降低包装元件的“透明度”。(参见Javadoc 页面上的示例)。
public class MyWrappingBorder extends Border {
public MyWrappingBorder(String id) {
// add the <img />
// add the <div />
}
...
}
// The markup
<wicket:border>
<div>
<img />
<wicket:body /> <!-- Will be replaced with the added content -->
</div>
</wicket:border>
然后像这样使用它:
add(new MyWrappingBorder("border")
.add(new TextField<String>("input").add(/* the behaviors */)));
有了这种标记
<div wicket:id="border">
<input type="text" wicket:id="input" />
</div>
该Border
方法将使您能够重用没有“TextField”的边框组件?零件。例如,如果你想添加一个下拉菜单:
add(new MyWrappingBorder("border")
.add(new DropDownChoice<String>("input", listOfChoices)));