Wicket:包含Panel的参考模型的组件

时间:2012-01-11 16:04:49

标签: java wicket

为了说明我的问题,假设我有一个Thing实例,它有两个文本属性 - 'foo'和'bar'。

我想创建一个Panel来编辑Thing的实例。该面板有两个TextField组件,一个用于'foo'属性,另一个用于'bar'属性。

我希望能够使用setDefaultModel()的实例在我的Panel上调用IModel<Thing>,并且TextField组件可以引用此模型。如何最好地实现这一目标?

我是否应该覆盖Panel.setDefaultModel()方法以在两个TextField组件上调用setModel()?或者也许为TextField组件创建匿名的ReadOnlyModels,重写getObject()方法以从包含Panel的模型中检索对象?

这些对我来说都不是很优雅,所以我想知道是否有更好的方法?

3 个答案:

答案 0 :(得分:3)

您可以使用PropertyModel作为textFields。将IModel<Thing>传递给PropertyModel的构造函数,其中foo作为属性名称:

add(new TextField("fooFieldId", new PropertyModel(thingModel, "foo")));

PropertyModel会发现thingModel是Model并且调用getObject().getFoo()等。

这假定IModel<Thing>实例没有改变,只有可以改变的底层对象调用setDefaultModelObject

答案 1 :(得分:0)

也许我只是忽略了这一点,但我在1.41.5的JavaDocs中找不到Panel.setModel()。如果你实现了它可能你可以改变它而不是替换模型对象而是调用model.setObject()而不是?

免责声明:现在无法真正检查,导致工作中没有检票口,而且我的家用机器早些时候出现了视频卡故障......

答案 2 :(得分:0)

也许这会有所帮助?

public abstract class AbstractWrapModel<T> extends Object implements IWrapModel<T>

IWrapModel对象的简单基类。

请参阅IComponentAssignedModel或IComponentInheritedModel,以便在包装器中不使用时不必使用detach或setObject()等空方法。 detach方法调用包装的模型分离。