Как импортировать CSV с OpenCSV в FX SimpleObjectProperties? - PullRequest
1 голос
/ 30 апреля 2019

Для школьного задания мне нужно проанализировать CSV в Bean-компоненте и представить его позже в графическом интерфейсе JavaFX. Я решил использовать библиотеку 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 ]

1 голос
/ 30 апреля 2019

Глядя на документацию, похоже, что вы можете создавать 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), где вы можете фактически использовать бин для создания

0 голосов
/ 30 апреля 2019

Нет простого способа обойти это.

Вы сохраняете свой Телефон a 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 (со свойствами вместо простых типов) и наоборот.

...