在Wicket中,我想将TextField表单组件子类化,以在标记周围添加额外的标记。
为什么我不想创建一个Panel:
1)我希望网页设计师使用输入标签:
<input wicket:id="blah">
2)我不希望子类丢失Java中的FormField语义,例如:
field.setRequired(true);
等等。
我很好用Java编写包装标记。但是我希望它在Java中表现得像FormField。
有什么想法吗?看看周围的例子,但是难以接受这个例子
编辑: 我知道Borders,但我的问题是你必须在标记和Java中添加它们。例如:
<div wicket:id="border">
<input type="text" wicket:id="field"/>
</div>
-
FormComponent<Integer> field = new TextField<Integer>("field", new Model(1));
field.setRequired(true);
Border border = new MyBorder("border");
border.add(field);
form.add(border);
这使得网页设计者必须了解特殊标记,并且无法封装Java(作为FormField子类)。
答案 0 :(得分:3)
啊,这是我想通过IBehavior:
我的包装器行为(抱歉Scala语法):
class FieldWrapper extends AbstractTransformerBehavior {
def transform(component: Component, output: CharSequence): CharSequence = """
<div class="blah">
Blah blah blah
%s
</div>
""".format(output)
}
我的子类:
class MyField[T](id: String, model: IModel[T]) extends TextField[T](id, model) {
add(new FieldWrapper)
}
原始加价:
<input type="text" wicket:id="foobar"/>
生成的标记:
<div class="blah">
Blah blah blah
<input type="text" value="" name="foobar" xmlns:wicket="http://wicket.apache.org">
</div>
感谢S.O.开始我的想法: - )
答案 1 :(得分:2)
您甚至不需要继承TextField。虽然如果你想重用它可能会更容易。如果您只想在原始标记之外添加标记,那么它就是Border的海报用例。
答案 2 :(得分:0)
如果需要深入研究组件的渲染
MarkupContainer#onRender()
是你的朋友。
一个例子可能是:
AbstractTree#onRender()
MF