Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (3)

Лучшие ответы пользователя

Все ответы (3)
  • Как использовать обычные классы в JavaFx приложении?

    rzoner
    @rzoner
    Добрый день,

    Если Вам достаточно отобразить на UI какие-то модельки, то можно обойтись без биндингов: setText на Label/TextField/etc.
    Если Вам нужно создавать/редактировать модельки, то у Вас все равно будет Controller/Presenter/ViewModel (Вы же не будете это делать в setOnAction(e -> {}) ).
    В Controller/Presenter/ViewModel Вы можете создать свойства-обертки, используя:
    1) JavaBeanStringPropertyBuilder (самый простой способ, но имя поля модельки хардкодится строкой).
    2) BeanPathAdapter из jfxtras (более продвинутый вариант, но имя опять таки хардкодится).
    3) Создать кучу SimpleFooBarProperty и заполнять их данными из модельки.
    4) Создать кучу SimpleFooBarProperty, переопределив методы get/set:

    private ObjectProperty date = new SimpleObjectProperty() {

    @Override
    public Date get() {
    return model.getReservationDate();
    }

    @Override
    public void set(Date newValue) {
    if (model.getReservationDate() != null && model.getReservationDate().equals(newValue)) return;
    model.setReservationDate(newValue);
    fireValueChangedEvent();
    }
    };

    При этом моделька хранится в Controller/Presenter/ViewModel и можно добавить метод setModel(), который будет заменять модельку.
    Единственная проблема -- после вызове setModel() свойства не уведомят подписанные на них контролы, что произошло измнение. Для этого нужно вызвать метод fireValueChangedEvent, который protected, к сожалению.
    Обойти эту проблему можно следующим образом:
    1) Добавляем блок инициализации в переопределенное свойство:
    { allNotifiers.add(this::fireValueChangedEvent); }
    2) В Controller/Presenter/ViewModel создаем
    protected List allNotifiers = new ArrayList<>();
    public void raiseAllPropertiesUpdate() {
    allNotifiers.stream.forEach(Runnable::run);
    }
    3) В методе setModel() добавляем вызов raiseAllPropertiesUpdate().
    Теперь при подмене модели каждое проперти уведомит подписанные на него проперти/контроллы об изменении.
    Ответ написан
    Комментировать