Поработав некоторое время с JavaFX (Java8), я нашел очень полезной концепцию Properties, позволяющую использовать переменные, совместимые с bean-компонентами, для привязки к обновлениям с использованием дерева вычислений, например:
class Person {
StringProperty name;
...
}
Person owner;
Person human;
owner.name().bind(human.name());
Это позволяет привязать элементы управления GUI к "модели", чтобы автоматически обновляться при изменении.
Поэтому я также начал использовать класс Property<T>
в модели (мои объекты данных я выполняю своими функциональными операциями). Но JavaFX - это однопоточная реализация GUI, и установка такого свойства, связанного с некоторыми элементами управления GUI, допускается только в том случае, если это выполняется в потоке JavaFX. В противном случае будет выдано исключение:
Exception in thread "Thread-5" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-5
Если я сейчас начну писать многопоточный код, я, наконец, не смогу использовать эти свойства, даже если бы захотел. Я не могу позволить себе инкапсулировать каждое изменение в вызове Platform.runLater()
чтобы передать его потоку JavaFX.
Почему JavaFX не обеспечивает поточно-привязанную привязку свойств? (Или это?)