【问题标题】:Parameterizing strings in a model not working在模型中参数化字符串不起作用
【发布时间】:2021-05-10 18:24:37
【问题描述】:

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

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.

我尝试实现solution,但contact.getName() 产生错误。我的理解是 personModel.getObject() 会给我实际的对象(它定义了 getter getName)所以不知道为什么这会产生错误。

【问题讨论】:

  • 究竟是什么错误? TallModelShortModel 是什么?它们之前没有定义,看起来像带有静态方法的类。
  • @martin-g 我修改了这个问题。很抱歉造成混乱。

标签: java wicket


【解决方案1】:

MessageFormat 使用索引参数,因此您可能在这里混淆了一些技术。

这是使用带有名称参数的 Wicket 资源消息的最简单解决方案:

return getString(isTall ? "Tall.Label" : "Short.Label", personModel)

【讨论】:

  • 谢谢,这行得通。当下拉列表(stackoverflow.com/questions/67452003/…)未选中时;但是,$name 显示在显示的文本中 (${name} is tall)。我应该处理这个案子吗?
  • 好吧,如果没有选择,这个人就是空的。我不知道在这种情况下您要显示什么,例如您可以覆盖 #onConfigure 和 #setVisible(false)。
【解决方案2】:

我设法让它工作:

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()),因此不得不创建另一个类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多