CompoundPropertyModel - 在渲染之前转换布尔值

时间:2011-11-03 14:53:10

标签: java wicket

我正在使用CompoundPropertyModel(通过PropertyListView)来打印对象(User)的属性。

User对象的一个​​属性是布尔值。我希望使用自定义转换渲染布尔值(false - >“禁用”,true - >“启用”)。

如何在不向User对象添加新方法的情况下实现此目的?

add(new PropertyListView<User>("users", new LoadableUsersModel()) {
    @Override
    protected void populateItem(ListItem<User> item) {
        item.add(new Label("firstname"));
        item.add(new Label("surname"));
        item.add(new Label("username"));
        item.add(new Label("email"));
        item.add(new Label("active"));
    }
});

3 个答案:

答案 0 :(得分:8)

有几种方法可以实现这一目标:

  • item获取您的模型对象,并使用if-else

     
    User user = item.getModelObject();
    item.add(new Label("active", user.isActive() ? "enabled" : "disabled"));
  • 实施IConverter并在其convertToString()方法中返回所需的值。以覆盖getConverter()的{​​{1}}方法返回转换器的实例。在这个例子中,它是所有匿名类,最好将它们定义为独立类,至少是转换器,并且只有一个静态方法才能使用单个实例。

    Label
  • 使用item.add(new Label("active"){ public IConverter getConverter(Class type){ return new IConverter(){ public String convertToString(Object value, Locale locale){ if (Boolean.TRUE.equals(value) { return "enabled"; } else if (Boolean.FALSE.equals(value) { return "disabled"; } else { return null; } } public Object convertToObject(String value, Locale locale){ // Not needed, only used by FormComponents return null; } } } };返回所需的值,使用AbstractReadOnlyModel属性或带有它的模型:

    active

作为旁注,如果PropertyModel pm = new PropertyModel(item.getModel(), "active"); item.add(new Label("active", new AbstractReadOnlyModel(){ public Object getObject() { if (Boolean.TRUE.equals(pm.getObject()) { return "enabled"; } else if (Boolean.FALSE.equals(pm.getObject()) { return "disabled"; } else { return null; } } }));enabled是要在页面中显示的文字,您可能有兴趣在xml资源文件中本地化它们,并使用{{1}而不是。

答案 1 :(得分:5)

除了XaviLópez提到的方法之外,还有另一种方法,当您计划本地化您的应用程序时,可能更可取。您可以使用StringresourceModel之类的

add(new Label("active", 
        new StringResourceModel("active.${active}", 
        new Model<String> item.getModel().getActive().toString())));

并定义一个resource.file(我更喜欢XML),定义active.true = enabled和active.falsee = disabled。

答案 2 :(得分:1)

您可以使用custom converter。 (另请参阅here(中间某处))。 但似乎在这种情况下,使用简单的if / else构造就可以减少工作量。