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




Нет простого способа обойти это.
Вы сохраняете Телефон как ПОЖО и сопоставляете весь объект как свойство
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.