如何使用 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 来创建
对于一项学校作业,我需要将 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 来创建