Как импортировать csv с OpenCSV в FX SimpleObjectProperties?

Для школьного задания мне нужно преобразовать 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 не удалось). Любая помощь высоко ценится, спасибо!!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
537
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы сохраняете Телефон как ПОЖО и сопоставляете весь объект как свойство

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;
    }


    // ...
}

Если вам не нужно, чтобы этот объект имел двунаправленную привязку, вы можете пропустить прослушиватель.

Существуют и другие возможности, такие как наличие методов и конструкторов для преобразования телефона в 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-компонент для создания

Спасибо, что помогло. Но вместо расширения от AbstractCsvConverter он должен быть AbstractBeanField.

Remo 02.05.2019 23:21

Другие вопросы по теме