我正在使用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"));
}
});
答案 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构造就可以减少工作量。