Java 参数化模型中的字符串不起作用

Java 参数化模型中的字符串不起作用,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

我正在尝试参数化字符串,并将该字符串设置为模型的结果:

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();
    }
}

我尝试实现了一个contact.getName()但产生了一个错误。我的理解是
personModel.getObject()
会给我实际的对象(定义了getter
getName
),所以不确定这会产生错误的原因。

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)。