我正在使用CompoundPropertyModel(通过PropertyListView)来打印对象(User)的属性.
User对象的一个属性是布尔值.我希望使用自定义转换来呈现布尔值(false - >"disabled",true - >"enabled").
如何在不向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"));
}
});
Run Code Online (Sandbox Code Playgroud)
有几种方法可以实现这一目标:
从中获取模型对象item
,并使用if-else
.
User user = item.getModelObject();
item.add(new Label("active", user.isActive() ? "enabled" : "disabled"));
Run Code Online (Sandbox Code Playgroud)实现IConverter
并在其convertToString()
方法中返回所需的值.以覆盖getConverter()
方法的方式返回转换器的实例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;
}
}
}
};
Run Code Online (Sandbox Code Playgroud)使用a 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; }
}
}));
Run Code Online (Sandbox Code Playgroud)作为旁注,如果enabled
和disabled
是要在页面中显示的文字,您可能有兴趣在xml资源文件中本地化它们,getString()
而是使用它.
除了XaviLópez提到的方法之外,还有另外一种方法,当您计划本地化您的应用程序时,可能更可取.您可以使用StringresourceModel之类的
add(new Label("active",
new StringResourceModel("active.${active}",
new Model<String> item.getModel().getActive().toString())));
Run Code Online (Sandbox Code Playgroud)
并定义一个resource.file(我更喜欢XML),定义active.true = enabled和active.falsee = disabled.