是否在没有面板的情况下修改Wicket FormComponent标记?

是否在没有面板的情况下修改Wicket FormComponent标记?,wicket,Wicket,在Wicket中,我想对TextField表单组件进行子类化,以便在标记周围添加额外的标记 我不想创建面板的原因: 1) 我希望网页设计器使用输入标记: 2) 我不希望子类丢失Java中的FormField语义,例如: field.setRequired(true),等等 我可以用Java硬编码包装标记。但我希望它的行为类似于Java中的FormField 有什么想法吗?环顾四周寻找例子,但在这一点上遇到了难题 编辑: 我知道边界,但我的问题是必须在标记和Java中添加边界。例如: <d

在Wicket中,我想对TextField表单组件进行子类化,以便在标记周围添加额外的标记

我不想创建面板的原因:

1) 我希望网页设计器使用输入标记:

2) 我不希望子类丢失Java中的FormField语义,例如:
field.setRequired(true),等等

我可以用Java硬编码包装标记。但我希望它的行为类似于Java中的FormField

有什么想法吗?环顾四周寻找例子,但在这一点上遇到了难题

编辑: 我知道边界,但我的问题是必须在标记和Java中添加边界。例如:

<div wicket:id="border">
<input type="text" wicket:id="field"/>
</div>

--

FormComponent字段=新文本字段(“字段”,新模型(1));
字段。setRequired(true);
边界边界=新的MyBorder(“边界”);
边框。添加(字段);
表格。添加(边框);

这使得网页设计者必须注意特殊的标记,并且Java不能被封装(作为FormField子类)。

如果需要深入研究组件的呈现方式

MarkupContainer#onRender()
他是你的朋友

例如:

AbstractTree#onRender()

mf

您甚至不需要对TextField进行子类化。尽管如果您想重用它,这样做可能更容易。如果您只想在原始标记之外添加标记,这是一个海报用例。

啊,这就是我通过IBehavior想要的:

我的包装行为(对Scala语法感到抱歉):

原始标记:

<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.启动我的思维:-)

请查看我的编辑,我尝试了边框,但不符合我的需要(假设我正确使用了边框)。是的。行为是你需要的。使用beforeRender()和afterRender()的更简单行为可以满足您的需要。@martin-g:当通过调用AjaxRequestTarget.add更新formComponent时,这不会导致重复(和嵌套)标记(之前和之后)吗?@AnthonyWebster为此,您可以使用org.apache.wicket.ajax.IAjaxRegionMarkupIdProvider。看看它的javadoc。@martin-g:太棒了!你(一如既往)是个救命恩人,马丁!我想问一下,为什么设计师不应该知道特殊的标记?已经有一段时间了,但基本上设计师只处理wicket:id属性,而不必为了wicket的缘故担心以特定的方式嵌套块。
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>