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

Java CompoundPropertyModel-在渲染之前转换布尔值,java,wicket,Java,Wicket,我正在使用CompoundPropertyModel(通过PropertyListView)打印对象(用户)的属性 用户对象的属性之一是布尔值。我希望使用自定义转换(false->“disabled”,true->“enabled”)呈现布尔值 如何在不向用户对象添加新方法的情况下实现这一点 添加(新的PropertyListView(“用户”,新的LoadableUsersModel()){ @凌驾 受保护的void populateItem(列表项){ 添加(新标签(“名字”)); 添加(新

我正在使用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())));