Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 显示属性项名称而不是id_Java_Combobox_Vaadin7 - Fatal编程技术网

Java 显示属性项名称而不是id

Java 显示属性项名称而不是id,java,combobox,vaadin7,Java,Combobox,Vaadin7,我的布局包含多个组件(4个文本字段和2个组合框)。 这是如何定义的: private ManufacturerRepository manRepo; InteriorDoor interiorDoor; Manufacturer manufacturer; ComponentHelper componentHelper; @PropertyId("width") private TextField widthField; @PropertyId("height") private Tex

我的布局包含多个组件(4个文本字段和2个组合框)。 这是如何定义的:

private ManufacturerRepository manRepo;
InteriorDoor interiorDoor;

Manufacturer manufacturer;

ComponentHelper componentHelper;

@PropertyId("width")
private TextField widthField;

@PropertyId("height")
private TextField heightField;

@PropertyId("thickness")
private TextField thicknessField;

@PropertyId("modelName")
private TextField modelName;

@PropertyId("hasGlass")
private ComboBox glassCombo;

@PropertyId("manufacturerId")
private ComboBox manCombo;

private BeanItemContainer<Manufacturer> beanItemContainer;
不要介意glassCombo,因为它有恒定的数据,绑定在那里工作得很好

以下是我绑定字段的方式:

// binding data to fields
    BeanFieldGroup binder = new BeanFieldGroup<>(InteriorDoor.class);
    binder.setItemDataSource(interiorDoor);
    binder.setBuffered(false);
    binder.bindMemberFields(this);

您可以实现转换器制造商->长,并在组合框上进行设置

manCombo.setConverter(new Converter<Object, Long>() {
        @Override
        public Long convertToModel(Object value, Class<? extends Long> targetType, Locale locale) throws ConversionException {
            if (value == null) {
                return null;
            }
            return ((Manifacturer)value).getId();
        }

        @Override
        public Object convertToPresentation(Long value, Class<?> targetType, Locale locale) throws ConversionException {
            if (value == null) {
                return null;
            }
            return beanItemContainer.getItemIds().stream().filter( m -> value.equals(m.getId()))
                .findFirst().orElse(null);
        }
        ...
});
manCombo.setConverter(新转换器(){
@凌驾
公共长convertToModel(对象值、类targetType、区域设置)引发ConversionException{
如果(值==null){
返回null;
}
返回beanItemContainer.getItemId().stream().filter(m->value.equals(m.getId()))
.findFirst().orElse(null);
}
...
});

它不工作真奇怪。我试过了,很好。从stacktrace看,转换器中的getModelType似乎返回null。你能发布你的转换器代码吗?它看起来和你发布的一模一样。我尝试了多种选择。您确定只需要两个重写方法而不是四个吗?对不起,编辑了我的答案。所有方法都必须实现,我在示例代码`@Override public Class getModelType(){return Long.Class;}@Override public Class getPresentationType(){return Object.Class;}`中遗漏了它们。`Yes!终于成功了!我欠你一杯啤酒!是否可以将其解耦,以便我可以轻松地将其称为
manCombo.setConverter(新的myConverter())
?Atm由于BeanItemContainer的原因,不可能做到这一点。。
manCombo.setConverter(new Converter<Object, Long>() {
        @Override
        public Long convertToModel(Object value, Class<? extends Long> targetType, Locale locale)
                throws ConversionException {
            if (value == null) {
                return null;
            }
            return ((Manufacturer)value).getId();
        }

        @Override
        public Object convertToPresentation(Long value, Class<?> targetType, Locale locale)
                throws ConversionException {
            if (value == null) {
                return null;
            }
            return beanItemContainer.getItemIds().stream().filter( m -> value.equals(m.getId()))
                    .findFirst().orElse(null);
        }

        @Override
        public Class<Long> getModelType() {
            return null;
        }

        @Override
        public Class<Object> getPresentationType() {
            return null;
        }
    });
manCombo.setConverter(new Converter<Object, Long>() {
        @Override
        public Long convertToModel(Object value, Class<? extends Long> targetType, Locale locale) throws ConversionException {
            if (value == null) {
                return null;
            }
            return ((Manifacturer)value).getId();
        }

        @Override
        public Object convertToPresentation(Long value, Class<?> targetType, Locale locale) throws ConversionException {
            if (value == null) {
                return null;
            }
            return beanItemContainer.getItemIds().stream().filter( m -> value.equals(m.getId()))
                .findFirst().orElse(null);
        }
        ...
});