【问题标题】:How to import a csv with OpenCSV to FX SimpleObjectProperties?如何使用 OpenCSV 将 csv 导入 FX SimpleObjectProperties?
【发布时间】:2019-04-30 14:23:08
【问题描述】:

对于学校作业,我需要将 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 的转换失败)。 非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: java csv parsing javafx opencsv


    【解决方案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 来创建

    【讨论】:

    • 感谢您的帮助。但是从 AbstractCsvConverter 扩展而来,它需要是 AbstractBeanField。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多