对于学校作业,我需要将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失败)。 非常感谢任何帮助,谢谢!!
答案 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(具有属性而不是简单类型),反之亦然。