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

pra*_*pes 3 java wicket

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

Xav*_*ica 8

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

  • 从中获取模型对象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)

作为旁注,如果enableddisabled是要在页面中显示的文字,您可能有兴趣在xml资源文件中本地化它们,getString()而是使用它.


Nic*_*tar 5

除了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.