Java 参数化模型中的字符串不起作用
我正在尝试参数化字符串,并将该字符串设置为模型的结果: SomePanel.javaJava 参数化模型中的字符串不起作用,java,wicket,Java,Wicket,我正在尝试参数化字符串,并将该字符串设置为模型的结果: SomePanel.java public SomePanel( String id, IModel<Person> personModel) { tallLabel = new Label( "height", new LoadableDetachableModel() { pubic String load() { Person person = personModel.getOb
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);
}
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();
}
}
我尝试实现了一个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() {
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);
}
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();
}
}
不过,这似乎有点太多,无法从模型中提取值。我无法直接从
personModel
中获取名称(例如personModel.getObject().getName()
),而不得不创建另一个类,这是一个复杂的过程。到底是什么错误?什么是TallModel
和ShortModel
?它们在前面没有定义,看起来像是带有静态方法的类。@martin-g我修改了这个问题。抱歉搞混了。谢谢,这很有效。当下拉列表()未选中时;但是,$name
显示在显示的文本中(${name}高
)。我应该处理这个案子吗?如果没有选择,这个人是空的。我不知道在这种情况下要显示什么,例如,您可以覆盖#onConfigure和#setVisible(false)。