首页 > 解决方案 > 在 Vaadin 中绑定 TwinColSelect

问题描述

如何在 Vaadin 中将实体绑定到 TwinColSelect?我可以为简单的组件(TextField、ComboBox)做到这一点,但我不知道如何为 TwinColSelect 组件做到这一点。我在注释行收到编译问题。ExampleEntity 中的 SelectedString 属性应包含 TwinColSelect 中的所有选定元素。

import com.vaadin.data.Binder;
import com.vaadin.navigator.View;
import com.vaadin.spring.annotation.SpringView;
import com.vaadin.ui.TwinColSelect;
import com.vaadin.ui.VerticalLayout;

import java.util.ArrayList;
import java.util.List;

@SpringView(name = "example")
public class Example extends VerticalLayout implements View {
    public Example() {
        List<String> list = new ArrayList<>();
        list.add("item1");
        list.add("item2");
        ExampleEntity entity = new ExampleEntity();

        Binder<ExampleEntity> binder = new Binder<>(ExampleEntity.class);
        TwinColSelect<String> twinColSelect = new TwinColSelect<>("strings");
        twinColSelect.setItems(list);
        twinColSelect.setRows(twinColSelect.getRows());

//        binder.bind(twinColSelect, ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings); //TODO ?
        binder.readBean(entity);

        addComponent(twinColSelect);
    }

    private class ExampleEntity {
        private List<String> selectedStrings;

        public List<String> getSelectedStrings() {
            return selectedStrings;
        }
        public void setSelectedStrings(List<String> selectedStrings) {
            this.selectedStrings = selectedStrings;
        }
    }
}

标签: javavaadin

解决方案


绑定binder总是基于setValue目标组件的方法类型。对于TwinColSelect<String>,值类型是Set<String>。为了能够将它绑定到 type 的 bean 属性List<String>,您需要提供一个在 and 之间转换的转换ListSet

要设置转换器,您可以像这样进行绑定:

binder.forField(twinColSelect) .<List<String>> withConverter(ArrayList::new, HashSet::new) .bind(ExampleEntity::getSelectedStrings, ExampleEntity::setSelectedStrings);

请注意,在这种情况下,您需要为withConverter方法定义泛型类型,否则编译器将要求定义 getter 以返回ArrayList<String>而不是更通用的List<String>.


推荐阅读