修改Wicket FormComponent标记没有面板?

时间:2011-07-26 09:07:43

标签: wicket

在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子类)。

3 个答案:

答案 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