Java CompoundPropertyModel-在渲染之前转换布尔值
我正在使用CompoundPropertyModel(通过PropertyListView)打印对象(用户)的属性 用户对象的属性之一是布尔值。我希望使用自定义转换(false->“disabled”,true->“enabled”)呈现布尔值 如何在不向用户对象添加新方法的情况下实现这一点 添加(新的PropertyListView(“用户”,新的LoadableUsersModel()){ @凌驾 受保护的void populateItem(列表项){ 添加(新标签(“名字”)); 添加(新标签(“姓氏”); 添加(新标签(“用户名”)); 添加(新标签(“电子邮件”)); 添加(新标签(“活动”)); } }); 您可以使用一个。(参见另一个示例(中间的某个地方))。Java CompoundPropertyModel-在渲染之前转换布尔值,java,wicket,Java,Wicket,我正在使用CompoundPropertyModel(通过PropertyListView)打印对象(用户)的属性 用户对象的属性之一是布尔值。我希望使用自定义转换(false->“disabled”,true->“enabled”)呈现布尔值 如何在不向用户对象添加新方法的情况下实现这一点 添加(新的PropertyListView(“用户”,新的LoadableUsersModel()){ @凌驾 受保护的void populateItem(列表项){ 添加(新标签(“名字”)); 添加(新
但在这种情况下,使用简单的if/else构造似乎会减少工作量。有几种方法可以实现这一点:
- 从
中获取模型对象,并使用项
if-else
User user = item.getModelObject(); item.add(new Label("active", user.isActive() ? "enabled" : "disabled"));
- 实现一个
并在其IConverter
方法中返回所需的值。在convertToString()
的标签
方法的重写中返回转换器的实例。在本例中,所有的都是匿名类,最好将它们定义为独立类,至少是转换器,并使用静态方法仅使用单个实例getConverter()
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
和disabled
是要在页面中显示的文本,您可能会对在xml资源文件中本地化它们感兴趣,并使用getString()
。除了哈维·洛佩兹提到的方法之外,还有另一种方法,当您计划本地化应用程序时,可能更可取。你可以用一个类似的
add(新标签(“活动”),
新的StringResourceModel(“active.${active}”,
新模型项.getModel().getActive().toString());
并定义一个resource.file(我更喜欢XML),定义active.true=enabled和active.false=disabled。非常全面的答案。非常感谢。
add(new Label("active",
new StringResourceModel("active.${active}",
new Model<String> item.getModel().getActive().toString())));