如何将带有OpenCSV的csv导入到FX SimpleObjectProperties?

时间:2019-04-30 14:23:08

标签: java csv parsing javafx opencsv

对于学校作业,我需要将CSV解析为Bean并稍后在JavaFX GUI中呈现。我决定使用Library opencsv,它运行良好。

但是现在,我想将属性直接解析为SimpleObjectProperties。我怎么做?不幸的是,我找不到任何进一步的信息。

代码如下:

public class Phone {

@CsvBindByName(column = "ENTITY_ID")
private SimpleIntegerProperty entityId;

@CsvBindByName(column = "OPERATING_COMPANY")
private SimpleStringProperty operatingCompany;

运行代码时,我得到一个CsvDataTypeMismatchException (将1006转换为javafx.beans.property.SimpleIntegerProperty失败)。 非常感谢任何帮助,谢谢!!

2 个答案:

答案 0 :(得分:1)

看一下文档,您似乎可以为每种类型的属性创建CustomConverts。他们在文档页面上的示例,这是IntegerPropertyConverter的开始。

public class IntegerPropertyConverter extends AbstractCsvConverter {

   @Override
   public Object convert(String value) {
       return new SimpleIntegerProperty(Integer.parseInt(value));
   }

   @Override
   public String convertToWrite(Object value) {
       IntegerProprety prop = (IntegerProperty) value;
       return String.format("%d", prop.get());
   }

 }

然后您将使用:

@CsvCustomBindByName(column = "ENTITY_ID", converter = IntegerPropertyConverter.class)
private SimpleIntegerProperty entityId;

如果您需要使用更长的格式来创建属性,则需要覆盖AbstractBeanField中的其他方法,例如public final void setFieldValue(T bean, String value, String header),在这里您可以实际使用Bean创建

答案 1 :(得分:0)

这没有简单的方法。

您将 Phone 保留为 POJO ,并将整个对象映射为属性

private SimpleObjectProperty<Phone> phone = new SimpleObjectProperty<Phone>();

或者您可以将属性添加到电话

public class Phone {

    @CsvBindByName(column = "ENTITY_ID")
    private Integer entityId;

    private final SimpleIntegerProperty entityIdProperty;

    public Phone() {
        entityIdProperty = new SimpleIntegerProperty();
        entityIdProperty.addListener((o, oldValue,newValue)->{
            entityId = newValue.intValue();
        });
    }

    public Integer getEntityId() {
        return entityId;
    }

    public void setEntityId(Integer entityId) {
        this.entityId = entityId;
        entityIdProperty.set(entityId);
    }

    public SimpleIntegerProperty getEntityIdProperty() {
        return entityIdProperty;
    }


    // ...
}

如果不需要此对象具有双向绑定,则可以跳过侦听器。

还有其他可能性,例如让方法和构造函数从Phone转换为PhoneFX(具有属性而不是简单类型),反之亦然。