我试图参数化一个字符串,并将该字符串设置为模型的结果:
SomePanel.java
public SomePanel( String id, IModel<Person> personModel)
{
tallLabel = new Label( "height", new LoadableDetachableModel() {
pubic String load() {
Person person = personModel.getObject();
boolean isTall = apiCallToCheckIfTall( person );
// 'name' is a property on PersonModel
String name = person.getName();
String tallString = MessageFormat.format(getString("Tall.Label"), name );
String shortString = MessageFormat.format(getString("Short.Label"), name );
return isTall ? tallString : shortString;
}
});
add(tallLabel);
}
文本属性
Tall.Label = ${name} is tall.
Short.Label = ${name} is short.
我尝试实现一个解决方案,但contact.getName()
产生了一个错误。我的理解是personModel.getObject()
会给我实际的对象(它定义了gettergetName
(,所以不确定为什么会产生错误。
MessageFormat使用索引参数,因此您可能混淆了一些技术。
以下是使用Wicket的带有名称参数的资源消息的最简单解决方案:
return getString(isTall ? "Tall.Label" : "Short.Label", personModel)
我设法让它与一起工作
SomePanel.java
public SomePanel( String id, IModel<Person> personModel)
{
tallLabel = new Label( "height", new LoadableDetachableModel() {
public String load() {
Person person = personModel.getObject();
boolean isTall = apiCallToCheckIfTall( person );
PersonGetter getter = new PersonGetter ( personModel );
String name = getter.getName();
String RTStringModel = MessageFormat.format( getString("Tall.Label"), person.getName() );
String StringModel = MessageFormat.format( getString("Short.Label"), person.getName() );
return isTall ? RTStringModel : StringModel;
}
});
add(tallLabel);
}
...
private class NameGetter implements Serializable
{
private final IModel<Person> model;
public NameGetter( final IModel<Person> personModel )
{
this.model = person;
}
public String getName()
{
return getFormattedLegalName( this.model.getObject() );
}
}
public static final String getFormattedLegalName( Person person )
{
if ( person == null )
{
return "";
}
else
{
return person.getName();
}
}
文本属性
Tall.Label = {0} is tall.
Short.Label = {0} is short.
不过,这似乎有点太多了,无法从模型中提取值。我无法直接从personModel
(例如personModel.getObject().getName()
(中获得名称,因此不得不创建另一个类。