如何使用 OpenCSV 将 csv 导入 FX SimpleObjectProperties?

How to import a csv with OpenCSV to FX SimpleObjectProperties?

对于一项学校作业,我需要将 CSV 解析为 Bean,稍后将其呈现在 JavaFX GUI 中。我决定使用库 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 失败)。 非常感谢任何帮助,谢谢!!

没有简单的方法解决这个问题。

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

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

或者您可以将属性添加到 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(使用属性而不是简单类型),反之亦然。

查看文档,您似乎可以为每种类型的 属性 创建 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 来创建